Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

80 строки
2.1KB

  1. (import medea)
  2. (import http-client)
  3. (import srfi-1)
  4. (import (chicken io))
  5. (import (chicken sort))
  6. (import srfi-13)
  7. (define (curry fn a)
  8. (lambda (b)
  9. (fn a b)))
  10. (define (perhaps fn a)
  11. (if a (fn a) a))
  12. (define (member? a ln)
  13. (if (member a ln) #t #f))
  14. (define (default b a)
  15. (if a a b))
  16. (define value
  17. (compose (curry perhaps cdr) assoc))
  18. (define (value-with-default k v ln)
  19. (default v (value k ln)))
  20. (define (has-key? k ln)
  21. (member? k (map car ln)))
  22. (define (sort-via less-than? fn ln)
  23. (sort ln (lambda (a b)
  24. (less-than? (fn a) (fn b)))))
  25. (define (display-newline str)
  26. (display str)
  27. (newline))
  28. (define (->string a)
  29. (cond ((string? a) a)
  30. ((symbol? a) (symbol->string a))
  31. ((number? a) (number->string a))
  32. ((char? a) (string a))))
  33. (define (format-assoc statement ln)
  34. (apply string-append
  35. (map (lambda (directive)
  36. (if (symbol? directive)
  37. (->string (value directive ln))
  38. directive)) statement)))
  39. (define (simple-json-request uri)
  40. (with-input-from-request uri #f read-json))
  41. (define parking-key
  42. (with-input-from-file "key-parking" read-line))
  43. (define (get-parking-lots)
  44. (let ((result (simple-json-request (string-append "http://parkering.linkoping.se/Parkeringsdata/ParkeringsdataV1.svc/GetParkeringsYtaList/" parking-key "/0"))))
  45. (value 'parkingareanewlist result)))
  46. (define (computerized? lot)
  47. (has-key? 'parkingspacesavailable lot))
  48. (define (only-has-handicap-spots? lot)
  49. (equal? '(4) (value 'parkingtypes lot)))
  50. (define (electric-car-lot? lot)
  51. (member? 3 (value 'parkingtypes lot)))
  52. (define (main)
  53. (json-parsers (append `((member . ,(lambda (k v)
  54. (cons (string->symbol (string-downcase k)) v)))
  55. (array . ,identity)) (json-parsers)))
  56. (display-newline "Parking spaces available:")
  57. (let ((lots (sort-via string-ci<? (curry value 'name) (get-parking-lots))))
  58. (map (compose display-newline (curry format-assoc '(name ": " parkingspacesavailable "/" parkingspaces)))
  59. (filter (conjoin computerized? (complement only-has-handicap-spots?)) lots))))
  60. (main)