Commit3e751f0fRecorded29 Mar 2026Repositorysigil-wise

Import date utilities from (sigil time) instead of defining locally

Message

Remove local copies of parse-iso-date, format-iso-date, days-in-month, add-days, and date-compare. These are now provided by (sigil time) in sigil-stdlib. wise-date-windows is kept as it's Wise-specific.

Changed
 src/wise.sgl | 82 +++-------------------------------------------------------------------------------
 1 file changed, 3 insertions(+), 79 deletions(-)
Diff
src/wise.sglmodified
@@ -10,7 +10,9 @@
10
(sigil struct)
11
(sigil json)
12
(only (sigil http) url-encode-value build-query-string)
−13
(sigil http client))
+13
(sigil http client)
+14
(only (sigil time) parse-iso-date format-iso-date
+15
days-in-month add-days date-compare))
16
17
(export ;; Client
18
wise-client
@@ -165,84 +167,6 @@
167
;;; Maximum number of days per statement request (Wise limit).
168
(define wise-max-window-days 469)
169
−168
;;; Parse an ISO 8601 date string "YYYY-MM-DDTHH:MM:SSZ" into a list
−169
;;; of (year month day hour minute second).
−170
(define (parse-iso-date s)
−171
(list (string->number (substring s 0 4))
−172
(string->number (substring s 5 7))
−173
(string->number (substring s 8 10))
−174
(if (> (string-length s) 10)
−175
(string->number (substring s 11 13))
−176
0)
−177
(if (> (string-length s) 13)
−178
(string->number (substring s 14 16))
−179
0)
−180
(if (> (string-length s) 16)
−181
(string->number (substring s 17 19))
−182
0)))
−183
−184
;;; Format a date list back to ISO 8601 UTC string.
−185
(define (format-iso-date parts)
−186
(let ((year (list-ref parts 0))
−187
(month (list-ref parts 1))
−188
(day (list-ref parts 2))
−189
(hour (list-ref parts 3))
−190
(minute (list-ref parts 4))
−191
(second (list-ref parts 5)))
−192
(string-append
−193
(number->string year) "-"
−194
(if (< month 10) "0" "") (number->string month) "-"
−195
(if (< day 10) "0" "") (number->string day) "T"
−196
(if (< hour 10) "0" "") (number->string hour) ":"
−197
(if (< minute 10) "0" "") (number->string minute) ":"
−198
(if (< second 10) "0" "") (number->string second) "Z")))
−199
−200
;;; Days in a given month (handles leap years).
−201
(define (days-in-month year month)
−202
(cond
−203
((memv month '(1 3 5 7 8 10 12)) 31)
−204
((memv month '(4 6 9 11)) 30)
−205
((= month 2)
−206
(if (and (= (modulo year 4) 0)
−207
(or (not (= (modulo year 100) 0))
−208
(= (modulo year 400) 0)))
−209
29 28))
−210
(else 30)))
−211
−212
;;; Add a number of days to a date list, returning a new date list.
−213
(define (add-days parts n)
−214
(let ((year (list-ref parts 0))
−215
(month (list-ref parts 1))
−216
(day (list-ref parts 2))
−217
(hour (list-ref parts 3))
−218
(minute (list-ref parts 4))
−219
(second (list-ref parts 5)))
−220
(let loop ((y year) (m month) (d (+ day n)))
−221
(let ((dim (days-in-month y m)))
−222
(cond
−223
((> d dim)
−224
(let ((new-m (+ m 1)))
−225
(if (> new-m 12)
−226
(loop (+ y 1) 1 (- d dim))
−227
(loop y new-m (- d dim)))))
−228
((< d 1)
−229
(let ((prev-m (- m 1)))
−230
(if (< prev-m 1)
−231
(let ((py (- y 1)))
−232
(loop py 12 (+ d (days-in-month py 12))))
−233
(loop y prev-m (+ d (days-in-month y prev-m))))))
−234
(else
−235
(list y m d hour minute second)))))))
−236
−237
;;; Compare two date lists. Returns -1, 0, or 1.
−238
(define (date-compare a b)
−239
(let loop ((as a) (bs b))
−240
(cond
−241
((null? as) 0)
−242
((< (car as) (car bs)) -1)
−243
((> (car as) (car bs)) 1)
−244
(else (loop (cdr as) (cdr bs))))))
−245
170
;;; Split a date range into windows of at most wise-max-window-days.
171
;;; Returns a list of (start-iso . end-iso) pairs.
172
(define (wise-date-windows start-iso end-iso)