;;;; 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))



Reply via email to