Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

76 linhas
1.9KB

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