Add graph coloring register allocator.
[ghc-hetmet.git] / compiler / utils / State.hs
1
2 module State where
3
4 newtype State s a
5         = State
6         { runState :: s -> (# a, s #) }
7
8 instance Monad (State s) where
9     return x    = State $ \s -> (# x, s #)
10     m >>= n     = State $ \s ->
11                         case runState m s of
12                           (# r, s' #)   -> runState (n r) s'
13
14 get ::  State s s
15 get     = State $ \s -> (# s, s #)
16
17 put ::  s -> State s ()
18 put s'  = State $ \s -> (# (), s' #)
19
20 modify :: (s -> s) -> State s ()
21 modify f = State $ \s -> (# (), f s #)
22
23 evalState :: State s a -> s -> a
24 evalState s i
25         = case runState s i of
26                 (# a, s' #)     -> a
27
28 execState :: State s a -> s -> s
29 execState s i
30         = case runState s i of
31                 (# a, s' #)     -> s'