From 9ae2e72045e293fa2dd3d2b6c9a335ca8a1edc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 30 Dec 2019 02:10:48 +0100 Subject: Rework vcomponent recurrence internals. --- module/vcomponent/recurrence/internal.scm | 77 ++++++++++++++++++------------- 1 file changed, 46 insertions(+), 31 deletions(-) (limited to 'module/vcomponent/recurrence/internal.scm') diff --git a/module/vcomponent/recurrence/internal.scm b/module/vcomponent/recurrence/internal.scm index f7095d1d..a7a3ae5e 100644 --- a/module/vcomponent/recurrence/internal.scm +++ b/module/vcomponent/recurrence/internal.scm @@ -1,45 +1,60 @@ (define-module (vcomponent recurrence internal) + #:export (repeating? format-recur-rule make-recur-rule) + + #:use-module (srfi srfi-88) ; better keywords + #:use-module ((vcomponent base) :select (attr)) #:use-module (util) - #:use-module ((ice-9 optargs) #:select (define*-public)) - #:use-module (srfi srfi-88) - #:export (make-recur-rule - weekdays intervals)) + ) + +;; EXDATE is also a property linked to recurense rules +;; but that property alone don't create a recuring event. +(define (repeating? ev) + "Does this event repeat?" + (or (attr ev 'RRULE) + (attr ev 'RDATE))) ;; Immutable, since I easily want to be able to generate the recurence set for ;; the same event multiple times. (define-quick-record recur-rule (public: freq until count interval bysecond byminute byhour byday bymonthday byyearday byweekno bymonth bysetpos - wkst)) - -(define (make-recur-rule interval wkst) - ((record-constructor '(interval wkst)) interval wkst)) + wkst) -;; TODO make this part of define-quick-record. -;; Only "hard" part would be to provide type hints for fields for -;; string conversions. -(define-public (format-recur-rule r) - (define (a f) - ((record-accessor f) r)) - (with-output-to-string - (lambda () - (format #t "#~%") - (for-each - (lambda (field) - (when (a field) - (format #t " ~8@a: ~a~%" - field - ((case field - ((until) (@ (srfi srfi-19 util) time->string)) - (else identity)) - (a field))))) - (record-type-fields ))))) + ;; TODO make this part of define-quick-record. + ;; Only "hard" part would be to provide type hints for fields for + ;; string conversions. + (printer: + (lambda (r port) + (define (get f) + ((record-accessor f) r)) + (with-output-to-string + (lambda () + (display "#<" port) + (for field in (record-type-fields ) + (awhen (get field) + (display " ") + (display field port) + (display "=" port) + (display + (case field + ((until) ((@ (srfi srfi-19 util) time->string) it)) + (else it)) + port))) + (display ">" port)))))) -(define*-public (print-recur-rule r #:optional (port (current-output-port))) - (display (format-recur-rule r) port)) +;; @begin{example} +;; (mkrule (freq HOURLY) (wkst MO) (interval 1)) +;; @end +;; TODO field validation here, like in parse-recurrence-rule. +;; NOTE this shadows built in constructor generated in define-quick-record +(define-syntax make-recur-rule + (syntax-rules () + ((_ (key val) ...) + ((record-constructor (quote (key ...))) + val ...)))) -(define weekdays +(define-public weekdays '(SU MO TU WE TH FR SA)) -(define intervals +(define-public intervals '(SECONDLY MINUTELY HOURLY DAILY WEEKLY MONTHLY YEARLY)) -- cgit v1.2.3