packages feed

polysemy-time 0.1.2.4 → 0.1.3.0

raw patch · 13 files changed

+118/−62 lines, 13 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Polysemy.Time.Measure: measure :: forall dt t d u r a. TimeUnit u => Torsor dt u => Instant t dt => Member (Time t d) r => Sem r a -> Sem r (u, a)
- Polysemy.Time: adjust :: forall t_axio d_axir r_axno u1_Xxiq u2_Xxis. (MemberWithError (Time t_axio d_axir) r_axno, AddTimeUnit t_axio u1_Xxiq u2_Xxis) => u1_Xxiq -> Sem r_axno ()
+ Polysemy.Time: adjust :: forall t_axdi d_axdl r_axii u1_Xxdk u2_Xxdm. (MemberWithError (Time t_axdi d_axdl) r_axii, AddTimeUnit t_axdi u1_Xxdk u2_Xxdm) => u1_Xxdk -> Sem r_axii ()
- Polysemy.Time: now :: forall t_axib d_axic r_axni. MemberWithError (Time t_axib d_axic) r_axni => Sem r_axni t_axib
+ Polysemy.Time: now :: forall t_axd5 d_axd6 r_axic. MemberWithError (Time t_axd5 d_axd6) r_axic => Sem r_axic t_axd5
- Polysemy.Time: setDate :: forall t_axiu d_axit r_axnq. MemberWithError (Time t_axiu d_axit) r_axnq => d_axit -> Sem r_axnq ()
+ Polysemy.Time: setDate :: forall t_axdo d_axdn r_axik. MemberWithError (Time t_axdo d_axdn) r_axik => d_axdn -> Sem r_axik ()
- Polysemy.Time: setTime :: forall t_axil d_axim r_axnm. MemberWithError (Time t_axil d_axim) r_axnm => t_axil -> Sem r_axnm ()
+ Polysemy.Time: setTime :: forall t_axdf d_axdg r_axig. MemberWithError (Time t_axdf d_axdg) r_axig => t_axdf -> Sem r_axig ()
- Polysemy.Time: sleep :: forall t_axii d_axij r_axnk u_Xxii. (MemberWithError (Time t_axii d_axij) r_axnk, TimeUnit u_Xxii) => u_Xxii -> Sem r_axnk ()
+ Polysemy.Time: sleep :: forall t_axdc d_axdd r_axie u_Xxdc. (MemberWithError (Time t_axdc d_axdd) r_axie, TimeUnit u_Xxdc) => u_Xxdc -> Sem r_axie ()
- Polysemy.Time: today :: forall t_axie d_axif r_axnj. MemberWithError (Time t_axie d_axif) r_axnj => Sem r_axnj d_axif
+ Polysemy.Time: today :: forall t_axd8 d_axd9 r_axid. MemberWithError (Time t_axd8 d_axd9) r_axid => Sem r_axid d_axd9
- Polysemy.Time.Data.Time: adjust :: forall t_axio d_axir r_axno u1_Xxiq u2_Xxis. (MemberWithError (Time t_axio d_axir) r_axno, AddTimeUnit t_axio u1_Xxiq u2_Xxis) => u1_Xxiq -> Sem r_axno ()
+ Polysemy.Time.Data.Time: adjust :: forall t_axdi d_axdl r_axii u1_Xxdk u2_Xxdm. (MemberWithError (Time t_axdi d_axdl) r_axii, AddTimeUnit t_axdi u1_Xxdk u2_Xxdm) => u1_Xxdk -> Sem r_axii ()
- Polysemy.Time.Data.Time: now :: forall t_axib d_axic r_axni. MemberWithError (Time t_axib d_axic) r_axni => Sem r_axni t_axib
+ Polysemy.Time.Data.Time: now :: forall t_axd5 d_axd6 r_axic. MemberWithError (Time t_axd5 d_axd6) r_axic => Sem r_axic t_axd5
- Polysemy.Time.Data.Time: setDate :: forall t_axiu d_axit r_axnq. MemberWithError (Time t_axiu d_axit) r_axnq => d_axit -> Sem r_axnq ()
+ Polysemy.Time.Data.Time: setDate :: forall t_axdo d_axdn r_axik. MemberWithError (Time t_axdo d_axdn) r_axik => d_axdn -> Sem r_axik ()
- Polysemy.Time.Data.Time: setTime :: forall t_axil d_axim r_axnm. MemberWithError (Time t_axil d_axim) r_axnm => t_axil -> Sem r_axnm ()
+ Polysemy.Time.Data.Time: setTime :: forall t_axdf d_axdg r_axig. MemberWithError (Time t_axdf d_axdg) r_axig => t_axdf -> Sem r_axig ()
- Polysemy.Time.Data.Time: sleep :: forall t_axii d_axij r_axnk u_Xxii. (MemberWithError (Time t_axii d_axij) r_axnk, TimeUnit u_Xxii) => u_Xxii -> Sem r_axnk ()
+ Polysemy.Time.Data.Time: sleep :: forall t_axdc d_axdd r_axie u_Xxdc. (MemberWithError (Time t_axdc d_axdd) r_axie, TimeUnit u_Xxdc) => u_Xxdc -> Sem r_axie ()
- Polysemy.Time.Data.Time: today :: forall t_axie d_axif r_axnj. MemberWithError (Time t_axie d_axif) r_axnj => Sem r_axnj d_axif
+ Polysemy.Time.Data.Time: today :: forall t_axd8 d_axd9 r_axid. MemberWithError (Time t_axd8 d_axd9) r_axid => Sem r_axid d_axd9
- Polysemy.Time.Diff: diff :: TimeUnit u => Torsor dt u => Instant i1 dt => Instant i2 dt => i1 -> i2 -> u
+ Polysemy.Time.Diff: diff :: forall dt u i1 i2. TimeUnit u => Torsor dt u => Instant i1 dt => Instant i2 dt => i1 -> i2 -> u
- Polysemy.Time.Prelude: divOr0 :: Eq a => Real a => Integral a => a -> a -> a
+ Polysemy.Time.Prelude: divOr0 :: Real a => Integral a => a -> a -> a
- Polysemy.Time.Prelude: safeDiv :: Eq a => Real a => Integral a => a -> a -> Maybe a
+ Polysemy.Time.Prelude: safeDiv :: Real a => Integral a => a -> a -> Maybe a

Files

changelog.md view
@@ -1,4 +1,7 @@-# 0.2.0.0+# 0.1.3.0+* Added `measure`, a combinator that returns the time span an action takes.++# 0.1.1.0 * Added `Time.Adjust`, an action that takes a time unit and adds it to the custom start time, if available. * Added `Fractional` instances for sub-second time units that treat literals as seconds. 
lib/Polysemy/Time/Data/TimeUnit.hs view
@@ -32,7 +32,7 @@   fromNanos :: NanoSeconds -> u   default fromNanos :: Integral u => NanoSeconds -> u   fromNanos n =-    fromIntegral (n `div` (fromIntegral (nanos @u)))+    fromIntegral (n `div` (nanos @u))  -- * Data types used to specify time spans, e.g. for sleeping. 
lib/Polysemy/Time/Diff.hs view
@@ -6,6 +6,7 @@ import Polysemy.Time.Data.TimeUnit (TimeUnit, convert)  diff ::+  ∀ dt u i1 i2 .   TimeUnit u =>   Torsor dt u =>   Instant i1 dt =>
lib/Polysemy/Time/Ghc.hs view
@@ -7,7 +7,7 @@ import Polysemy.Time.At (interpretTimeAt) import qualified Polysemy.Time.Data.Time as Time import Polysemy.Time.Data.Time (Time)-import Polysemy.Time.Data.TimeUnit (MicroSeconds(MicroSeconds), convert)+import Polysemy.Time.Data.TimeUnit (MicroSeconds (MicroSeconds), convert) import Polysemy.Time.Orphans ()  -- |Convenience alias for 'Data.Time'.
+ lib/Polysemy/Time/Measure.hs view
@@ -0,0 +1,28 @@+module Polysemy.Time.Measure where++import Torsor (Torsor)++import Polysemy.Time.Class.Instant (Instant)+import qualified Polysemy.Time.Data.Time as Time+import Polysemy.Time.Data.Time (Time)+import Polysemy.Time.Data.TimeUnit (TimeUnit)+import Polysemy.Time.Diff (diff)++-- |Run the action @ma@ and measure the time it takes.+--+-- The type of the difference depends on the functional dependencies of the classes 'Instant' and 'Torsor', where the+-- input to the former is taken from the type @t@ of 'Time' which is instantiated by an interpreter.+measure ::+  ∀ dt t d u r a .+  TimeUnit u =>+  Torsor dt u =>+  Instant t dt =>+  Member (Time t d) r =>+  Sem r a ->+  Sem r (u, a)+measure ma = do+  !start <- Time.now @t @d+  a <- ma+  !end <- Time.now @t @d+  pure (diff end start, a)+{-# inline measure #-}
lib/Polysemy/Time/Prelude.hs view
@@ -300,7 +300,6 @@ {-# inline mneToList #-}  safeDiv ::-  Eq a =>   Real a =>   Integral a =>   a ->@@ -313,7 +312,6 @@ {-# inline safeDiv #-}  divOr0 ::-  Eq a =>   Real a =>   Integral a =>   a ->
polysemy-time.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           polysemy-time-version:        0.1.2.4+version:        0.1.3.0 synopsis:       Polysemy Effect for Time description:    Please see the readme on Github at <https://github.com/tek/polysemy-time> category:       Time@@ -30,6 +30,7 @@       Polysemy.Time.Debug       Polysemy.Time.Diff       Polysemy.Time.Ghc+      Polysemy.Time.Measure       Polysemy.Time.Orphans       Polysemy.Time.Prelude       Polysemy.Time.Sleep@@ -121,8 +122,9 @@   type: exitcode-stdio-1.0   main-is: Main.hs   other-modules:-      Polysemy.Time.GhcTimeTest-      Polysemy.Time.TimeUnitTest+      Polysemy.Time.Test.GhcTimeTest+      Polysemy.Time.Test.MeasureTest+      Polysemy.Time.Test.TimeUnitTest       Paths_polysemy_time   hs-source-dirs:       test
test/Main.hs view
@@ -1,8 +1,9 @@ module Main where  import Polysemy.Test (unitTest)-import Polysemy.Time.GhcTimeTest (test_ghcTime, test_ghcTimeAt)-import Polysemy.Time.TimeUnitTest (test_fractional)+import Polysemy.Time.Test.GhcTimeTest (test_ghcTime, test_ghcTimeAt)+import Polysemy.Time.Test.MeasureTest (test_measure)+import Polysemy.Time.Test.TimeUnitTest (test_fractional) import Test.Tasty (TestTree, defaultMain, testGroup)  tests :: TestTree@@ -10,7 +11,8 @@   testGroup "unit" [     unitTest "ghc time" test_ghcTime,     unitTest "ghc time at instant" test_ghcTimeAt,-    unitTest "convert Fractional to TimeUnit" test_fractional+    unitTest "convert Fractional to TimeUnit" test_fractional,+    unitTest "measure time an action takes" test_measure   ]  main :: IO ()
− test/Polysemy/Time/GhcTimeTest.hs
@@ -1,39 +0,0 @@-module Polysemy.Time.GhcTimeTest where--import Data.Time (Day, UTCTime)--import Polysemy.Test (UnitTest, assert, runTestAuto, (===))-import Polysemy.Test.Data.Hedgehog (Hedgehog)-import Polysemy.Time (Time, mkDatetime, year)-import qualified Polysemy.Time.Data.Time as Time-import Polysemy.Time.Data.TimeUnit (Days(Days), Seconds(Seconds))-import Polysemy.Time.Ghc (interpretTimeGhc, interpretTimeGhcAt)--prog ::-  Ord t =>-  Members [Time t d, Hedgehog IO] r =>-  Sem r ()-prog = do-  time1 <- Time.now-  time2 <- Time.now-  assert (time1 < time2)--test_ghcTime :: UnitTest-test_ghcTime =-  runTestAuto do-    interpretTimeGhc prog--testTime :: UTCTime-testTime =-  mkDatetime 1845 12 31 23 59 59--test_ghcTimeAt :: UnitTest-test_ghcTimeAt =-  runTestAuto do-    interpretTimeGhcAt testTime do-      Time.sleep @UTCTime @Day (Seconds 1)-      time <- Time.now-      1846 === year time-      Time.adjust (Days 366)-      time1 <- Time.now-      1847 === year time1
+ test/Polysemy/Time/Test/GhcTimeTest.hs view
@@ -0,0 +1,40 @@+module Polysemy.Time.Test.GhcTimeTest where++import Data.Time (Day, UTCTime)+import Polysemy.Test (UnitTest, assert, runTestAuto, (===))+import Polysemy.Test.Data.Hedgehog (Hedgehog)++import Polysemy.Time.Calendar (mkDatetime, year)+import qualified Polysemy.Time.Data.Time as Time+import Polysemy.Time.Data.Time (Time)+import Polysemy.Time.Data.TimeUnit (Days (Days), Seconds (Seconds))+import Polysemy.Time.Ghc (interpretTimeGhc, interpretTimeGhcAt)++prog ::+  Ord t =>+  Members [Time t d, Hedgehog IO] r =>+  Sem r ()+prog = do+  time1 <- Time.now+  time2 <- Time.now+  assert (time1 < time2)++test_ghcTime :: UnitTest+test_ghcTime =+  runTestAuto do+    interpretTimeGhc prog++testTime :: UTCTime+testTime =+  mkDatetime 1845 12 31 23 59 59++test_ghcTimeAt :: UnitTest+test_ghcTimeAt =+  runTestAuto do+    interpretTimeGhcAt testTime do+      Time.sleep @UTCTime @Day (Seconds 1)+      time <- Time.now+      1846 === year time+      Time.adjust (Days 366)+      time1 <- Time.now+      1847 === year time1
+ test/Polysemy/Time/Test/MeasureTest.hs view
@@ -0,0 +1,21 @@+module Polysemy.Time.Test.MeasureTest where++import Polysemy.Test (UnitTest, assert, runTestAuto)++import qualified Polysemy.Time.Data.Time as Time+import Polysemy.Time.Data.TimeUnit (MilliSeconds (MilliSeconds), convert)+import Polysemy.Time.Ghc (interpretTimeGhc)+import Polysemy.Time.Measure (measure)++test_measure :: UnitTest+test_measure =+  runTestAuto do+    interpretTimeGhc do+      (t1, t2) <- measure do+        Time.sleep (MilliSeconds 100)+        fst <$> measure (Time.sleep (MilliSeconds 100))+      assert (t2 > convert (MilliSeconds 100))+      assert (t1 > convert (MilliSeconds 200))+      assert (t2 < t1)+      assert (t2 < convert (MilliSeconds 200))+
+ test/Polysemy/Time/Test/TimeUnitTest.hs view
@@ -0,0 +1,12 @@+module Polysemy.Time.Test.TimeUnitTest where++import Polysemy.Test (UnitTest, runTestAuto, (===))++import Polysemy.Time.Data.TimeUnit (MicroSeconds (MicroSeconds), MilliSeconds (MilliSeconds))++test_fractional :: UnitTest+test_fractional =+  runTestAuto do+    MilliSeconds 50 === 0.05+    MicroSeconds 200 === 0.0002+    MilliSeconds 50 === (MilliSeconds 100 / MilliSeconds 2)
− test/Polysemy/Time/TimeUnitTest.hs
@@ -1,12 +0,0 @@-module Polysemy.Time.TimeUnitTest where--import Polysemy.Test (UnitTest, runTestAuto, (===))--import Polysemy.Time.Data.TimeUnit (MicroSeconds(MicroSeconds), MilliSeconds(MilliSeconds))--test_fractional :: UnitTest-test_fractional =-  runTestAuto do-    MilliSeconds 50 === 0.05-    MicroSeconds 200 === 0.0002-    MilliSeconds 50 === (MilliSeconds 100 / MilliSeconds 2)