module FRP.Euphoria.Signal
(
Signal
, SignalGen
, execute
, external
, start
, MonadSignalGen(..)
, delayS
, generatorS
, snapshotS
, memoS
, transferS
) where
import FRP.Elerea.Simple
import Control.Monad.Fix
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer.Lazy as Lazy
import Control.Monad.Trans.State.Lazy as Lazy
import Control.Monad.Trans.RWS.Lazy as Lazy
import Control.Monad.Trans.Writer.Strict as Strict
import Control.Monad.Trans.State.Strict as Strict
import Control.Monad.Trans.RWS.Strict as Strict
import Control.Monad.Trans.Except
import Control.Monad.Trans.Class (lift)
class MonadFix m => MonadSignalGen m where
liftSignalGen :: SignalGen a -> m a
instance MonadSignalGen SignalGen where
liftSignalGen = id
instance MonadSignalGen m => MonadSignalGen (IdentityT m) where
liftSignalGen = lift . liftSignalGen
instance MonadSignalGen m => MonadSignalGen (MaybeT m) where
liftSignalGen = lift . liftSignalGen
instance MonadSignalGen m => MonadSignalGen (ReaderT r m) where
liftSignalGen = lift . liftSignalGen
instance (MonadSignalGen m, Monoid w) => MonadSignalGen (Lazy.WriterT w m) where
liftSignalGen = lift . liftSignalGen
instance MonadSignalGen m => MonadSignalGen (Lazy.StateT s m) where
liftSignalGen = lift . liftSignalGen
instance (MonadSignalGen m, Monoid w) => MonadSignalGen (Lazy.RWST r w s m) where
liftSignalGen = lift . liftSignalGen
instance (MonadSignalGen m, Monoid w) => MonadSignalGen (Strict.WriterT w m) where
liftSignalGen = lift . liftSignalGen
instance MonadSignalGen m => MonadSignalGen (Strict.StateT s m) where
liftSignalGen = lift . liftSignalGen
instance (MonadSignalGen m, Monoid w) => MonadSignalGen (Strict.RWST r w s m) where
liftSignalGen = lift . liftSignalGen
instance MonadSignalGen m => MonadSignalGen (ExceptT e m) where
liftSignalGen = lift . liftSignalGen
delayS :: MonadSignalGen m => a -> Signal a -> m (Signal a)
delayS a s = liftSignalGen (delay a s)
generatorS :: MonadSignalGen m => Signal (SignalGen a) -> m (Signal a)
generatorS = liftSignalGen . generator
snapshotS :: MonadSignalGen m => Signal a -> m a
snapshotS = liftSignalGen . snapshot
memoS :: MonadSignalGen m => Signal a -> m (Signal a)
memoS = liftSignalGen . memo
transferS :: MonadSignalGen m => a -> (t -> a -> a)-> Signal t -> m (Signal a)
transferS a k = liftSignalGen . transfer a k