data Result a e = Ok a | Error e
newtype StateError s e a = StateError { runStateError :: s -> (Result a e, s) }
instance Functor (StateError s e
) where fmap f x
= x
>>= (pure
. f
)
instance Applicative (StateError s e) where
pure x = StateError $ \s -> (Ok x, s)
x <*> y = ap x y
instance Monad (StateError s e
) where
m >>= f = StateError $
\s -> case runStateError m s of
(Ok x, s1) -> runStateError (f x) s1
(Error e, s1) -> (Error e, s1)
get = StateError $ \s -> ((Ok s), s)
put s = StateError $ \_ -> ((Ok ()), s)
aW1wb3J0IENvbnRyb2wuTW9uYWQKCmRhdGEgUmVzdWx0IGEgZSA9IE9rIGEgfCBFcnJvciBlCgpuZXd0eXBlIFN0YXRlRXJyb3IgcyBlIGEgPSBTdGF0ZUVycm9yIHsgcnVuU3RhdGVFcnJvciA6OiBzIC0+IChSZXN1bHQgYSBlLCBzKSB9CgppbnN0YW5jZSBGdW5jdG9yIChTdGF0ZUVycm9yIHMgZSkgd2hlcmUKICBmbWFwIGYgeCA9IHggPj49IChwdXJlIC4gZikKCmluc3RhbmNlIEFwcGxpY2F0aXZlIChTdGF0ZUVycm9yIHMgZSkgd2hlcmUKICBwdXJlIHggPSBTdGF0ZUVycm9yICQgXHMgLT4gKE9rIHgsIHMpCiAgeCA8Kj4geSA9IGFwIHggeQogIAppbnN0YW5jZSBNb25hZCAoU3RhdGVFcnJvciBzIGUpIHdoZXJlCiAgcmV0dXJuIHggPSBwdXJlIHgKCiAgbSA+Pj0gZiA9IFN0YXRlRXJyb3IgJAogICAgXHMgLT4gY2FzZSBydW5TdGF0ZUVycm9yIG0gcyBvZgogICAgICAgICAgICAoT2sgeCwgczEpIC0+IHJ1blN0YXRlRXJyb3IgKGYgeCkgczEKICAgICAgICAgICAgKEVycm9yIGUsIHMxKSAtPiAoRXJyb3IgZSwgczEpCgpnZXQgPSBTdGF0ZUVycm9yICQgXHMgLT4gKChPayBzKSwgcykKCnB1dCBzID0gU3RhdGVFcnJvciAkIFxfIC0+ICgoT2sgKCkpLCBzKQoKbWFpbiA9IHJldHVybiAoKQ==