{-# LANGUAGE TupleSections #-}
module MyState (
MyState(..)
, get
, put
, modify
, evalState
, execState
) where
newtype MyState s a = MyState { forall s a. MyState s a -> s -> (a, s)
runState :: s -> (a, s) }
get :: MyState s s
get :: forall s. MyState s s
get = (s -> (s, s)) -> MyState s s
forall s a. (s -> (a, s)) -> MyState s a
MyState ((s -> (s, s)) -> MyState s s) -> (s -> (s, s)) -> MyState s s
forall a b. (a -> b) -> a -> b
$ \s
s -> (s
s, s
s)
put :: s -> MyState s ()
put :: forall s. s -> MyState s ()
put s
s = (s -> ((), s)) -> MyState s ()
forall s a. (s -> (a, s)) -> MyState s a
MyState ((s -> ((), s)) -> MyState s ()) -> (s -> ((), s)) -> MyState s ()
forall a b. (a -> b) -> a -> b
$ ((), s) -> s -> ((), s)
forall a b. a -> b -> a
const ((), s
s)
modify :: (s -> s) -> MyState s ()
modify :: forall s. (s -> s) -> MyState s ()
modify s -> s
f = MyState s s
forall s. MyState s s
get MyState s s -> (s -> MyState s ()) -> MyState s ()
forall a b. MyState s a -> (a -> MyState s b) -> MyState s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= s -> MyState s ()
forall s. s -> MyState s ()
put (s -> MyState s ()) -> (s -> s) -> s -> MyState s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> s
f
evalState :: MyState s a -> s -> a
evalState :: forall s a. MyState s a -> s -> a
evalState MyState s a
f = (a, s) -> a
forall a b. (a, b) -> a
fst ((a, s) -> a) -> (s -> (a, s)) -> s -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyState s a -> s -> (a, s)
forall s a. MyState s a -> s -> (a, s)
runState MyState s a
f
execState :: MyState s a -> s -> s
execState :: forall s a. MyState s a -> s -> s
execState MyState s a
f = (a, s) -> s
forall a b. (a, b) -> b
snd ((a, s) -> s) -> (s -> (a, s)) -> s -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MyState s a -> s -> (a, s)
forall s a. MyState s a -> s -> (a, s)
runState MyState s a
f
instance Functor (MyState s) where
fmap :: forall a b. (a -> b) -> MyState s a -> MyState s b
fmap a -> b
f (MyState s -> (a, s)
stateFx) =
(s -> (b, s)) -> MyState s b
forall s a. (s -> (a, s)) -> MyState s a
MyState (\s
s -> let (a
fx, s
s') = s -> (a, s)
stateFx s
s
in (a -> b
f a
fx, s
s'))
instance Applicative (MyState s) where
pure :: forall a. a -> MyState s a
pure a
x = (s -> (a, s)) -> MyState s a
forall s a. (s -> (a, s)) -> MyState s a
MyState (a
x,)
<*> :: forall a b. MyState s (a -> b) -> MyState s a -> MyState s b
(<*>) (MyState s -> (a -> b, s)
stateFx) (MyState s -> (a, s)
nextFx) =
(s -> (b, s)) -> MyState s b
forall s a. (s -> (a, s)) -> MyState s a
MyState (\s
s -> let (a -> b
fx', s
s') = s -> (a -> b, s)
stateFx s
s
(a
fx'', s
s'') = s -> (a, s)
nextFx s
s'
in (a -> b
fx' a
fx'', s
s''))
instance Monad (MyState s) where
return :: forall a. a -> MyState s a
return = a -> MyState s a
forall a. a -> MyState s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
>>= :: forall a b. MyState s a -> (a -> MyState s b) -> MyState s b
(>>=) (MyState s -> (a, s)
stateFx) a -> MyState s b
nextFx =
(s -> (b, s)) -> MyState s b
forall s a. (s -> (a, s)) -> MyState s a
MyState (\s
s -> let (a
fx, s
s') = s -> (a, s)
stateFx s
s
in MyState s b -> s -> (b, s)
forall s a. MyState s a -> s -> (a, s)
runState (a -> MyState s b
nextFx a
fx) s
s')