module FRP.BearRiver.Random
(
RandomGen(..)
, Random(..)
, noise
, noiseR
, occasionally
)
where
import System.Random (Random (..), RandomGen (..))
import Control.Monad.Trans.MSF.Except (dSwitch)
import Control.Monad.Trans.MSF.Reader (readerS)
import Data.MonadicStreamFunction (MSF, constM, feedback)
import FRP.BearRiver.Event (Event (..))
import FRP.BearRiver.InternalCore (DTime, SF, Time, arr)
noise :: (RandomGen g, Random b, Monad m) => g -> SF m a b
noise :: forall g b (m :: * -> *) a.
(RandomGen g, Random b, Monad m) =>
g -> SF m a b
noise g
g0 = [b] -> SF m a b
forall (m :: * -> *) b a. Monad m => [b] -> SF m a b
streamToSF (g -> [b]
forall g. RandomGen g => g -> [b]
forall a g. (Random a, RandomGen g) => g -> [a]
randoms g
g0)
noiseR :: (RandomGen g, Random b, Monad m) => (b, b) -> g -> SF m a b
noiseR :: forall g b (m :: * -> *) a.
(RandomGen g, Random b, Monad m) =>
(b, b) -> g -> SF m a b
noiseR (b, b)
range g
g0 = [b] -> SF m a b
forall (m :: * -> *) b a. Monad m => [b] -> SF m a b
streamToSF ((b, b) -> g -> [b]
forall g. RandomGen g => (b, b) -> g -> [b]
forall a g. (Random a, RandomGen g) => (a, a) -> g -> [a]
randomRs (b, b)
range g
g0)
streamToSF :: Monad m => [b] -> SF m a b
streamToSF :: forall (m :: * -> *) b a. Monad m => [b] -> SF m a b
streamToSF [b]
ls = [b] -> MSF (ClockInfo m) (a, [b]) (b, [b]) -> MSF (ClockInfo m) a b
forall (m :: * -> *) c a b.
Monad m =>
c -> MSF m (a, c) (b, c) -> MSF m a b
feedback [b]
ls (MSF (ClockInfo m) (a, [b]) (b, [b]) -> MSF (ClockInfo m) a b)
-> MSF (ClockInfo m) (a, [b]) (b, [b]) -> MSF (ClockInfo m) a b
forall a b. (a -> b) -> a -> b
$ ((a, [b]) -> (b, [b])) -> MSF (ClockInfo m) (a, [b]) (b, [b])
forall b c. (b -> c) -> MSF (ClockInfo m) b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (((a, [b]) -> (b, [b])) -> MSF (ClockInfo m) (a, [b]) (b, [b]))
-> ((a, [b]) -> (b, [b])) -> MSF (ClockInfo m) (a, [b]) (b, [b])
forall a b. (a -> b) -> a -> b
$ [b] -> (b, [b])
forall {a}. [a] -> (a, [a])
fAux ([b] -> (b, [b])) -> ((a, [b]) -> [b]) -> (a, [b]) -> (b, [b])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, [b]) -> [b]
forall a b. (a, b) -> b
snd
where
fAux :: [a] -> (a, [a])
fAux [] = [Char] -> (a, [a])
forall a. HasCallStack => [Char] -> a
error [Char]
"BearRiver: streamToSF: Empty list!"
fAux (a
b:[a]
bs) = (a
b, [a]
bs)
occasionally :: (RandomGen g, Monad m) => g -> Time -> b -> SF m a (Event b)
occasionally :: forall g (m :: * -> *) b a.
(RandomGen g, Monad m) =>
g -> Time -> b -> SF m a (Event b)
occasionally g
g Time
tAvg b
x | Time
tAvg Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
> Time
0 = MSF (ReaderT Time m) a (Event b)
forall {a}. MSF (ReaderT Time m) a (Event b)
tf0
| Bool
otherwise = [Char] -> MSF (ReaderT Time m) a (Event b)
forall a. HasCallStack => [Char] -> a
error ([Char] -> MSF (ReaderT Time m) a (Event b))
-> [Char] -> MSF (ReaderT Time m) a (Event b)
forall a b. (a -> b) -> a -> b
$ [Char]
"BearRiver: occasionally: "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"Non-positive average interval."
where
tf0 :: MSF (ReaderT Time m) a (Event b)
tf0 = MSF (ReaderT Time m) a (Event b, Maybe ())
-> (() -> MSF (ReaderT Time m) a (Event b))
-> MSF (ReaderT Time m) a (Event b)
forall (m :: * -> *) a b c.
Monad m =>
MSF m a (b, Maybe c) -> (c -> MSF m a b) -> MSF m a b
dSwitch
(ReaderT Time m (Event b, Maybe ())
-> MSF (ReaderT Time m) a (Event b, Maybe ())
forall (m :: * -> *) b a. Monad m => m b -> MSF m a b
constM (ReaderT Time m (Event b, Maybe ())
-> MSF (ReaderT Time m) a (Event b, Maybe ()))
-> ReaderT Time m (Event b, Maybe ())
-> MSF (ReaderT Time m) a (Event b, Maybe ())
forall a b. (a -> b) -> a -> b
$ (Event b, Maybe ()) -> ReaderT Time m (Event b, Maybe ())
forall a. a -> ReaderT Time m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Event b
forall a. Event a
NoEvent, () -> Maybe ()
forall a. a -> Maybe a
Just ()))
(MSF (ReaderT Time m) a (Event b)
-> () -> MSF (ReaderT Time m) a (Event b)
forall a b. a -> b -> a
const (MSF (ReaderT Time m) a (Event b)
-> () -> MSF (ReaderT Time m) a (Event b))
-> MSF (ReaderT Time m) a (Event b)
-> ()
-> MSF (ReaderT Time m) a (Event b)
forall a b. (a -> b) -> a -> b
$ [Time]
-> MSF (ReaderT Time m) (a, [Time]) (Event b, [Time])
-> MSF (ReaderT Time m) a (Event b)
forall (m :: * -> *) c a b.
Monad m =>
c -> MSF m (a, c) (b, c) -> MSF m a b
feedback (g -> [Time]
forall g. RandomGen g => g -> [Time]
forall a g. (Random a, RandomGen g) => g -> [a]
randoms g
g :: [Time]) (MSF (ReaderT Time m) (a, [Time]) (Event b, [Time])
-> MSF (ReaderT Time m) a (Event b))
-> MSF (ReaderT Time m) (a, [Time]) (Event b, [Time])
-> MSF (ReaderT Time m) a (Event b)
forall a b. (a -> b) -> a -> b
$ MSF m (Time, (a, [Time])) (Event b, [Time])
-> MSF (ReaderT Time m) (a, [Time]) (Event b, [Time])
forall (m :: * -> *) r a b.
Monad m =>
MSF m (r, a) b -> MSF (ReaderT r m) a b
readerS (MSF m (Time, (a, [Time])) (Event b, [Time])
-> MSF (ReaderT Time m) (a, [Time]) (Event b, [Time]))
-> MSF m (Time, (a, [Time])) (Event b, [Time])
-> MSF (ReaderT Time m) (a, [Time]) (Event b, [Time])
forall a b. (a -> b) -> a -> b
$ ((Time, (a, [Time])) -> (Event b, [Time]))
-> MSF m (Time, (a, [Time])) (Event b, [Time])
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (Time, (a, [Time])) -> (Event b, [Time])
forall {a}. (Time, (a, [Time])) -> (Event b, [Time])
occAux)
occAux :: (Time, (a, [Time])) -> (Event b, [Time])
occAux (Time
_, (a
_, [])) = [Char] -> (Event b, [Time])
forall a. HasCallStack => [Char] -> a
error [Char]
"BearRiver: occasionally: Empty list!"
occAux (Time
dt, (a
_, Time
r:[Time]
rs)) =
(if Time
r Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
< Time
p then b -> Event b
forall a. a -> Event a
Event b
x else Event b
forall a. Event a
NoEvent, [Time]
rs)
where
p :: Time
p = Time
1 Time -> Time -> Time
forall a. Num a => a -> a -> a
- Time -> Time
forall a. Floating a => a -> a
exp (- (Time
dt Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
tAvg))