effect-monad-0.8.0.0: src/Control/Effect/Parameterised/AtomicState.hs
-- For clarity in type classes instances
{-# LANGUAGE InstanceSigs #-}
module Control.Effect.Parameterised.AtomicState
(get, put, Closed, Open, State(..)) where
-- Bye Monads... as we know them
import Prelude hiding (Monad(..))
-- Hello parameterised monads
import Control.Effect.Parameterised
import Control.Effect.Parameterised.State
newtype Closed s = Closed s deriving Show
newtype Open s = Open s deriving Show
-- get :: State s s
get :: State (Closed s) (Open s) s
get = State $ \(Closed s) -> (s, Open s)
-- put :: s -> State s ()
put :: t -> State (Open s) (Closed t) ()
put tx = State $ \(Open _) -> ((), Closed tx)