module FRP.Timeless.Prefab.Discrete
where
import Control.Arrow
import Control.Applicative
import Data.Monoid
import Control.Monad
import Control.Monad.IO.Class
import FRP.Timeless.Signal
import FRP.Timeless.Prefab.Primitive
occursFor :: (Monad m) => b
-> Int
-> Signal s m a b
occursFor b n = mkPW_ (\_ -> b) >>> inhibitsAfter n
snapOnce :: (Monad m) => Signal s m a a
snapOnce = SGen $ \_ ma -> return (ma, SConst ma)
inhibitsAfter :: Int -> Signal s m a a
inhibitsAfter n
| n == 0 = mkEmpty
| n > 0 = mkPureN $ \a -> (Just a, inhibitsAfter $ n1)
| otherwise = error "[ERROR] inhibitsAfter: Nothing will inhibit in the past!"
runAndHold :: (Monad m) =>
Signal s m a b
-> Signal s m a b
runAndHold sig = inhibitsAfter 1 >>> sig >>> snapOnce
rising :: (Monad m) =>
Bool
-> Signal s m Bool Bool
rising b0 = mkPWN $ f b0
where
f False b = (b, rising b)
f True b = (False, rising b)
falling :: (Monad m) =>
Bool
-> Signal s m Bool Bool
falling b0 = mkPWN $ f b0
where
f False b = (False, rising b)
f True b = (not b, rising b)
edge :: (Monad m) =>
Bool
-> Signal s m Bool Bool
edge b0 = proc b -> do
b'1 <- rising b0 -< b
b'2 <- falling b0 -< b
returnA -< b'1 || b'2