Use IOLIB/ in package names
[iolib.git] / src / base / time.lisp
blob45f584630a2a2020052304ef868cc0c5a773802f
1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; --- Time utils.
4 ;;;
6 (in-package :iolib/base)
8 (deftype timeout ()
9 'double-float)
11 (deftype timeout-designator ()
12 '(or non-negative-real (member t nil)))
14 (deftype positive-timeout-designator ()
15 '(or non-negative-real (eql t)))
17 ;;; Break a real timeout into seconds and microseconds.
18 (defun decode-timeout (timeout)
19 (assert (or (not timeout)
20 (and (typep timeout 'real)
21 (not (minusp timeout))))
22 (timeout)
23 "The timeout must be a non-negative real or NIL: ~S" timeout)
24 (typecase timeout
25 (null nil)
26 (integer (values timeout 0))
27 (real
28 (multiple-value-bind (q r) (truncate (coerce timeout 'timeout))
29 (declare (type unsigned-byte q)
30 (type timeout r))
31 (values q (the (values unsigned-byte t) (truncate (* r 1d6))))))))
33 (defun normalize-timeout (timeout)
34 (assert (and (typep timeout 'real)
35 (not (minusp timeout)))
36 (timeout)
37 "The timeout must be non-negative: ~A" timeout)
38 (coerce timeout 'timeout))
40 (defun clamp-timeout (timeout &optional (min 0) (max most-positive-fixnum))
41 (clamp (or timeout most-positive-fixnum)
42 (if min (max min 0) 0) (or max most-positive-fixnum)))