{-# LANGUAGE CPP #-}
{-# LANGUAGE Rank2Types #-}
#if __GLASGOW_HASKELL__ < 800
{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
#else
{-# OPTIONS_GHC -Wno-deprecations #-}
#endif
module FRP.BearRiver.Switches
(
switch, dSwitch
, rSwitch, drSwitch
, kSwitch, dkSwitch
, parB
, pSwitchB, dpSwitchB
, rpSwitchB, drpSwitchB
, par
, pSwitch, dpSwitch
, rpSwitch, drpSwitch
, parZ
, pSwitchZ
, dpSwitchZ
, rpSwitchZ
, drpSwitchZ
, parC
)
where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative (Applicative (..), (<$>))
#endif
import Control.Arrow (arr, first)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Reader (ask, runReaderT)
import Data.Traversable as T
import Control.Monad.Trans.MSF (local, performOnFirstSample)
import Control.Monad.Trans.MSF.List (sequenceS, widthFirst)
import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))
import FRP.BearRiver.Basic ((>=-))
import FRP.BearRiver.Event (Event (..), noEventSnd)
import FRP.BearRiver.InternalCore (DTime, SF)
switch :: Monad m => SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
switch :: forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
switch SF m a (b, Event c)
sf c -> SF m a b
sfC = (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (b, SF m a b)) -> SF m a b)
-> (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall a b. (a -> b) -> a -> b
$ \a
a -> do
((b, Event c)
o, SF m a (b, Event c)
ct) <- SF m a (b, Event c)
-> a -> ReaderT DTime m ((b, Event c), SF m a (b, Event c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a (b, Event c)
sf a
a
case (b, Event c)
o of
(b
_, Event c
c) -> (DTime -> DTime)
-> ClockInfo m (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
local (DTime -> DTime -> DTime
forall a b. a -> b -> a
const DTime
0) (SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (c -> SF m a b
sfC c
c) a
a)
(b
b, Event c
NoEvent) -> (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
switch SF m a (b, Event c)
ct c -> SF m a b
sfC)
dSwitch :: Monad m => SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
dSwitch :: forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
dSwitch SF m a (b, Event c)
sf c -> SF m a b
sfC = (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (b, SF m a b)) -> SF m a b)
-> (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall a b. (a -> b) -> a -> b
$ \a
a -> do
((b, Event c)
o, SF m a (b, Event c)
ct) <- SF m a (b, Event c)
-> a -> ReaderT DTime m ((b, Event c), SF m a (b, Event c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a (b, Event c)
sf a
a
case (b, Event c)
o of
(b
b, Event c
c) -> do (b
_, SF m a b
ct') <- (DTime -> DTime)
-> ClockInfo m (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
local (DTime -> DTime -> DTime
forall a b. a -> b -> a
const DTime
0) (SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (c -> SF m a b
sfC c
c) a
a)
(b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, SF m a b
ct')
(b
b, Event c
NoEvent) -> (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
dSwitch SF m a (b, Event c)
ct c -> SF m a b
sfC)
rSwitch :: Monad m => SF m a b -> SF m (a, Event (SF m a b)) b
rSwitch :: forall (m :: * -> *) a b.
Monad m =>
SF m a b -> SF m (a, Event (SF m a b)) b
rSwitch SF m a b
sf = SF m (a, Event (SF m a b)) (b, Event (SF m a b))
-> (SF m a b -> SF m (a, Event (SF m a b)) b)
-> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
switch (SF m a b -> SF m (a, Event (SF m a b)) (b, Event (SF m a b))
forall b c d.
MSF (ClockInfo m) b c -> MSF (ClockInfo m) (b, d) (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first SF m a b
sf) (((a, Event (SF m a b)) -> (a, Event (SF m a b))
forall a b c. (a, Event b) -> (a, Event c)
noEventSnd ((a, Event (SF m a b)) -> (a, Event (SF m a b)))
-> SF m (a, Event (SF m a b)) b -> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b.
Monad m =>
(a -> a) -> SF m a b -> SF m a b
>=-) (SF m (a, Event (SF m a b)) b -> SF m (a, Event (SF m a b)) b)
-> (SF m a b -> SF m (a, Event (SF m a b)) b)
-> SF m a b
-> SF m (a, Event (SF m a b)) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SF m a b -> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b.
Monad m =>
SF m a b -> SF m (a, Event (SF m a b)) b
rSwitch)
drSwitch :: Monad m => SF m a b -> SF m (a, Event (SF m a b)) b
drSwitch :: forall (m :: * -> *) a b.
Monad m =>
SF m a b -> SF m (a, Event (SF m a b)) b
drSwitch SF m a b
sf = SF m (a, Event (SF m a b)) (b, Event (SF m a b))
-> (SF m a b -> SF m (a, Event (SF m a b)) b)
-> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b c.
Monad m =>
SF m a (b, Event c) -> (c -> SF m a b) -> SF m a b
dSwitch (SF m a b -> SF m (a, Event (SF m a b)) (b, Event (SF m a b))
forall b c d.
MSF (ClockInfo m) b c -> MSF (ClockInfo m) (b, d) (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first SF m a b
sf) (((a, Event (SF m a b)) -> (a, Event (SF m a b))
forall a b c. (a, Event b) -> (a, Event c)
noEventSnd ((a, Event (SF m a b)) -> (a, Event (SF m a b)))
-> SF m (a, Event (SF m a b)) b -> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b.
Monad m =>
(a -> a) -> SF m a b -> SF m a b
>=-) (SF m (a, Event (SF m a b)) b -> SF m (a, Event (SF m a b)) b)
-> (SF m a b -> SF m (a, Event (SF m a b)) b)
-> SF m a b
-> SF m (a, Event (SF m a b)) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SF m a b -> SF m (a, Event (SF m a b)) b
forall (m :: * -> *) a b.
Monad m =>
SF m a b -> SF m (a, Event (SF m a b)) b
drSwitch)
kSwitch :: Monad m
=> SF m a b
-> SF m (a, b) (Event c)
-> (SF m a b -> c -> SF m a b)
-> SF m a b
kSwitch :: forall (m :: * -> *) a b c.
Monad m =>
SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
kSwitch SF m a b
sf10 SF m (a, b) (Event c)
tfe0 SF m a b -> c -> SF m a b
k = (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF a -> ClockInfo m (b, SF m a b)
tf0
where
tf0 :: a -> ClockInfo m (b, SF m a b)
tf0 a
a0 = do
(b
b0, SF m a b
sf1) <- SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a b
sf10 a
a0
(Event c
me, SF m (a, b) (Event c)
sfe) <- SF m (a, b) (Event c)
-> (a, b) -> ClockInfo m (Event c, SF m (a, b) (Event c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, b) (Event c)
tfe0 (a
a0, b
b0)
case Event c
me of
Event c
NoEvent -> (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a. a -> ClockInfo m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b0, SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
forall (m :: * -> *) a b c.
Monad m =>
SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
kSwitch SF m a b
sf1 SF m (a, b) (Event c)
sfe SF m a b -> c -> SF m a b
k)
Event c
c0 -> SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (SF m a b -> c -> SF m a b
k SF m a b
sf10 c
c0) a
a0
#if MIN_VERSION_base(4,8,0)
dkSwitch :: Monad m
=> SF m a b
-> SF m (a, b) (Event c)
-> (SF m a b -> c -> SF m a b)
-> SF m a b
#else
dkSwitch :: (Functor m, Monad m)
=> SF m a b
-> SF m (a, b) (Event c)
-> (SF m a b -> c -> SF m a b)
-> SF m a b
#endif
dkSwitch :: forall (m :: * -> *) a b c.
Monad m =>
SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
dkSwitch SF m a b
sf1 SF m (a, b) (Event c)
sfe SF m a b -> c -> SF m a b
k = (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF a -> ClockInfo m (b, SF m a b)
tf
where
tf :: a -> ClockInfo m (b, SF m a b)
tf a
a = do
(b
b, SF m a b
sf1') <- SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a b
sf1 a
a
(Event c
me, SF m (a, b) (Event c)
sfe') <- SF m (a, b) (Event c)
-> (a, b) -> ClockInfo m (Event c, SF m (a, b) (Event c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, b) (Event c)
sfe (a
a, b
b)
let sfe'' :: SF m a b
sfe'' = case Event c
me of
Event c
NoEvent -> SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
forall (m :: * -> *) a b c.
Monad m =>
SF m a b
-> SF m (a, b) (Event c) -> (SF m a b -> c -> SF m a b) -> SF m a b
dkSwitch SF m a b
sf1' SF m (a, b) (Event c)
sfe' SF m a b -> c -> SF m a b
k
Event c
c -> ClockInfo m (SF m a b) -> SF m a b
forall (m :: * -> *) a b. Monad m => m (MSF m a b) -> MSF m a b
performOnFirstSample ((b, SF m a b) -> SF m a b
forall a b. (a, b) -> b
snd ((b, SF m a b) -> SF m a b)
-> ClockInfo m (b, SF m a b) -> ClockInfo m (SF m a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (SF m a b -> c -> SF m a b
k SF m a b
sf1 c
c) a
a)
(b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a. a -> ClockInfo m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, SF m a b
sfe'')
broadcast :: Functor col => a -> col sf -> col (a, sf)
broadcast :: forall (col :: * -> *) a sf.
Functor col =>
a -> col sf -> col (a, sf)
broadcast a
a = (sf -> (a, sf)) -> col sf -> col (a, sf)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\sf
sf -> (a
a, sf
sf))
#if MIN_VERSION_base(4,8,0)
parB :: Monad m => [SF m a b] -> SF m a [b]
#else
parB :: (Functor m, Monad m) => [SF m a b] -> SF m a [b]
#endif
parB :: forall (m :: * -> *) a b. Monad m => [SF m a b] -> SF m a [b]
parB = MSF (ListT (ClockInfo m)) a b -> MSF (ClockInfo m) a [b]
forall (m :: * -> *) a b.
(Functor m, Monad m) =>
MSF (ListT m) a b -> MSF m a [b]
widthFirst (MSF (ListT (ClockInfo m)) a b -> MSF (ClockInfo m) a [b])
-> ([SF m a b] -> MSF (ListT (ClockInfo m)) a b)
-> [SF m a b]
-> MSF (ClockInfo m) a [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SF m a b] -> MSF (ListT (ClockInfo m)) a b
forall (m :: * -> *) a b.
Monad m =>
[MSF m a b] -> MSF (ListT m) a b
sequenceS
pSwitchB :: (Functor m, Monad m, Traversable col, Functor col)
=> col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
pSwitchB :: forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Traversable col, Functor col) =>
col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
pSwitchB = (forall sf. a -> col sf -> col (a, sf))
-> col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
forall (m :: * -> *) (col :: * -> *) a b c d.
(Functor m, Monad m, Traversable col, Functor col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
pSwitch a -> col sf -> col (a, sf)
forall sf. a -> col sf -> col (a, sf)
forall (col :: * -> *) a sf.
Functor col =>
a -> col sf -> col (a, sf)
broadcast
dpSwitchB :: (Functor m, Monad m, Traversable col)
=> col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
dpSwitchB :: forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Traversable col) =>
col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
dpSwitchB col (SF m a b)
sfs SF m (a, col b) (Event c)
sfF col (SF m a b) -> c -> SF m a (col b)
sfCs = (a -> ClockInfo m (col b, SF m a (col b))) -> SF m a (col b)
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (col b, SF m a (col b))) -> SF m a (col b))
-> (a -> ClockInfo m (col b, SF m a (col b))) -> SF m a (col b)
forall a b. (a -> b) -> a -> b
$ \a
a -> do
col (b, SF m a b)
res <- (SF m a b -> ReaderT DTime m (b, SF m a b))
-> col (SF m a b) -> ReaderT DTime m (col (b, SF m a b))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> col a -> m (col b)
T.mapM (SF m a b -> a -> ReaderT DTime m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
`unMSF` a
a) col (SF m a b)
sfs
let bs :: col b
bs = ((b, SF m a b) -> b) -> col (b, SF m a b) -> col b
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> b
forall a b. (a, b) -> a
fst col (b, SF m a b)
res
sfs' :: col (SF m a b)
sfs' = ((b, SF m a b) -> SF m a b) -> col (b, SF m a b) -> col (SF m a b)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> SF m a b
forall a b. (a, b) -> b
snd col (b, SF m a b)
res
(Event c
e, SF m (a, col b) (Event c)
sfF') <- SF m (a, col b) (Event c)
-> (a, col b)
-> ReaderT DTime m (Event c, SF m (a, col b) (Event c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, col b) (Event c)
sfF (a
a, col b
bs)
SF m a (col b)
ct <- case Event c
e of
Event c
c -> (col b, SF m a (col b)) -> SF m a (col b)
forall a b. (a, b) -> b
snd ((col b, SF m a (col b)) -> SF m a (col b))
-> ClockInfo m (col b, SF m a (col b))
-> ReaderT DTime m (SF m a (col b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SF m a (col b) -> a -> ClockInfo m (col b, SF m a (col b))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (col (SF m a b) -> c -> SF m a (col b)
sfCs col (SF m a b)
sfs c
c) a
a
Event c
NoEvent -> SF m a (col b) -> ReaderT DTime m (SF m a (col b))
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Traversable col) =>
col (SF m a b)
-> SF m (a, col b) (Event c)
-> (col (SF m a b) -> c -> SF m a (col b))
-> SF m a (col b)
dpSwitchB col (SF m a b)
sfs' SF m (a, col b) (Event c)
sfF' col (SF m a b) -> c -> SF m a (col b)
sfCs)
(col b, SF m a (col b)) -> ClockInfo m (col b, SF m a (col b))
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col b
bs, SF m a (col b)
ct)
rpSwitchB :: (Functor m, Monad m, Functor col, Traversable col)
=> col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
rpSwitchB :: forall (m :: * -> *) (col :: * -> *) a b.
(Functor m, Monad m, Functor col, Traversable col) =>
col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
rpSwitchB = (forall sf. a -> col sf -> col (a, sf))
-> col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
rpSwitch a -> col sf -> col (a, sf)
forall sf. a -> col sf -> col (a, sf)
forall (col :: * -> *) a sf.
Functor col =>
a -> col sf -> col (a, sf)
broadcast
drpSwitchB :: (Functor m, Monad m, Functor col, Traversable col)
=> col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
drpSwitchB :: forall (m :: * -> *) (col :: * -> *) a b.
(Functor m, Monad m, Functor col, Traversable col) =>
col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
drpSwitchB = (forall sf. a -> col sf -> col (a, sf))
-> col (SF m a b)
-> SF m (a, Event (col (SF m a b) -> col (SF m a b))) (col b)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
drpSwitch a -> col sf -> col (a, sf)
forall sf. a -> col sf -> col (a, sf)
forall (col :: * -> *) a sf.
Functor col =>
a -> col sf -> col (a, sf)
broadcast
par :: (Functor m, Monad m, Functor col, Traversable col)
=> (forall sf . (a -> col sf -> col (b, sf)))
-> col (SF m b c)
-> SF m a (col c)
par :: forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c) -> SF m a (col c)
par forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs0 = (a -> ClockInfo m (col c, MSF (ClockInfo m) a (col c)))
-> MSF (ClockInfo m) a (col c)
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF a -> ClockInfo m (col c, MSF (ClockInfo m) a (col c))
tf0
where
tf0 :: a -> ClockInfo m (col c, MSF (ClockInfo m) a (col c))
tf0 a
a0 = do
let bsfs0 :: col (b, SF m b c)
bsfs0 = a -> col (SF m b c) -> col (b, SF m b c)
forall sf. a -> col sf -> col (b, sf)
rf a
a0 col (SF m b c)
sfs0
col (c, SF m b c)
sfcs0 <- ((b, SF m b c) -> ClockInfo m (c, SF m b c))
-> col (b, SF m b c) -> ClockInfo m (col (c, SF m b c))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> col a -> m (col b)
T.mapM (\(b
b0, SF m b c
sf0) -> (SF m b c -> b -> ClockInfo m (c, SF m b c)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m b c
sf0) b
b0) col (b, SF m b c)
bsfs0
let sfs :: col (SF m b c)
sfs = ((c, SF m b c) -> SF m b c) -> col (c, SF m b c) -> col (SF m b c)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> SF m b c
forall a b. (a, b) -> b
snd col (c, SF m b c)
sfcs0
cs0 :: col c
cs0 = ((c, SF m b c) -> c) -> col (c, SF m b c) -> col c
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> c
forall a b. (a, b) -> a
fst col (c, SF m b c)
sfcs0
(col c, MSF (ClockInfo m) a (col c))
-> ClockInfo m (col c, MSF (ClockInfo m) a (col c))
forall a. a -> ClockInfo m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col c
cs0, (forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c) -> MSF (ClockInfo m) a (col c)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c) -> SF m a (col c)
par a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs)
pSwitch :: (Functor m, Monad m, Traversable col, Functor col)
=> (forall sf . (a -> col sf -> col (b, sf)))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
pSwitch :: forall (m :: * -> *) (col :: * -> *) a b c d.
(Functor m, Monad m, Traversable col, Functor col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
pSwitch forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs0 SF m (a, col c) (Event d)
sfe0 col (SF m b c) -> d -> SF m a (col c)
k = (a -> ClockInfo m (col c, SF m a (col c))) -> SF m a (col c)
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF a -> ClockInfo m (col c, SF m a (col c))
tf0
where
tf0 :: a -> ClockInfo m (col c, SF m a (col c))
tf0 a
a0 = do
let bsfs0 :: col (b, SF m b c)
bsfs0 = a -> col (SF m b c) -> col (b, SF m b c)
forall sf. a -> col sf -> col (b, sf)
rf a
a0 col (SF m b c)
sfs0
col (c, SF m b c)
sfcs0 <- ((b, SF m b c) -> ClockInfo m (c, SF m b c))
-> col (b, SF m b c) -> ClockInfo m (col (c, SF m b c))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> col a -> m (col b)
T.mapM (\(b
b0, SF m b c
sf0) -> (SF m b c -> b -> ClockInfo m (c, SF m b c)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m b c
sf0) b
b0) col (b, SF m b c)
bsfs0
let sfs :: col (SF m b c)
sfs = ((c, SF m b c) -> SF m b c) -> col (c, SF m b c) -> col (SF m b c)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> SF m b c
forall a b. (a, b) -> b
snd col (c, SF m b c)
sfcs0
cs0 :: col c
cs0 = ((c, SF m b c) -> c) -> col (c, SF m b c) -> col c
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> c
forall a b. (a, b) -> a
fst col (c, SF m b c)
sfcs0
(Event d
e, SF m (a, col c) (Event d)
sfe) <- SF m (a, col c) (Event d)
-> (a, col c) -> ClockInfo m (Event d, SF m (a, col c) (Event d))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, col c) (Event d)
sfe0 (a
a0, col c
cs0)
case Event d
e of
Event d
NoEvent -> (col c, SF m a (col c)) -> ClockInfo m (col c, SF m a (col c))
forall a. a -> ClockInfo m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col c
cs0, col (SF m b c) -> SF m (a, col c) (Event d) -> SF m a (col c)
pSwitchAux col (SF m b c)
sfs SF m (a, col c) (Event d)
sfe)
Event d
d0 -> SF m a (col c) -> a -> ClockInfo m (col c, SF m a (col c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (col (SF m b c) -> d -> SF m a (col c)
k col (SF m b c)
sfs0 d
d0) a
a0
pSwitchAux :: col (SF m b c) -> SF m (a, col c) (Event d) -> SF m a (col c)
pSwitchAux col (SF m b c)
sfs SF m (a, col c) (Event d)
sfe = (a -> ClockInfo m (col c, SF m a (col c))) -> SF m a (col c)
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF a -> ClockInfo m (col c, SF m a (col c))
tf
where
tf :: a -> ClockInfo m (col c, SF m a (col c))
tf a
a = do
let bsfs :: col (b, SF m b c)
bsfs = a -> col (SF m b c) -> col (b, SF m b c)
forall sf. a -> col sf -> col (b, sf)
rf a
a col (SF m b c)
sfs
col (c, SF m b c)
sfcs' <- ((b, SF m b c) -> ClockInfo m (c, SF m b c))
-> col (b, SF m b c) -> ClockInfo m (col (c, SF m b c))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> col a -> m (col b)
T.mapM (\(b
b, SF m b c
sf) -> (SF m b c -> b -> ClockInfo m (c, SF m b c)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m b c
sf b
b)) col (b, SF m b c)
bsfs
let sfs' :: col (SF m b c)
sfs' = ((c, SF m b c) -> SF m b c) -> col (c, SF m b c) -> col (SF m b c)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> SF m b c
forall a b. (a, b) -> b
snd col (c, SF m b c)
sfcs'
cs :: col c
cs = ((c, SF m b c) -> c) -> col (c, SF m b c) -> col c
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> c
forall a b. (a, b) -> a
fst col (c, SF m b c)
sfcs'
(Event d
e, SF m (a, col c) (Event d)
sfe') <- SF m (a, col c) (Event d)
-> (a, col c) -> ClockInfo m (Event d, SF m (a, col c) (Event d))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, col c) (Event d)
sfe (a
a, col c
cs)
case Event d
e of
Event d
NoEvent -> (col c, SF m a (col c)) -> ClockInfo m (col c, SF m a (col c))
forall a. a -> ClockInfo m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col c
cs, col (SF m b c) -> SF m (a, col c) (Event d) -> SF m a (col c)
pSwitchAux col (SF m b c)
sfs' SF m (a, col c) (Event d)
sfe')
Event d
d -> do DTime
dt <- ReaderT DTime m DTime
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
SF m a (col c) -> a -> ClockInfo m (col c, SF m a (col c))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF (col (SF m b c) -> d -> SF m a (col c)
k (col (SF m b c) -> DTime -> col (SF m b c)
forall (m :: * -> *) (col :: * -> *) a b.
(Monad m, Functor col) =>
col (SF m a b) -> DTime -> col (SF m a b)
freezeCol col (SF m b c)
sfs DTime
dt) d
d) a
a
dpSwitch :: (Monad m, Traversable col)
=> (forall sf. (a -> col sf -> col (b, sf)))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
dpSwitch :: forall (m :: * -> *) (col :: * -> *) a b c d.
(Monad m, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
dpSwitch forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs SF m (a, col c) (Event d)
sfF col (SF m b c) -> d -> SF m a (col c)
sfCs = (a -> ClockInfo m (col c, SF m a (col c))) -> SF m a (col c)
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (col c, SF m a (col c))) -> SF m a (col c))
-> (a -> ClockInfo m (col c, SF m a (col c))) -> SF m a (col c)
forall a b. (a -> b) -> a -> b
$ \a
a -> do
let bsfs :: col (b, SF m b c)
bsfs = a -> col (SF m b c) -> col (b, SF m b c)
forall sf. a -> col sf -> col (b, sf)
rf a
a col (SF m b c)
sfs
col (c, SF m b c)
res <- ((b, SF m b c) -> ReaderT DTime m (c, SF m b c))
-> col (b, SF m b c) -> ReaderT DTime m (col (c, SF m b c))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> col a -> m (col b)
T.mapM (\(b
b, SF m b c
sf) -> SF m b c -> b -> ReaderT DTime m (c, SF m b c)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m b c
sf b
b) col (b, SF m b c)
bsfs
let cs :: col c
cs = ((c, SF m b c) -> c) -> col (c, SF m b c) -> col c
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> c
forall a b. (a, b) -> a
fst col (c, SF m b c)
res
sfs' :: col (SF m b c)
sfs' = ((c, SF m b c) -> SF m b c) -> col (c, SF m b c) -> col (SF m b c)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (c, SF m b c) -> SF m b c
forall a b. (a, b) -> b
snd col (c, SF m b c)
res
(Event d
e, SF m (a, col c) (Event d)
sfF') <- SF m (a, col c) (Event d)
-> (a, col c)
-> ReaderT DTime m (Event d, SF m (a, col c) (Event d))
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m (a, col c) (Event d)
sfF (a
a, col c
cs)
let ct :: SF m a (col c)
ct = case Event d
e of
Event d
d -> col (SF m b c) -> d -> SF m a (col c)
sfCs col (SF m b c)
sfs' d
d
Event d
NoEvent -> (forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
forall (m :: * -> *) (col :: * -> *) a b c d.
(Monad m, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
dpSwitch a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs' SF m (a, col c) (Event d)
sfF' col (SF m b c) -> d -> SF m a (col c)
sfCs
(col c, SF m a (col c)) -> ClockInfo m (col c, SF m a (col c))
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (col c
cs, SF m a (col c)
ct)
rpSwitch :: (Functor m, Monad m, Functor col, Traversable col)
=> (forall sf . (a -> col sf -> col (b, sf)))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
rpSwitch :: forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
rpSwitch forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs =
(forall sf.
(a, Event (col (SF m b c) -> col (SF m b c)))
-> col sf -> col (b, sf))
-> col (SF m b c)
-> SF
m
((a, Event (col (SF m b c) -> col (SF m b c))), col c)
(Event (col (SF m b c) -> col (SF m b c)))
-> (col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) (col :: * -> *) a b c d.
(Functor m, Monad m, Traversable col, Functor col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
pSwitch (a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf (a -> col sf -> col (b, sf))
-> ((a, Event (col (SF m b c) -> col (SF m b c))) -> a)
-> (a, Event (col (SF m b c) -> col (SF m b c)))
-> col sf
-> col (b, sf)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Event (col (SF m b c) -> col (SF m b c))) -> a
forall a b. (a, b) -> a
fst) col (SF m b c)
sfs ((((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> Event (col (SF m b c) -> col (SF m b c)))
-> SF
m
((a, Event (col (SF m b c) -> col (SF m b c))), col c)
(Event (col (SF m b c) -> col (SF m b c)))
forall b c. (b -> c) -> MSF (ClockInfo m) b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((a, Event (col (SF m b c) -> col (SF m b c)))
-> Event (col (SF m b c) -> col (SF m b c))
forall a b. (a, b) -> b
snd ((a, Event (col (SF m b c) -> col (SF m b c)))
-> Event (col (SF m b c) -> col (SF m b c)))
-> (((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> (a, Event (col (SF m b c) -> col (SF m b c))))
-> ((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> Event (col (SF m b c) -> col (SF m b c))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> (a, Event (col (SF m b c) -> col (SF m b c)))
forall a b. (a, b) -> a
fst)) ((col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> (col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall a b. (a -> b) -> a -> b
$ \col (SF m b c)
sfs' col (SF m b c) -> col (SF m b c)
f ->
(a, Event (col (SF m b c) -> col (SF m b c)))
-> (a, Event (col (SF m b c) -> col (SF m b c)))
forall a b c. (a, Event b) -> (a, Event c)
noEventSnd ((a, Event (col (SF m b c) -> col (SF m b c)))
-> (a, Event (col (SF m b c) -> col (SF m b c))))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) a b.
Monad m =>
(a -> a) -> SF m a b -> SF m a b
>=- (forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
rpSwitch a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf (col (SF m b c) -> col (SF m b c)
f col (SF m b c)
sfs')
drpSwitch :: (Functor m, Monad m, Functor col, Traversable col)
=> (forall sf . (a -> col sf -> col (b, sf)))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
drpSwitch :: forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
drpSwitch forall sf. a -> col sf -> col (b, sf)
rf col (SF m b c)
sfs =
(forall sf.
(a, Event (col (SF m b c) -> col (SF m b c)))
-> col sf -> col (b, sf))
-> col (SF m b c)
-> SF
m
((a, Event (col (SF m b c) -> col (SF m b c))), col c)
(Event (col (SF m b c) -> col (SF m b c)))
-> (col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) (col :: * -> *) a b c d.
(Monad m, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
dpSwitch (a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf (a -> col sf -> col (b, sf))
-> ((a, Event (col (SF m b c) -> col (SF m b c))) -> a)
-> (a, Event (col (SF m b c) -> col (SF m b c)))
-> col sf
-> col (b, sf)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Event (col (SF m b c) -> col (SF m b c))) -> a
forall a b. (a, b) -> a
fst) col (SF m b c)
sfs ((((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> Event (col (SF m b c) -> col (SF m b c)))
-> SF
m
((a, Event (col (SF m b c) -> col (SF m b c))), col c)
(Event (col (SF m b c) -> col (SF m b c)))
forall b c. (b -> c) -> MSF (ClockInfo m) b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((a, Event (col (SF m b c) -> col (SF m b c)))
-> Event (col (SF m b c) -> col (SF m b c))
forall a b. (a, b) -> b
snd ((a, Event (col (SF m b c) -> col (SF m b c)))
-> Event (col (SF m b c) -> col (SF m b c)))
-> (((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> (a, Event (col (SF m b c) -> col (SF m b c))))
-> ((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> Event (col (SF m b c) -> col (SF m b c))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, Event (col (SF m b c) -> col (SF m b c))), col c)
-> (a, Event (col (SF m b c) -> col (SF m b c)))
forall a b. (a, b) -> a
fst)) ((col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> (col (SF m b c)
-> (col (SF m b c) -> col (SF m b c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall a b. (a -> b) -> a -> b
$ \col (SF m b c)
sfs' col (SF m b c) -> col (SF m b c)
f ->
(a, Event (col (SF m b c) -> col (SF m b c)))
-> (a, Event (col (SF m b c) -> col (SF m b c)))
forall a b c. (a, Event b) -> (a, Event c)
noEventSnd ((a, Event (col (SF m b c) -> col (SF m b c)))
-> (a, Event (col (SF m b c) -> col (SF m b c))))
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) a b.
Monad m =>
(a -> a) -> SF m a b -> SF m a b
>=- (forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
drpSwitch a -> col sf -> col (b, sf)
forall sf. a -> col sf -> col (b, sf)
rf (col (SF m b c) -> col (SF m b c)
f col (SF m b c)
sfs')
parZ :: (Functor m, Monad m) => [SF m a b] -> SF m [a] [b]
parZ :: forall (m :: * -> *) a b.
(Functor m, Monad m) =>
[SF m a b] -> SF m [a] [b]
parZ = (forall sf. [a] -> [sf] -> [(a, sf)]) -> [SF m a b] -> SF m [a] [b]
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c) -> SF m a (col c)
par (String -> [a] -> [sf] -> [(a, sf)]
forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
"parZ")
pSwitchZ :: (Functor m, Monad m)
=> [SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
pSwitchZ :: forall (m :: * -> *) a b c.
(Functor m, Monad m) =>
[SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
pSwitchZ = (forall sf. [a] -> [sf] -> [(a, sf)])
-> [SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
forall (m :: * -> *) (col :: * -> *) a b c d.
(Functor m, Monad m, Traversable col, Functor col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
pSwitch (String -> [a] -> [sf] -> [(a, sf)]
forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
"pSwitchZ")
dpSwitchZ :: (Functor m, Monad m)
=> [SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
dpSwitchZ :: forall (m :: * -> *) a b c.
(Functor m, Monad m) =>
[SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
dpSwitchZ = (forall sf. [a] -> [sf] -> [(a, sf)])
-> [SF m a b]
-> SF m ([a], [b]) (Event c)
-> ([SF m a b] -> c -> SF m [a] [b])
-> SF m [a] [b]
forall (m :: * -> *) (col :: * -> *) a b c d.
(Monad m, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, col c) (Event d)
-> (col (SF m b c) -> d -> SF m a (col c))
-> SF m a (col c)
dpSwitch (String -> [a] -> [sf] -> [(a, sf)]
forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
"dpSwitchZ")
rpSwitchZ :: (Functor m, Monad m)
=> [SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
rpSwitchZ :: forall (m :: * -> *) a b.
(Functor m, Monad m) =>
[SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
rpSwitchZ = (forall sf. [a] -> [sf] -> [(a, sf)])
-> [SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
rpSwitch (String -> [a] -> [sf] -> [(a, sf)]
forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
"rpSwitchZ")
drpSwitchZ :: (Functor m, Monad m)
=> [SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
drpSwitchZ :: forall (m :: * -> *) a b.
(Functor m, Monad m) =>
[SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
drpSwitchZ = (forall sf. [a] -> [sf] -> [(a, sf)])
-> [SF m a b] -> SF m ([a], Event ([SF m a b] -> [SF m a b])) [b]
forall (m :: * -> *) (col :: * -> *) a b c.
(Functor m, Monad m, Functor col, Traversable col) =>
(forall sf. a -> col sf -> col (b, sf))
-> col (SF m b c)
-> SF m (a, Event (col (SF m b c) -> col (SF m b c))) (col c)
drpSwitch (String -> [a] -> [sf] -> [(a, sf)]
forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
"drpSwitchZ")
safeZip :: String -> [a] -> [b] -> [(a, b)]
safeZip :: forall a b. String -> [a] -> [b] -> [(a, b)]
safeZip String
fn = [a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
safeZip'
where
safeZip' :: [a] -> [b] -> [(a, b)]
safeZip' :: forall a b. [a] -> [b] -> [(a, b)]
safeZip' [a]
_ [] = []
safeZip' (a
a:[a]
as) (b
b:[b]
bs) = (a
a, b
b) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
safeZip' [a]
as [b]
bs
safeZip' [a]
_ [b]
_ =
String -> [(a, b)]
forall a. HasCallStack => String -> a
error (String -> [(a, b)]) -> String -> [(a, b)]
forall a b. (a -> b) -> a -> b
$ String
"FRP.BearRiver.Switches: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
fn String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": Input list too short."
freeze :: Monad m => SF m a b -> DTime -> SF m a b
freeze :: forall (m :: * -> *) a b. Monad m => SF m a b -> DTime -> SF m a b
freeze SF m a b
sf DTime
dt = (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (b, SF m a b)) -> SF m a b)
-> (a -> ClockInfo m (b, SF m a b)) -> SF m a b
forall a b. (a -> b) -> a -> b
$ \a
a ->
m (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a. Monad m => m a -> ReaderT DTime m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (b, SF m a b) -> ClockInfo m (b, SF m a b))
-> m (b, SF m a b) -> ClockInfo m (b, SF m a b)
forall a b. (a -> b) -> a -> b
$ ClockInfo m (b, SF m a b) -> DTime -> m (b, SF m a b)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (SF m a b -> a -> ClockInfo m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a b
sf a
a) DTime
dt
freezeCol :: (Monad m, Functor col)
=> col (SF m a b) -> DTime -> col (SF m a b)
freezeCol :: forall (m :: * -> *) (col :: * -> *) a b.
(Monad m, Functor col) =>
col (SF m a b) -> DTime -> col (SF m a b)
freezeCol col (SF m a b)
sfs DTime
dt = (SF m a b -> SF m a b) -> col (SF m a b) -> col (SF m a b)
forall a b. (a -> b) -> col a -> col b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (SF m a b -> DTime -> SF m a b
forall (m :: * -> *) a b. Monad m => SF m a b -> DTime -> SF m a b
`freeze` DTime
dt) col (SF m a b)
sfs
parC :: Monad m => SF m a b -> SF m [a] [b]
parC :: forall (m :: * -> *) a b. Monad m => SF m a b -> SF m [a] [b]
parC = SF m a b -> SF m [a] [b]
forall (m :: * -> *) a b. Monad m => SF m a b -> SF m [a] [b]
parC0
where
parC0 :: Monad m => SF m a b -> SF m [a] [b]
parC0 :: forall (m :: * -> *) a b. Monad m => SF m a b -> SF m [a] [b]
parC0 SF m a b
sf0 = ([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b]
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF (([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b])
-> ([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b]
forall a b. (a -> b) -> a -> b
$ \[a]
as -> do
[(b, SF m a b)]
os <- ((a, SF m a b) -> ReaderT DTime m (b, SF m a b))
-> [(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
T.mapM (\(a
a, SF m a b
sf) -> SF m a b -> a -> ReaderT DTime m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a b
sf a
a) ([(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)])
-> [(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)]
forall a b. (a -> b) -> a -> b
$
[a] -> [SF m a b] -> [(a, SF m a b)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
as (Int -> SF m a b -> [SF m a b]
forall a. Int -> a -> [a]
replicate ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
as) SF m a b
sf0)
let bs :: [b]
bs = ((b, SF m a b) -> b) -> [(b, SF m a b)] -> [b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> b
forall a b. (a, b) -> a
fst [(b, SF m a b)]
os
cts :: [SF m a b]
cts = ((b, SF m a b) -> SF m a b) -> [(b, SF m a b)] -> [SF m a b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> SF m a b
forall a b. (a, b) -> b
snd [(b, SF m a b)]
os
([b], MSF (ReaderT DTime m) [a] [b])
-> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b])
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([b]
bs, [SF m a b] -> MSF (ReaderT DTime m) [a] [b]
forall (m :: * -> *) a b. Monad m => [SF m a b] -> SF m [a] [b]
parC' [SF m a b]
cts)
parC' :: Monad m => [SF m a b] -> SF m [a] [b]
parC' :: forall (m :: * -> *) a b. Monad m => [SF m a b] -> SF m [a] [b]
parC' [SF m a b]
sfs = ([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b]
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF (([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b])
-> ([a] -> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b]))
-> MSF (ReaderT DTime m) [a] [b]
forall a b. (a -> b) -> a -> b
$ \[a]
as -> do
[(b, SF m a b)]
os <- ((a, SF m a b) -> ReaderT DTime m (b, SF m a b))
-> [(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
T.mapM (\(a
a, SF m a b
sf) -> SF m a b -> a -> ReaderT DTime m (b, SF m a b)
forall (m :: * -> *) a b. MSF m a b -> a -> m (b, MSF m a b)
unMSF SF m a b
sf a
a) ([(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)])
-> [(a, SF m a b)] -> ReaderT DTime m [(b, SF m a b)]
forall a b. (a -> b) -> a -> b
$ [a] -> [SF m a b] -> [(a, SF m a b)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
as [SF m a b]
sfs
let bs :: [b]
bs = ((b, SF m a b) -> b) -> [(b, SF m a b)] -> [b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> b
forall a b. (a, b) -> a
fst [(b, SF m a b)]
os
cts :: [SF m a b]
cts = ((b, SF m a b) -> SF m a b) -> [(b, SF m a b)] -> [SF m a b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (b, SF m a b) -> SF m a b
forall a b. (a, b) -> b
snd [(b, SF m a b)]
os
([b], MSF (ReaderT DTime m) [a] [b])
-> ClockInfo m ([b], MSF (ReaderT DTime m) [a] [b])
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([b]
bs, [SF m a b] -> MSF (ReaderT DTime m) [a] [b]
forall (m :: * -> *) a b. Monad m => [SF m a b] -> SF m [a] [b]
parC' [SF m a b]
cts)