aboutsummaryrefslogtreecommitdiff
path: root/module/datetime/instance.scm
blob: 048c9a9b5f25e91d212c4b7b237d2d8becef205a (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
(define-module (datetime instance)
  :use-module (util)
  :use-module (util config)
  :use-module (datetime zic)
  :export (zoneinfo))

(define-config tz-dir #f
  "Directory in which zoneinfo files can be found")

(define-config tz-list '()
  "List of default zoneinfo files to be parsed")


(define / file-name-separator-string)

;; TODO see (vcomponent instance), this has a similar problem with early load
(define-once zoneinfo
  (let ((cache (make-hash-table)))
    (label self
     (case-lambda
       (()
        (define tz-dir (get-config 'tz-dir))
        (define tz-list (get-config 'tz-list))
        (when (or (not tz-dir) (null? tz-list))
          (error "Default zoneinfo only available when tz-dir and tz-list are configured"))
        (self tz-dir tz-list))
       ((directory file-list)
        (let ((key (cons directory file-list)))
          (aif (hash-ref cache key)
               it
               (let ((tz (read-zoneinfo
                          (map (lambda (s) (string-append directory / s))
                               file-list))))
                 (hash-set! cache key tz)
                 tz))))))))