2022-04-18 15:00:02 -04:00
|
|
|
(import medea)
|
|
|
|
(import http-client)
|
|
|
|
(import srfi-1)
|
|
|
|
(import (chicken io))
|
|
|
|
(import (chicken sort))
|
2022-04-18 16:30:07 -04:00
|
|
|
(import srfi-13)
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (curry fn a)
|
|
|
|
(lambda (b)
|
|
|
|
(fn a b)))
|
|
|
|
|
|
|
|
(define (perhaps fn a)
|
|
|
|
(if a (fn a) a))
|
|
|
|
|
|
|
|
(define (member? a ln)
|
|
|
|
(if (member a ln) #t #f))
|
|
|
|
|
|
|
|
(define (default b a)
|
|
|
|
(if a a b))
|
|
|
|
|
|
|
|
(define value
|
|
|
|
(compose (curry perhaps cdr) assoc))
|
|
|
|
|
|
|
|
(define (value-with-default k v ln)
|
|
|
|
(default v (value k ln)))
|
|
|
|
|
|
|
|
(define (has-key? k ln)
|
|
|
|
(member? k (map car ln)))
|
|
|
|
|
|
|
|
(define (sort-via less-than? fn ln)
|
|
|
|
(sort ln (lambda (a b)
|
2022-04-18 15:14:20 -04:00
|
|
|
(less-than? (fn a) (fn b)))))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (display-newline str)
|
|
|
|
(display str)
|
|
|
|
(newline))
|
|
|
|
|
|
|
|
(define (->string a)
|
|
|
|
(cond ((string? a) a)
|
2022-04-18 15:14:20 -04:00
|
|
|
((symbol? a) (symbol->string a))
|
|
|
|
((number? a) (number->string a))
|
|
|
|
((char? a) (string a))))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (format-assoc statement ln)
|
|
|
|
(apply string-append
|
2022-04-18 15:14:20 -04:00
|
|
|
(map (lambda (directive)
|
|
|
|
(if (symbol? directive)
|
|
|
|
(->string (value directive ln))
|
|
|
|
directive)) statement)))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (simple-json-request uri)
|
|
|
|
(with-input-from-request uri #f read-json))
|
|
|
|
|
|
|
|
(define parking-key
|
|
|
|
(with-input-from-file "key-parking" read-line))
|
|
|
|
|
|
|
|
(define (get-parking-lots)
|
|
|
|
(let ((result (simple-json-request (string-append "http://parkering.linkoping.se/Parkeringsdata/ParkeringsdataV1.svc/GetParkeringsYtaList/" parking-key "/0"))))
|
2022-04-18 16:30:07 -04:00
|
|
|
(value 'parkingareanewlist result)))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (computerized? lot)
|
2022-04-18 16:30:07 -04:00
|
|
|
(has-key? 'parkingspacesavailable lot))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (only-has-handicap-spots? lot)
|
2022-04-18 16:30:07 -04:00
|
|
|
(equal? '(4) (value 'parkingtypes lot)))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (electric-car-lot? lot)
|
2022-04-18 16:30:07 -04:00
|
|
|
(member? 3 (value 'parkingtypes lot)))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(define (main)
|
2022-04-18 16:30:07 -04:00
|
|
|
(json-parsers (append `((member . ,(lambda (k v)
|
|
|
|
(cons (string->symbol (string-downcase k)) v)))
|
|
|
|
(array . ,identity)) (json-parsers)))
|
2022-04-18 15:00:02 -04:00
|
|
|
(display-newline "Parking spaces available:")
|
2022-04-18 17:34:08 -04:00
|
|
|
(map (compose display-newline (curry format-assoc '(name ": " parkingspacesavailable "/" parkingspaces)))
|
|
|
|
(filter (conjoin computerized? (complement only-has-handicap-spots?))
|
|
|
|
(sort-via string-ci<? (curry value 'name) (get-parking-lots)))))
|
2022-04-18 15:00:02 -04:00
|
|
|
|
|
|
|
(main)
|