bearriver 0.10.4.1 → 0.10.4.2
raw patch · 2 files changed
+32/−14 lines, 2 filesdep +MonadRandom
Dependencies added: MonadRandom
Files
- bearriver.cabal +2/−2
- src/FRP/BearRiver.hs +30/−12
bearriver.cabal view
@@ -1,5 +1,5 @@ name: bearriver-version: 0.10.4.1+version: 0.10.4.2 synopsis: A replacement of Yampa based on Monadic Stream Functions. description: A Yampa replacement built using Dunai. homepage: keera.co.uk@@ -23,7 +23,7 @@ FRP.Yampa.AffineSpace, FRP.BearRiver - build-depends: base >=4.7 && <5, transformers >=0.3, mtl, dunai+ build-depends: base >=4.7 && <5, transformers >=0.3, mtl, dunai, MonadRandom hs-source-dirs: src/ default-language: Haskell2010
src/FRP/BearRiver.hs view
@@ -12,19 +12,24 @@ -- there do not seem to exist any obvious limitations. import Control.Applicative-import Control.Arrow as X-import qualified Control.Category as Category-import Control.Monad (mapM)---import Control.Monad.Reader+import Control.Arrow as X+import qualified Control.Category as Category+import Control.Monad (mapM)+import Control.Monad.Random import Control.Monad.Trans.Maybe import Control.Monad.Trans.MSF-import Data.Traversable as T+import Control.Monad.Trans.MSF.Except as MSF+import Control.Monad.Trans.MSF.Random import Data.Functor.Identity import Data.Maybe-import Data.MonadicStreamFunction as X hiding (reactimate, switch, sum, trace)-import qualified Data.MonadicStreamFunction as MSF-import Data.MonadicStreamFunction.ArrowLoop-import FRP.Yampa.VectorSpace as X+import Data.MonadicStreamFunction as X hiding (reactimate,+ sum,+ switch,+ trace)+import qualified Data.MonadicStreamFunction as MSF+import Data.MonadicStreamFunction.Instances.ArrowLoop+import Data.Traversable as T+import FRP.Yampa.VectorSpace as X type Time = Double type DTime = Double@@ -153,6 +158,21 @@ ct = if t' < 0 then constant (NoEvent, t') else go return ((e, t'), ct) +occasionally :: MonadRandom m + => Time -- ^ The time /q/ after which the event should be produced on average+ -> b -- ^ Value to produce at time of event+ -> SF m a (Event b)+occasionally tAvg b+ | tAvg <= 0 = error "dunai: Non-positive average interval in occasionally."+ | otherwise = proc _ -> do+ r <- getRandomRS (0, 1) -< ()+ dt <- timeDelta -< ()+ let p = 1 - exp (-(dt / tAvg))+ returnA -< if r < p then Event b else NoEvent+ where+ timeDelta :: Monad m => SF m a DTime+ timeDelta = arrM_ ask+ (-->) :: Monad m => b -> SF m a b -> SF m a b b0 --> sf = MSF $ \a -> do (_, ct) <- unMSF sf a@@ -209,7 +229,7 @@ let b' = f a a dt b return (b, iterFrom f b') -reactimate :: IO a -> (Bool -> IO (DTime, Maybe a)) -> (Bool -> b -> IO Bool) -> SF Identity a b -> IO ()+reactimate :: Monad m => m a -> (Bool -> m (DTime, Maybe a)) -> (Bool -> b -> m Bool) -> SF Identity a b -> m () reactimate senseI sense actuate sf = do -- runMaybeT $ MSF.reactimate $ liftMSFTrans (senseSF >>> sfIO) >>> actuateSF MSF.reactimateB $ senseSF >>> sfIO >>> actuateSF@@ -234,6 +254,4 @@ -- * Auxiliary -- ** Tuples- dup x = (x,x)-swap (x,y) = (y,x)