You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 line
2.2KB

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