This commit is contained in:
2026-03-05 14:42:42 +01:00
parent 3b53a945f9
commit 4780a3dcb7
9 changed files with 382 additions and 76 deletions

View File

@@ -2,7 +2,12 @@
(require racket/string
racket/port
racket/contract
json
(prefix-in g: gregor)
(prefix-in g: gregor/time)
gregor-utils
racket-sprintf
)
(provide while
@@ -14,10 +19,19 @@
fromJson
mk-js-array
js-code
kv-1
kv-2
make-kv
kv?
list-of-kv?
list-of-symbol?
list-of?
string->time
time->string
string->date
date->string
string->datetime
datetime->string
)
(define-syntax while
@@ -108,6 +122,22 @@
(and (list? e) (= (length e) 2) (symbol? (car e)))
(and (pair? e) (symbol? (car e)))))
(define/contract (kv-1 e)
(-> kv? symbol?)
(car e))
(define/contract (kv-2 e)
(-> kv? any/c)
(if (list? e)
(cadr e)
(cdr e)))
(define/contract (make-kv k v)
(-> symbol? any/c kv?)
(if (list? v)
(list k v)
(cons k v)))
(define (list-of? pred? l)
(define (all-pred? l)
(if (null? l)
@@ -124,4 +154,44 @@
(define (list-of-symbol? l)
(list-of? symbol? l))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Date / Time conversion
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (string->time s)
(with-handlers ([exn:fail?
(λ (e) (g:parse-time s "HH:mm"))])
(g:parse-time s "HH:mm:ss")))
(define (time->string t)
(unless (or (g:time? t) (g:datetime? t) (g:moment? t))
(error "set! - gregor time?, moment? or datetime? expected"))
(sprintf "%02d:%02d:%02d" (g:->hours t) (g:->minutes t) (g:->seconds t)))
(define (string->datetime s)
(with-handlers ([exn:fail?
(λ (e) (g:parse-moment s "yyyy-MM-dd'T'HH:mm:ss"))])
(g:parse-moment s "yyyy-MM-dd'T'HH:mm")))
(define (datetime->string dt)
(when (racket-date? dt)
(datetime->string date->moment dt))
(unless (or (g:datetime? dt) (g:moment? dt) (g:date? dt) (g:time? dt))
(error "set! - gregor time? , date?, datetime? or moment? expected"))
(sprintf "%04d:%02d:%02dT%02d:%02d:%02d"
(g:->year dt) (g:->month dt) (g:->day dt)
(g:->hours dt) (g:->minutes dt) (g:->seconds dt))
)
(define (string->date d)
(g:parse-date d "yyyy-MM-dd"))
(define (date->string d)
(when (racket-date? d)
(date->string (date->moment d)))
(unless (or (g:date? d) (g:moment? d) (g:datetime? d))
(error "set! - gregor date expected"))
(sprintf "%04d-%02d-%02d" (g:->year d) (g:->month d) (g:->day d)))