module Reflex.Monad.ReflexM where
import Control.Applicative
import Control.Monad.Fix
import Reflex.Monad.Class
import Data.Traversable
import Prelude
newtype ReflexM t a = ReflexM { runReflexM :: forall m. MonadReflex t m => m a }
instance Functor (ReflexM t) where
fmap f (ReflexM a) = ReflexM (f <$> a)
instance Applicative (ReflexM t) where
pure a = ReflexM (pure a)
(<*>) (ReflexM f) (ReflexM a) = ReflexM (f <*> a)
instance Monad (ReflexM t) where
return a = ReflexM (return a)
(>>=) (ReflexM m) f = ReflexM (m >>= runReflexM . f)
instance MonadFix (ReflexM t) where
mfix f = ReflexM $ mfix (runReflexM . f)
instance MonadSample t (ReflexM t) where
sample b = ReflexM (sample b)
instance MonadHold t (ReflexM t) where
hold initial e = ReflexM (hold initial e)
instance Reflex t => MonadSwitch t (ReflexM t) where
switchM (Updated initial e) = do
a <- runReflexM initial
return $ Updated a $ pushAlways runReflexM e
switchMapM (UpdatedMap initial e) = do
a <- traverse runReflexM initial
return $ UpdatedMap a $
pushAlways (traverse $ traverse runReflexM) e