@@ -3,30 +3,37 @@ module Countdown where
4import Data.Functor.Identity
4import Data.Functor.Identity
6−import qualified Control.Monad.Reader as M
6+-- eff
7−import qualified Control.Monad.State as M
8+import qualified Control.Effect as L
9import qualified Effective as E
12import qualified Effective as E
10import qualified Effective.Reader as E
13import qualified Effective.Reader as E
11import qualified Effective.State as E
14import qualified Effective.State as E
15+import qualified Effective.State.MVar as ME
12import qualified Effective.State.Dynamic as DE
16import qualified Effective.State.Dynamic as DE
14#ifdef VERSION_freer_simple
19#ifdef VERSION_freer_simple
15import qualified Control.Monad.Freer as FS
20import qualified Control.Monad.Freer as FS
16import qualified Control.Monad.Freer.Reader as FS
21import qualified Control.Monad.Freer.Reader as FS
17import qualified Control.Monad.Freer.State as FS
22import qualified Control.Monad.Freer.State as FS
20−#ifdef VERSION_eff
25+-- fused-effects
21−import qualified Control.Effect as L
24#ifdef VERSION_fused_effects
26#ifdef VERSION_fused_effects
25import qualified Control.Algebra as FE
27import qualified Control.Algebra as FE
26import qualified Control.Carrier.Reader as FE
28import qualified Control.Carrier.Reader as FE
27import qualified Control.Carrier.State.Strict as FE
29import qualified Control.Carrier.State.Strict as FE
33+import qualified Control.Monad.Reader as M
34+import qualified Control.Monad.State as M
30#ifdef VERSION_polysemy
37#ifdef VERSION_polysemy
31import qualified Polysemy as P
38import qualified Polysemy as P
32import qualified Polysemy.Reader as P
39import qualified Polysemy.Reader as P
@@ -66,7 +73,7 @@ countdownMtlDeep n = runIdentity
66 runR = flip M.runReaderT ()
73 runR = flip M.runReaderT ()
68----------------------------------------
75----------------------------------------
69−-- effective (static)
76+-- effective (pure)
71programEffectiveStatic :: E.State Integer E.:> es => E.Eff es Integer
78programEffectiveStatic :: E.State Integer E.:> es => E.Eff es Integer
72programEffectiveStatic = do
79programEffectiveStatic = do
@@ -90,6 +97,31 @@ countdownEffectiveStaticDeep n = E.runEff
91 runR = E.runReader ()
98 runR = E.runReader ()
100+----------------------------------------
103+programEffectiveMVar :: ME.State Integer E.:> es => E.Eff es Integer
104+programEffectiveMVar = do
105+ n <- ME.get @Integer
110+ programEffectiveMVar
111+{-# NOINLINE programEffectiveMVar #-}
113+countdownEffectiveMVar :: Integer -> IO (Integer, Integer)
114+countdownEffectiveMVar n = E.runEff . ME.runState n $ programEffectiveMVar
116+countdownEffectiveMVarDeep :: Integer -> IO (Integer, Integer)
117+countdownEffectiveMVarDeep n = E.runEff
118+ . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
120+ . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
121+ $ programEffectiveMVar
123+ runR = E.runReader ()
93----------------------------------------
125----------------------------------------
94-- effective (dynamic)
126-- effective (dynamic)
@@ -103,11 +135,14 @@ programEffectiveDynamic = do
103 programEffectiveDynamic
135 programEffectiveDynamic
104{-# NOINLINE programEffectiveDynamic #-}
136{-# NOINLINE programEffectiveDynamic #-}
106−countdownEffectiveDynamic :: Integer -> IO (Integer, Integer)
138+countdownEffectiveDynPure :: Integer -> IO (Integer, Integer)
107−countdownEffectiveDynamic n = E.runEff . DE.runState n $ programEffectiveDynamic
139+countdownEffectiveDynPure n = E.runEff . DE.runState n $ programEffectiveDynamic
141+countdownEffectiveDynMVar :: Integer -> IO (Integer, Integer)
142+countdownEffectiveDynMVar n = E.runEff . DE.runStateMVar n $ programEffectiveDynamic
109−countdownEffectiveDynamicDeep :: Integer -> IO (Integer, Integer)
144+countdownEffectiveDynPureDeep :: Integer -> IO (Integer, Integer)
110−countdownEffectiveDynamicDeep n = E.runEff
145+countdownEffectiveDynPureDeep n = E.runEff
111 . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
146 . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
112 . DE.runState n
147 . DE.runState n
113 . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
148 . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
@@ -115,6 +150,15 @@ countdownEffectiveDynamicDeep n = E.runEff
116 runR = E.runReader ()
151 runR = E.runReader ()
153+countdownEffectiveDynMVarDeep :: Integer -> IO (Integer, Integer)
154+countdownEffectiveDynMVarDeep n = E.runEff
155+ . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
157+ . runR . runR . runR . runR . runR . runR . runR . runR . runR . runR
158+ $ programEffectiveDynamic
160+ runR = E.runReader ()
118----------------------------------------
162----------------------------------------
119-- fused-effects
163-- fused-effects