(sorry, didn’t finish datespec construction section)
;;;; 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
;;;; ->list/vector add 4 timespec & 4 datespec
;;; Common Types
(define-type hash-limit fixnum)
(define-type hash-salt fixnum)
(define-type exact-rational (and rational (not float)))
; C strftime & strptime format strings.
; Expose SRFI 19 io format but use C format via mapping?
;
(define-type format-spec string)
;;; Timezone - not 1st class
(define-type timezone-difference fixnum)
(: local-timezone-difference (-> timezone-difference))
(: local-timezone-abbreviation (-> string))
;;; Time - timespec (SRFI 174)
(define-type timespec (struct <timespec>))
(define-type seconds integer) ;not `second' (second of day)
(define-type nanoseconds fixnum)
(: timespec (seconds #!optional nanoseconds -> timespec))
(: timespec? (* -> boolean : timespec))
(: timespec-seconds (timespec --> seconds))
(: timespec-nanoseconds (timespec --> nanoseconds))
(: 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))
; String conversion default format is iso-8601.
;
(: timespec->string (timespec #!optional format-spec -> string))
(: string->timespec (string #!optional format-spec -> timespec))
; Redundant
(: timespec->iso-8601 (timespec -> string))
(: iso-8601->timespec (string -> timespec))
; Completeness
(define-type timespec-list (list seconds nanoseconds))
(define-type timespec-vector (vector seconds nanoseconds))
(: timespec->list (timespec -> timespec-list))
(: list->timespec (timespec-list #!optional timezone-difference -> timespec))
(: timespec->vector (timespec -> timespec-vector))
(: vector->timespec (timespec-vector #!optional timezone-difference ->
timespec))
;;; Date - datespec
(define-type datespec (struct <datespec>))
(define-type year fixnum)
(define-type month fixnum)
(define-type day fixnum)
(define-type hour fixnum)
(define-type minute fixnum)
(define-type second fixnum) ;not `seconds' (second of time)
(define-type week-day fixnum)
(define-type year-day fixnum)
(define-type daylight-saving-flag boolean)
; ISO 8601 order constructor
;
(: datespec (year month day
#!optional hour minute second
timezone-difference daylight-saving-flag -> datespec))
; Not a user-facing ctor.
;
; <datespec> either (!) refs the 10-element or (2) does a move-memory!
; (all immediate) from the 10-vector to the struct elements.
;
; A timespec seconds, w/ nanoseconds ignored, is the current time.posix
;
(: make-datespec (second minute hour day month year
week-day year-day
daylight-saving-flag timezone-difference -> datespec))
(: datespec? (* -> boolean : datespec))
(: datespec-seconds (datespec --> second))
(: datespec-minutes (datespec --> minute))
(: datespec-hours (datespec --> hour))
(: datespec-day (datespec --> day))
(: datespec-month (datespec --> month))
(: datespec-year (datespec --> year))
(: datespec-week-day (datespec --> week-day))
(: datespec-year-day (datespec --> year-day))
(: datespec-dst? (datespec --> daylight-saving-flag))
(: 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))
; String conversion default format is iso-8601.
;
(: datespec->string (datespec #!optional format-spec -> string))
(: string->datespec (string #!optional format-spec -> datespec))
; Redundant
(: datespec->iso-8601 (datespec -> string))
(: iso-8601->datespec (string -> datespec))
; Completeness
(define-type datespec-list (list year month day
hour minute second
daylight-saving-flag timezone-difference))
(define-type datespec-vector (vector year month day
hour minute second
daylight-saving-flag timezone-difference))
(: datespec->list (datespec -> datespec-list))
(: list->datespec (datespec-list -> datespec))
(: datespec->vector (datespec -> datespec-vector))
(: vector->datespec (datespec-vector -> datespec))