blob: 27153ceadaefc983bc347739b5ab452235554615 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
(define-module (vcomponent datetime)
#:use-module (vcomponent base)
#:use-module (datetime)
#:use-module (datetime util)
#:use-module (util)
#:export (#;parse-datetime
event-overlaps?
overlapping?
event-contains?
ev-time<?)
)
;;; date time pointer
#;
(define (parse-datetime dtime)
"Parse the given date[time] string into a date object."
(string->date
dtime (case (string-length dtime)
((8) "~Y~m~d") ; All day
((15) "~Y~m~dT~H~M~S") ; "local" or TZID-param
((16) "~Y~m~dT~H~M~S~z")))) ; UTC-time
(define (event-overlaps? event begin end)
"Returns if the event overlaps the timespan.
Event must have the DTSTART and DTEND attribute set."
(timespan-overlaps? (attr event 'DTSTART)
(attr event 'DTEND)
begin end))
(define (overlapping? event-a event-b)
(timespan-overlaps? (attr event-a 'DTSTART)
(attr event-a 'DTEND)
(attr event-b 'DTSTART)
(attr event-b 'DTEND)))
(define (event-contains? ev date/-time)
"Does event overlap the date that contains time."
(let* ((start (as-date date/-time))
(end (add-day start)))
(event-overlaps? ev start end)))
(define-public (ev-time<? a b)
(date/-time<? (attr a 'DTSTART)
(attr b 'DTSTART)))
;; Returns length of the event @var{e}, as a time-duration object.
(define-public (event-length e)
(time-
(attr e 'DTEND)
(attr e 'DTSTART)))
;; Returns the length of the part of @var{e} which is within the day
;; starting at the time @var{start-of-day}.
;; currently the secund argument is a date, but should possibly be changed
;; to a datetime to allow for more explicit TZ handling?
(define-public (event-length/day date e)
;; TODO date= > 2 elements
(cond [(and (date= (as-date (attr e 'DTSTART))
(as-date (attr e 'DTEND)))
(date= (as-date (attr e 'DTSTART))
date))
(time- (as-time (attr e 'DTEND))
(as-time (attr e 'DTSTART)))]
;; Starts today, end in future day
[(date= (as-date (attr e 'DTSTART))
date)
(time- #24:00:00 (as-time (attr e 'DTSTART)))]
;; Ends today, start earlier day
[(date= (as-date (attr e 'DTEND))
date)
(as-time (attr e 'DTEND))]
;; start earlier date, end later date
[else #24:00:00]))
;; 22:00 - 03:00
;; 2h för dag 1
;; 3h för dag 2
|