module Data.State where
import Control.Arrow
import qualified Control.Arrow.Operations as AO
import Control.Monad.State as ST
import Data.Dynamic
class LocalState sg sl where
getState :: sg -> sl
putState :: sl -> sg -> sg
instance LocalState a a where
getState = id
putState a _ = a
class DynamicState sg where
getDynamic :: sg -> Dynamic
putDynamic :: Dynamic -> sg -> sg
class ZeroState sl where
zeroState :: sl
get :: (ST.MonadState sg m, LocalState sg sl) => m sl
get = liftM getState ST.get
put :: (ST.MonadState sg m, LocalState sg sl) => sl -> m ()
put sl = do
sg <- ST.get
ST.put (putState sl sg)
fetch :: (AO.ArrowState sg a, LocalState sg sl) => a e sl
fetch = getState ^<< AO.fetch
store :: (ArrowApply a, AO.ArrowState sg a, LocalState sg sl) => a sl ()
store = proc sl -> AO.store <<< putState sl ^<< AO.fetch -<< ()