module Control.Monad.Freer.Time
(currentTime
,Time
,runTime
,runTimeAt
,runInstantaneously
)
where
import Control.Monad.Freer
import Data.Time
data Time a where
CurrentTime :: Time UTCTime
currentTime :: (Member Time r) => Eff r UTCTime
currentTime = send CurrentTime
runTime :: Member IO r => Eff (Time ': r) a -> Eff r a
runTime = interpret $ \CurrentTime -> send getCurrentTime
runTimeAt :: UTCTime -> Eff (Time ': r) a -> Eff r a
runTimeAt instant = interpret $ \CurrentTime -> return instant
runInstantaneously :: (Member IO r) => Eff (Time ': r) a -> Eff r a
runInstantaneously eff = do
now <- runTime currentTime
runTimeAt now eff