From e822f7b81245c919eda8bd8ad4b482df075e0508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 24 Jan 2020 20:21:41 +0100 Subject: Start of new date structures. --- module/srfi/srfi-19/alt/util.scm | 107 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 module/srfi/srfi-19/alt/util.scm (limited to 'module/srfi/srfi-19/alt/util.scm') diff --git a/module/srfi/srfi-19/alt/util.scm b/module/srfi/srfi-19/alt/util.scm new file mode 100644 index 00000000..9b394105 --- /dev/null +++ b/module/srfi/srfi-19/alt/util.scm @@ -0,0 +1,107 @@ +(define-module (srfi srfi-19 alt util) + :use-module (srfi srfi-19 alt) + :use-module (srfi srfi-1) + :use-module (srfi srfi-26) + :use-module (srfi srfi-41) + :use-module (util) + ) + +(define-public (start-of-month date) + (set (day date) 0)) + + +(define-public (parse-freeform-date str) + (let* (((year month day) (map string->number (string-split str #\-)))) + (date year: year month: month day: day) + )) + +(define-public (day-stream start-day) + (stream-iterate (cut date+ <> #0-0-1) + start-day)) + +(define (as-date date/-time) + (if (date? date/-time) + date/-time + (get-date date/-time))) + +(define (as-time date/-time) + (if (datetime? date/-time) + (get-time date/-time) + #00:00:00)) + +(define-public (date/-time< a b) + (if (date< (as-date a) (as-date b)) + #t + (time< (as-time a) (as-time b)))) + +(define-public date/-timestring date optional: (fmt "~Y-~m-~d")) + (with-output-to-string + (lambda () + (fold (lambda (token state) + (case state + ((#\~) + (case token + ((#\~) (display "~")) + ((#\Y) (format #t "~4'0d" (year date))) + ((#\m) (format #t "~2'0d" (month date))) + ((#\d) (format #t "~2'0d" (day date))) + (else (error "Invalid format token ~a" token))) + #f) + (else (unless (char=? #\~ token) (display token)) token))) + #f + (string->list fmt))))) + +(define*-public (time->string time optional: (fmt "~H:~M:~S")) + (with-output-to-string + (lambda () + (fold (lambda (token state) + (case state + ((#\~) + (case token + ((#\~) (display "~")) + ((#\H) (format #t "~2'0d" (hour date))) + ((#\M) (format #t "~2'0d" (minute date))) + ((#\S) (format #t "~2'0d" (second date))) + (else (error "Invalid format token ~a" token))) + #f) + (else (unless (char=? #\~ token) (display token)) token))) + #f + (string->list fmt))))) + + +;; @verbatim +;; A B C D E ¬F +;; |s1| : |s2| : |s1| : |s2| : : |s1| +;; | | : | | : | ||s2| : |s1|| | : |s1||s2| : | | +;; | ||s2| : |s1|| | : | || | : | || | : | || | : +;; | | : | | : | || | : | || | : | || | : |s2| +;; | | : | | : | | : | | : : | | +;; @end verbatim +;; +;; E is covered by both case A and B. +(define-public (timespan-overlaps? s1-begin s1-end s2-begin s2-end) + "Return whetever or not two timespans overlap." + (or + ;; A + (and (date/-time