State.hs revision e771539425f4a0abef9f94cf4b63690f3603f682
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu{- |
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuModule : $Header$
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuDescription : State type from Control.Monad.State but no class MonadState
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuCopyright : C. Maeder and Uni Bremen 2002-2005
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian MaederMaintainer : Christian.Maeder@dfki.de
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuStability : experimental
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuPortability : portable
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuState type from Control.Monad.State but no class MonadState
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuThis module may be replaced by the (non-nhc98 module) Control.Monad.State
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu-}
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescumodule Common.Lib.State where
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu-- ---------------------------------------------------------------------------
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu-- Our fixed state monad
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescunewtype State s a = State { runState :: s -> (a, s) }
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuinstance Functor (State s) where
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu fmap f m = State $ \s -> let
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu (a, s') = runState m s
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu in (f a, s')
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuinstance Monad (State s) where
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu return a = State $ \s -> (a, s)
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu m >>= k = State $ \s -> let
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu (a, s') = runState m s
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu in runState (k a) s'
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu-- put and get are non-overloaded here!
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuget :: State s s
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuget = State $ \s -> (s, s)
da955132262baab309a50fdffe228c9efe68251dCui Jian
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuput :: s -> State s ()
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescuput s = State $ \_ -> ((), s)
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescumodify :: (s -> s) -> State s ()
da955132262baab309a50fdffe228c9efe68251dCui Jianmodify f = get >>= put . f
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescugets :: (s -> a) -> State s a
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescugets f = fmap f get
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuevalState :: State s a -> s -> a
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuevalState m = fst . runState m
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuexecState :: State s a -> s -> s
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuexecState m = snd . runState m
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
da955132262baab309a50fdffe228c9efe68251dCui JianmapState :: ((a, s) -> (b, s)) -> State s a -> State s b
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescumapState f m = State $ f . runState m
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuwithState :: (s -> s) -> State s a -> State s a
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai CodescuwithState f m = State $ runState m . f
fe649b05d4faaf8ba7b408384843d33e5937ef31Mihai Codescu