1;;; 2;;; srfi-174 - POSIX Timespecs 3;;; 4;;; Shiro Kawai 5;;; This is simply a wrapper of srfi-19 time type. 6;;; I put this in Public Domain. 7;;; 8 9(define-module srfi-174 10 (use srfi-19) 11 (export timespec timespec? 12 timespec-seconds timespec-nanoseconds 13 inexact->timespec timespec->inexact 14 timespec=? timespec<? timespec-hash)) 15(select-module srfi-174) 16 17(define (timespec secs nsecs) 18 (make-time time-utc nsecs secs)) 19 20(define (timespec? obj) (is-a? obj <time>)) 21 22(define-inline (timespec-seconds obj) (time-second obj)) 23(define-inline (timespec-nanoseconds obj) (time-nanosecond obj)) 24 25(define (inexact->timespec v) 26 (receive (frac secs) (modf v) 27 ;; be careful that scaling and rounding frac may cause nanos to be 10e9. 28 (let ([nanos (round->exact (* (abs frac) #e1_000_000_000))] 29 [secs (exact secs)]) 30 (timespec (if (>= nanos #e1_000_000_000) 31 (if (>= secs 0) 32 (+ secs 1) 33 (- secs 1)) 34 secs) 35 (modulo nanos #e1_000_000_000))))) 36 37(define (timespec->inexact v) 38 (if (>= (timespec-seconds v) 0) 39 (+ (inexact (timespec-seconds v)) 40 (* (inexact (timespec-nanoseconds v)) 1e-9)) 41 (- (inexact (timespec-seconds v)) 42 (* (inexact (timespec-nanoseconds v)) 1e-9)))) 43 44(define (timespec=? ts1 ts2) (time=? ts1 ts2)) 45(define (timespec<? ts1 ts2) (time<? ts1 ts2)) 46 47(define (timespec-hash ts) (default-hash ts)) 48