{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TemplateHaskell #-}
module Disco.Effects.Counter where
import Polysemy
import Polysemy.State
data Counter m a where
Next :: Counter m Integer
makeSem ''Counter
runCounter' :: Integer -> Sem (Counter ': r) a -> Sem r a
runCounter' :: forall (r :: EffectRow) a.
Integer -> Sem (Counter : r) a -> Sem r a
runCounter' Integer
i =
Integer -> Sem (State Integer : r) a -> Sem r a
forall s (r :: EffectRow) a. s -> Sem (State s : r) a -> Sem r a
evalState Integer
i
(Sem (State Integer : r) a -> Sem r a)
-> (Sem (Counter : r) a -> Sem (State Integer : r) a)
-> Sem (Counter : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall (rInitial :: EffectRow) x.
Counter (Sem rInitial) x -> Sem (State Integer : r) x)
-> Sem (Counter : r) a -> Sem (State Integer : r) a
forall (e1 :: Effect) (e2 :: Effect) (r :: EffectRow) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: EffectRow) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Counter (Sem rInitial) x
Next -> do
x
n <- Sem (State Integer : r) x
forall s (r :: EffectRow). Member (State s) r => Sem r s
get
x -> Sem (State Integer : r) ()
forall s (r :: EffectRow). Member (State s) r => s -> Sem r ()
put (x
n x -> x -> x
forall a. Num a => a -> a -> a
+ x
1)
x -> Sem (State Integer : r) x
forall a. a -> Sem (State Integer : r) a
forall (m :: * -> *) a. Monad m => a -> m a
return x
n
runCounter :: Sem (Counter ': r) a -> Sem r a
runCounter :: forall (r :: EffectRow) a. Sem (Counter : r) a -> Sem r a
runCounter = Integer -> Sem (Counter : r) a -> Sem r a
forall (r :: EffectRow) a.
Integer -> Sem (Counter : r) a -> Sem r a
runCounter' Integer
0