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.

92 linhas
2.4KB

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