1 | module Data.MSF.Trans
3 | import Control.Monad.Identity
4 | import Control.Monad.Reader
5 | import Control.Monad.State
6 | import Control.Monad.Writer
9 | import Data.MSF.Running
25 | -> (forall c . (i1 -> m1(o1,c)) -> i2 -> m2(o2,c))
28 | morphGS f sf = feedback sf (arrM run >>^ \(o2,sf2) => [sf2,o2])
29 | where run : HList [MSF m1 i1 o1,i2] -> m2 (o2, MSF m1 i1 o1)
30 | run [sf1,vi2] = f (step sf1) vi2
39 | morph : Monad m1 => (forall c . m1 c -> m2 c) -> MSF m1 i1 o1 -> MSF m2 i1 o1
40 | morph f = morphGS (f .)
49 | fromPure : Monad m => MSF Identity i o -> MSF m i o
50 | fromPure = morph (pure . runIdentity)
58 | get : MonadState s m => MSF m i s
63 | put : MonadState s m => MSF m s ()
68 | modify : MonadState s m => MSF m (s -> s) ()
69 | modify = arrM modify
74 | fromState : Monad m => MSF (StateT s m) i o -> MSF m (HList [s,i]) (HList [s,o])
76 | morphGS (\f,[vs,vi] => (\(vs2,vo,vc) => ([vs2,vo],vc)) <$> runStateT vs (f vi))
83 | loopState : Monad m => (ini : s) -> MSF (StateT s m) i o -> MSF m i o
84 | loopState ini = feedback ini . fromState
88 | fromState_ : Monad m => MSF (StateT s m) () () -> MSF m s s
89 | fromState_ = morphGS (\f,vs => (\(vs2,_,vc) => (vs2,vc)) <$> runStateT vs (f ()))
94 | toState : Monad m => MSF m (HList [s,i]) (HList [s,o]) -> MSF (StateT s m) i o
96 | morphGS (\f,vi => ST $
\vs => (\([vs2,vo],vc) => (vs2,vo,vc)) <$> f [vs,vi])
100 | toState_ : Monad m => MSF m s s -> MSF (StateT s m) () ()
101 | toState_ = morphGS (\f,_ => ST $
\vs => (\(vs2,vc) => (vs2,(),vc)) <$> f vs)
109 | ask : MonadReader e m => MSF m i e
115 | fromReader : Monad m => MSF (ReaderT e m) i o -> MSF m (HList [e,i]) o
116 | fromReader = morphGS (\f,[ve,vi] => runReaderT ve (f vi))
122 | withEnv : Monad m => (env : e) -> (sf : MSF (ReaderT e m) i o) -> MSF m i o
123 | withEnv env sf = fan [ const env, id ] >>> fromReader sf
127 | fromReader_ : Monad m => MSF (ReaderT e m) () o -> MSF m e o
128 | fromReader_ = morphGS (\f,ve => runReaderT ve (f ()))
133 | toReader : Monad m => MSF m (HList [e,i]) o -> MSF (ReaderT e m) i o
134 | toReader = morphGS (\f,vi => MkReaderT $
\ve => f [ve,vi])
138 | toReader_ : Monad m => MSF m e o -> MSF (ReaderT e m) () o
139 | toReader_ = morphGS (\f,_ => MkReaderT f)
148 | tell : MonadWriter w m => MSF m w ()
154 | fromWriter : Monoid w => Monad m => MSF (WriterT w m) i o -> MSF m i (HList [w,o])
156 | morphGS (\f,vi => (\((vo,vc),vw) => ([vw,vo],vc)) <$> runWriterT (f vi))
160 | fromWriter_ : Monoid w => Monad m => MSF (WriterT w m) i () -> MSF m i w
162 | morphGS (\f,vi => (\((_,vc),vw) => (vw,vc)) <$> runWriterT (f vi))
167 | toWriter : Monoid w => Monad m => MSF m i (HList [w,o]) -> MSF (WriterT w m) i o
170 | MkWriterT $
\vw => (\([vw2,vo],vc) => ((vo,vc),vw <+> vw2)) <$> f vi)
174 | toWriter_ : Monoid w => Monad m => MSF m i w -> MSF (WriterT w m) i ()
177 | MkWriterT $
\vw => (\(vw2,vc) => (((),vc),vw <+> vw2)) <$> f vi)