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