module FRP.Rhine.SyncSF.Except
( module FRP.Rhine.SyncSF.Except
, module X
, safe, safely, Empty, exceptS, runMSFExcept
)
where
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except as X
import Control.Monad.Trans.Reader
import Control.Monad.Trans.MSF.Except hiding (try, once, once_, throwOn, throwOn', throwS)
import qualified Control.Monad.Trans.MSF.Except as MSFE
import FRP.Rhine
type SyncExcept m cl a b e = MSFExcept (ReaderT (TimeInfo cl) m) a b e
commuteReaderExcept :: ReaderT r (ExceptT e m) a -> ExceptT e (ReaderT r m) a
commuteReaderExcept a = ExceptT $ ReaderT $ \r -> runExceptT $ runReaderT a r
try :: Monad m => SyncSF (ExceptT e m) cl a b -> SyncExcept m cl a b e
try = MSFE.try . liftMSFPurer commuteReaderExcept
once :: Monad m => (a -> m e) -> SyncExcept m cl a b e
once f = try $ arrMSync (lift . f) >>> throwS
once_ :: Monad m => m e -> SyncExcept m cl a b e
once_ = once . const
throwS :: Monad m => SyncSF (ExceptT e m) cl e a
throwS = arrMSync throwE
throwOn' :: Monad m => SyncSF (ExceptT e m) cl (Bool, e) ()
throwOn' = proc (b, e) -> if b
then throwS -< e
else returnA -< ()
throwOn :: Monad m => e -> SyncSF (ExceptT e m) cl Bool ()
throwOn e = proc b -> throwOn' -< (b, e)
step :: Monad m => (a -> m (b, e)) -> SyncExcept m cl a b e
step f = try $ proc a -> do
n <- count -< ()
(b, e) <- arrMSync (lift . f) -< a
_ <- throwOn' -< (n > (1 :: Int), e)
returnA -< b
currentInput :: Monad m => SyncExcept m cl e b e
currentInput = try throwS