RSolve-0.1.0.1: src/RSolve/BrMonad.hs
module RSolve.BrMonad where
import Control.Monad
import Control.Monad.Fail
import Control.Applicative
newtype Br s a = Br {runBr :: s -> [(a, s)]}
instance Functor (Br s) where
fmap = liftM
instance Applicative (Br s) where
pure = return
(<*>) = ap
instance MonadFail (Br s) where
fail _ = empty
instance Monad (Br s) where
m >>= k =
Br $ \s ->
let xs = runBr m s
in join [ runBr (k a) s | (a, s) <- xs]
return a = Br $ \s -> [(a, s)]
instance Alternative (Br s) where
empty = Br $ const []
ma <|> mb = Br $ \s -> runBr ma s ++ runBr mb s
getBy f = Br $ \s -> [(f s, s)]
putBy f = Br $ \s -> [((), f s)]