diff --git a/src/libraries/OS-Posix/System/Time.dcl b/src/libraries/OS-Posix/System/Time.dcl index fb625d0371cfcf4d010033ed8635309067439a51..ea10fce3e685e9c08016ca9ea43a2b691c45878e 100644 --- a/src/libraries/OS-Posix/System/Time.dcl +++ b/src/libraries/OS-Posix/System/Time.dcl @@ -90,3 +90,10 @@ toGmTime :: !Timestamp -> Tm */ nsTime :: !*World -> (!Timespec, !*World) :: Timespec = {tv_sec :: !Int, tv_nsec :: !Int} + +timespecToStamp :: !Timespec -> Timestamp +timestampToSpec :: !Timestamp -> Timespec + +instance < Timespec +instance + Timespec +instance - Timespec diff --git a/src/libraries/OS-Posix/System/Time.icl b/src/libraries/OS-Posix/System/Time.icl index c982af4055865959e6cd38ad1eb370c70c94869b..9dea633f12451c3287c6ec7219c88a49dbd9d5a4 100644 --- a/src/libraries/OS-Posix/System/Time.icl +++ b/src/libraries/OS-Posix/System/Time.icl @@ -176,3 +176,30 @@ nsTime w # (tv_sec, p) = readIntP p 0 # (tv_nsec, p) = readIntP p 8 = ({Timespec | tv_sec = tv_sec, tv_nsec = tv_nsec}, freeSt p w) + +timespecToStamp :: !Timespec -> Timestamp +timespecToStamp t = Timestamp t.tv_sec + +timestampToSpec :: !Timestamp -> Timespec +timestampToSpec (Timestamp t) = {tv_sec=t,tv_nsec=0} + +instance < Timespec +where + (<) t1 t2 + | t1.tv_sec == t2.tv_sec = t1.tv_nsec < t2.tv_nsec + = t1.tv_sec < t2.tv_sec + +instance + Timespec +where + (+) t1 t2 = let tv_nsec = t1.tv_nsec + t2.tv_nsec in + { tv_sec = t1.tv_sec + t2.tv_sec + tv_nsec / 1000000000 + , tv_nsec = tv_nsec rem 1000000000 + } + +instance - Timespec +where + (-) t1 t2 + # tv_nsec = t1.tv_nsec - t2.tv_nsec + | tv_nsec < 0 + = {tv_sec = t1.tv_sec - t2.tv_sec - 1, tv_nsec = 1000000000 - tv_nsec} + = {tv_sec = t1.tv_sec - t2.tv_sec - 1, tv_nsec = tv_nsec} diff --git a/src/libraries/OS-Windows/System/Time.dcl b/src/libraries/OS-Windows/System/Time.dcl index 525c8b6f575b2f9c077fb4be9768c57566904aef..6c85d7991fd4de0ba9601d8e1b49776f8b6af9d5 100644 --- a/src/libraries/OS-Windows/System/Time.dcl +++ b/src/libraries/OS-Windows/System/Time.dcl @@ -94,3 +94,11 @@ gmTimeC :: !{#Int} -> Int */ nsTime :: !*World -> (!Timespec, !*World) :: Timespec = {tv_sec :: !Int, tv_nsec :: !Int} + +timespecToStamp :: !Timespec -> Timestamp + +timestampToSpec :: !Timestamp -> Timespec + +instance < Timespec +instance + Timespec +instance - Timespec diff --git a/src/libraries/OS-Windows/System/Time.icl b/src/libraries/OS-Windows/System/Time.icl index 705c34d1b2381381d2e158f8e953afbb846a6a83..c0ebc10b513134e6b9474a766f3bee51c49d0f25 100644 --- a/src/libraries/OS-Windows/System/Time.icl +++ b/src/libraries/OS-Windows/System/Time.icl @@ -180,3 +180,30 @@ uintToInt :: Int -> Integer uintToInt i | i < 0 = toInteger i + {integer_s=0,integer_a={0,1}} = toInteger i + +timespecToStamp :: !Timespec -> Timestamp +timespecToStamp t = Timestamp t.tv_sec + +timestampToSpec :: !Timestamp -> Timespec +timestampToSpec (Timestamp t) = {tv_sec=t,tv_nsec=0} + +instance < Timespec +where + (<) t1 t2 + | t1.tv_sec == t2.tv_sec = t1.tv_nsec < t2.tv_nsec + = t1.tv_sec < t2.tv_sec + +instance + Timespec +where + (+) t1 t2 = let tv_nsec = t1.tv_nsec + t2.tv_nsec in + { tv_sec = t1.tv_sec + t2.tv_sec + tv_nsec / 1000000000 + , tv_nsec = tv_nsec rem 1000000000 + } + +instance - Timespec +where + (-) t1 t2 + # tv_nsec = t1.tv_nsec - t2.tv_nsec + | tv_nsec < 0 + = {tv_sec = t1.tv_sec - t2.tv_sec - 1, tv_nsec = 1000000000 - tv_nsec} + = {tv_sec = t1.tv_sec - t2.tv_sec - 1, tv_nsec = tv_nsec}