diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2020-05-09 22:19:01 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2020-05-09 22:19:01 +0200 |
commit | f56daa40756cb4f356c283567de9cbc050bd86b1 (patch) | |
tree | 778a1bbada2a00acc854a85721f36618b6ce4f6b /module/datetime.scm | |
parent | Clean up util header. (diff) | |
parent | Add short commentary on difference between parse and parse/component. (diff) | |
download | calp-f56daa40756cb4f356c283567de9cbc050bd86b1.tar.gz calp-f56daa40756cb4f356c283567de9cbc050bd86b1.tar.xz |
Replace iCalendar parser.
The old iCalendar parser was a direct port of my C parser, which
unfortunately clashed with guile's evaluation model, and was therefore
really slow.
This new one is much schemier [sic?], and therefore much faster. On my
laptop the parse time went from around 10s to 2.5s, so a 4x speedup!
Diffstat (limited to '')
-rw-r--r-- | module/datetime.scm | 56 |
1 files changed, 23 insertions, 33 deletions
diff --git a/module/datetime.scm b/module/datetime.scm index 0cca216b..b2a3d38e 100644 --- a/module/datetime.scm +++ b/module/datetime.scm @@ -188,7 +188,7 @@ [else (error "Object not a date, time, or datetime object ~a" date/-time)])) (define-public (as-time date/-time) - (cond [(datetime? date/-time) (get-time% (get-datetime date/-time))] + (cond [(datetime? date/-time) (get-time% date/-time)] [(date? date/-time) (time)] [(time? date/-time) date/-time] [else (error "Object not a date, time, or datetime object ~a" date/-time)])) @@ -219,10 +219,8 @@ (= (second a) (second b)))) (define-public (datetime= a b) - (let ((a (get-datetime a)) - (b (get-datetime b))) - (and (date= (get-date a) (get-date b)) - (time= (get-time% a) (get-time% b))))) + (and (date= (get-date a) (get-date b)) + (time= (get-time% a) (get-time% b)))) (define-many define-public (date=?) date= @@ -276,18 +274,14 @@ (time< a b))) (define-public (datetime< a b) - (let ((a (get-datetime a)) - (b (get-datetime b))) - (if (date= (get-date a) (get-date b)) - (time< (get-time% a) (get-time% b)) - (date< (get-date a) (get-date b))))) + (if (date= (get-date a) (get-date b)) + (time< (get-time% a) (get-time% b)) + (date< (get-date a) (get-date b)))) (define-public (datetime<= a b) - (let ((a (get-datetime a)) - (b (get-datetime b))) - (if (date= (get-date a) (get-date b)) - (time<= (get-time% a) (get-time% b)) - (date<= (get-date a) (get-date b))))) + (if (date= (get-date a) (get-date b)) + (time<= (get-time% a) (get-time% b)) + (date<= (get-date a) (get-date b)))) (define-public (date/-time< a b) (datetime< (as-datetime a) (as-datetime b))) @@ -560,15 +554,13 @@ ;; NOTE that base is re-normalized, but change isn't. This is due to base ;; hopefully being a real date, but change just being a difference. (define-public (datetime+ base change) - (let (; (base (get-datetime base)) - ) - (let* ((time overflow (time+ (get-time% base) (get-time% change)))) - (datetime date: (date+ (get-date base) - (get-date change) - (date day: overflow)) - time: time - tz: (get-timezone base) - )))) + (let* ((time overflow (time+ (get-time% base) (get-time% change)))) + (datetime date: (date+ (get-date base) + (get-date change) + (date day: overflow)) + time: time + tz: (get-timezone base) + ))) ;; (define (datetime->srfi-19-date date) ;; ((@ (srfi srfi-19) make-date) @@ -658,16 +650,14 @@ (day = (- 1))))) -(define-public (datetime-difference end* start*) +(define-public (datetime-difference end start) ;; NOTE Makes both start and end datetimes in the current local time. - (let ((end (get-datetime end*)) - (start (get-datetime start*))) - (let* ((fixed-time overflow (time- (get-time% end) - (get-time% start)))) - (datetime date: (date-difference (date- (get-date end) - (date day: overflow)) - (get-date start)) - time: fixed-time)))) + (let* ((fixed-time overflow (time- (get-time% end) + (get-time% start)))) + (datetime date: (date-difference (date- (get-date end) + (date day: overflow)) + (get-date start)) + time: fixed-time))) |