(define-module (vcomponent) :use-module (util) :use-module (util app) :use-module (util config) :use-module (srfi srfi-1) :use-module (srfi srfi-41) :use-module (srfi srfi-41 util) :use-module (datetime) :use-module (vcomponent base) :use-module (vcomponent parse) :use-module ((vcomponent recurrence) :select (generate-recurrence-set repeating?)) :use-module ((vcomponent datetime) :select (ev-timestream (getf 'fixed-events)) (map generate-recurrence-set (getf 'repeating-events))))) (setf 'uid-map (let ((ht (make-hash-table))) (for-each (lambda (event) (hash-set! ht (prop event 'UID) event)) (getf 'events)) ht))) (define-method (fixed-events-in-range start end) (filter-sorted (lambda (ev) ((in-date-range? start end) (as-date (prop ev 'DTSTART)))) (getf 'fixed-events))) (define-method (get-event-by-uid uid) (hash-ref (getf 'uid-map) uid)) ;;; TODO both add- and remove-event sometimes crash with ;;;;; Warning: Unwind-only `stack-overflow' exception; skipping pre-unwind handler. ;;; I belive this is due to how getf and setf work. ;;; TODO what should happen when an event with that UID already exists ;;; in the calendar? Fail? Overwrite? Currently it adds a second element ;;; with the same UID, which is BAD. (define-public (add-event calendar event) (add-child! calendar event) (unless (prop event 'UID) (set! (prop event 'UID) (uuidgen))) (let ((events (getf 'events))) (setf 'events (cons event events))) (if (repeating? event) (let ((repeating (getf 'repeating-events))) (setf 'repeating-events (insert-ordered event repeating ev-time