-- 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)