merge GHC HEAD
[ghc-hetmet.git] / compiler / utils / State.hs
index bf5b3a0..0b6a285 100644 (file)
@@ -1,8 +1,20 @@
 
-module State where
+module State (module State, mapAccumLM {- XXX hack -}) where
+
+import MonadUtils
 
 newtype State s a = State { runState' :: s -> (# a, s #) }
 
+instance Functor (State s) where
+    fmap f m  = State $ \s -> case runState' m s of
+                              (# r, s' #) -> (# f r, s' #)
+
+instance Applicative (State s) where
+   pure x   = State $ \s -> (# x, s #)
+   m <*> n  = State $ \s -> case runState' m s of
+                            (# f, s' #) -> case runState' n s' of
+                                           (# x, s'' #) -> (# f x, s'' #)
+
 instance Monad (State s) where
     return x = State $ \s -> (# x, s #)
     m >>= n  = State $ \s -> case runState' m s of
@@ -34,18 +46,3 @@ execState s i = case runState' s i of
 runState :: State s a -> s -> (a, s)
 runState s i = case runState' s i of
                (# a, s' #) -> (a, s')
-
-
-mapAccumLM
-        :: Monad m
-        => (acc -> x -> m (acc, y))     -- ^ combining funcction
-        -> acc                          -- ^ initial state
-        -> [x]                          -- ^ inputs
-        -> m (acc, [y])                 -- ^ final state, outputs
-
-mapAccumLM _ s [] = return (s, [])
-mapAccumLM f s (x:xs)
- = do (s1, x')  <- f s x
-      (s2, xs') <- mapAccumLM f s1 xs
-      return (s2, x' : xs')
-