Migrated effect to static dispatch
This commit is contained in:
@@ -2,8 +2,8 @@ module Effects.Time (
|
||||
currentTime,
|
||||
currentTimeB,
|
||||
currentTimeT,
|
||||
runTimeEff,
|
||||
Time,
|
||||
runTimeEff,
|
||||
)
|
||||
where
|
||||
|
||||
@@ -12,25 +12,41 @@ import Chronos qualified as C
|
||||
import Data.Text (Text)
|
||||
import Data.Text.Lazy.Builder qualified as T
|
||||
import Effectful
|
||||
import Effectful.Dispatch.Dynamic
|
||||
import Effectful.TH
|
||||
|
||||
data Time :: Effect where
|
||||
CurrentTime :: Time m C.Time
|
||||
CurrentTimeB :: Time m T.Builder
|
||||
CurrentTimeT :: Time m Text
|
||||
import Effectful.Dispatch.Static
|
||||
|
||||
makeEffect ''Time
|
||||
data Time :: Effect
|
||||
|
||||
type instance DispatchOf Time = 'Static 'WithSideEffects
|
||||
newtype instance StaticRep Time = Time ()
|
||||
|
||||
currentTime ::
|
||||
Time :> es =>
|
||||
Eff es C.Time
|
||||
currentTime = do
|
||||
Time _ <- getStaticRep
|
||||
unsafeEff_ now
|
||||
|
||||
currentTimeB ::
|
||||
Time :> es =>
|
||||
Eff es T.Builder
|
||||
currentTimeB = do
|
||||
Time _ <- getStaticRep
|
||||
unsafeEff_ $
|
||||
builder_YmdHMS (SubsecondPrecisionFixed 4) w3c . timeToDatetime
|
||||
<$> now
|
||||
|
||||
currentTimeT ::
|
||||
Time :> es =>
|
||||
Eff es Text
|
||||
currentTimeT = do
|
||||
Time _ <- getStaticRep
|
||||
unsafeEff_ $
|
||||
encode_YmdHMS (SubsecondPrecisionFixed 4) w3c . timeToDatetime
|
||||
<$> now
|
||||
|
||||
runTimeEff ::
|
||||
(IOE :> es) =>
|
||||
IOE :> es =>
|
||||
Eff (Time : es) a ->
|
||||
Eff es a
|
||||
runTimeEff = interpret $ \_ -> \case
|
||||
CurrentTime -> liftIO now
|
||||
CurrentTimeB ->
|
||||
builder_YmdHMS (SubsecondPrecisionFixed 4) w3c . timeToDatetime
|
||||
<$> liftIO now
|
||||
CurrentTimeT ->
|
||||
encode_YmdHMS (SubsecondPrecisionFixed 4) w3c . timeToDatetime
|
||||
<$> liftIO now
|
||||
runTimeEff = evalStaticRep (Time ())
|
||||
|
||||
Reference in New Issue
Block a user