free-theorems-counterexamples-0.3: Language/Haskell/FreeTheorems/Variations/CounterExamples/Internal/M.hs
module Language.Haskell.FreeTheorems.Variations.CounterExamples.Internal.M (M,runM,newInt,newAux,choice,abort,runMAll,track,assoc) where
type State s = (Int,Int,[String],[(Int,s)])
data M s a = M (State s -> [(a,State s)])
instance Monad (M s) where
return a = M (\s -> [(a,s)])
M m >>= k = M (\s -> concatMap (\(a,s') -> case k a of M l -> l s') (m s))
runM :: M s a -> Maybe (a, [String], [(Int,s)])
runM (M m) = case m (1,-1,[],[]) of
[] -> Nothing
((a,(_,_,ls,as)):_) -> Just (a,reverse ls,as)
runMAll :: M s a -> [(a, [String], [(Int,s)])]
runMAll (M m) = map (\(a,(_,_,ls,as)) -> (a,reverse ls,as)) (m (1,0,[],[]))
newInt :: M s Int
newInt = M (\(i,j,ls,as) -> [(i,(i+1,j,ls,as))])
newAux :: M s Int
newAux = M (\(i,j,ls,as) -> [(j,(i,j-1,ls,as))])
choice :: M s a -> M s a -> M s a
choice (M m) (M l) = M (\s -> m s ++ l s)
abort :: M s a
abort = M (\s -> [])
track :: String -> M s ()
track l = M (\(i,j,ls,as) -> [((),(i,j,l:ls,as))])
assoc :: Int -> s -> M s ()
assoc a s = M (\(i,j,ls,as) -> [((),(i,j,ls,(a,s):as))])