;;;; C6 Core Time & Date Proposal
;;;; based on SRFI 174, SRFI 19 & (chicken time posix)
;;;;
;;;; timespec from SRFI 174 so datespec follows naming
;;;; 39 entrypoints: 2 timezone, 15 timespec, 22 datespec
;;;
(define-type hash-limit fixnum)
(define-type hash-salt fixnum)
(define-type exact-rational (and rational (not float)))
;;;
(define-type timezone-difference fixnum)
(: local-timezone-difference (-> timezone-difference))
(: local-timezone-abbreviation (-> string))
;;;
(define-type timespec (struct <timespec>))
(: timespec (integer fixnum -> timespec))
(: timespec? (* -> boolean : timespec))
(: timespec-seconds (timespec --> integer))
(: timespec-nanoseconds (timespec --> fixnum))
(: current-timespec (#!optional timezone-difference -> timespec)) ;default
local time
(: current-utc-timespec (-> timespec)) ;convenience
(: timespec=? (timespec timespec -> boolean))
(: timespec<? (timespec timespec -> boolean))
; Add to SRFI 69 (srfi 69 hash)
;
(: timespec-hash (timespec #!optional hash-limit hash-salt))
(: timespec->inexact (timespec -> float))
(: inexact->timespec (float #!optional timezone-difference -> timespec))
(: timespec->exact (timespec -> exact-rational)
(: exact->timespec (exact-rational #!optional timezone-difference -> timespec))
; Map SRFI 19 io format => strftime & strptime?
;
(: timespec->string (timespec #!optional string -> string))
(: string->timespec (string #!optional string -> timespec))
;;;
(define-type datespec (struct <datespec>))
; NOTE <datespec> either !) refs the 10-element or 2) does a move-memory! (all
; immediate) from the 10-vector to the struct elements.
;
(: datespec-seconds (fixnum fixnum fixnum
fixnum fixnum fixnum
fixnum fixnum
boolean fixnum) -> datespec))
(: datespec? (* -> boolean : datespec))
(: datespec-seconds (datespec --> fixnum))
(: datespec-minutes (datespec --> fixnum))
(: datespec-hours (datespec --> fixnum))
(: datespec-day (datespec --> fixnum))
(: datespec-month (datespec --> fixnum))
(: datespec-year (datespec --> fixnum))
(: datespec-week-day (datespec --> fixnum))
(: datespec-year-day (datespec --> fixnum))
(: datespec-dst? (datespec --> boolean))
(: datespec-timezone (datespec --> timezone-difference))
(: current-datespec (#!optional timezone-difference -> datespec)) ;default
local time
(: current-utc-datespec (-> datespec)) ;convenience
(: datespec=? (datespec datespec -> booelan))
(: datespec<? (datespec datespec -> booelan))
; Add to SRFI 69 (srfi 69 hash)
;
(: datespec-hash (timespec -> fixnum #!optional hash-limit hash-salt))
(: timespec->datespec (timespec #!optional timezone-difference -> datespec))
;default local time
(: utc-timespec->datespec (timespec -> datespec)) ;convenience
(: datespec->timespec (datespec -> timespec))
; Map SRFI 19 io format => strftime & strptime?
;
(: datespec->string (datespec #!optional string -> string))
(: string->datespec (string #!optional string -> datespec))