Last fixes
[darcs-mirror-polyfix.git] / M.hs
1 module M (M,runM,newInt,newAux,choice,abort,runMAll,track) where
2
3 type State = (Int,Int,[String])
4
5 data M a = M (State -> [(a,State)])
6
7 instance Monad M where
8     return a = M (\s -> [(a,s)])
9     M m >>= k = M (\s -> concatMap (\(a,s') -> case k a of M l -> l s') (m s))
10
11 runM :: M a -> Maybe (a, [String])
12 runM (M m) = case m (1,0,[]) of
13                []        -> Nothing
14                ((a,(_,_,ls)):_) -> Just (a,reverse ls)
15
16 runMAll :: M a -> [(a, [String])]
17 runMAll (M m) = map (\(a,(_,_,ls)) -> (a,reverse ls)) (m (1,0,[]))
18
19 newInt :: M Int
20 newInt = M (\(i,j,ls) -> [(i,(i+1,j,ls))])
21
22 newAux :: M Int
23 newAux = M (\(i,j,ls) -> [(j,(i,j-1,ls))])
24
25 choice :: M a -> M a -> M a
26 choice (M m) (M l) = M (\s -> m s ++ l s)
27
28 abort :: M a
29 abort = M (\s -> [])
30
31 track :: String -> M ()
32 track l = M (\(i,j,ls) -> [((),(i,j,l:ls))])