module Control.Monad.Eff.StateRW (
runStateRW,
Reader,
Writer,
tell,
ask
) where
import Control.Monad.Eff
import Control.Monad.Eff.Internal
import Control.Monad.Eff.Reader
import Control.Monad.Eff.Writer
import Data.OpenUnion
import Data.FTCQueue
runStateRW :: s -> Eff (Writer s ': Reader s ': r) a -> Eff r (a, s)
runStateRW s (Pure a) = return (a, s)
runStateRW s (Impure u q) = case decomp u of
Right (Put s') -> k s' ()
Left u' -> case decomp u' of
Right Get -> k s s
Left u'' -> Impure u'' (tsingleton (k s))
where k s = qComp q (runStateRW s)