reactive-0.11.5: src/Test/Merge.hs
-- Tracking down a problem with event merging
import Data.Monoid (mappend)
import Control.Applicative ((<$>))
import FRP.Reactive.Improving
import FRP.Reactive.Future
import FRP.Reactive.PrimReactive
import FRP.Reactive.Reactive
import FRP.Reactive.Internal.Future
import FRP.Reactive.Internal.Reactive
-- (Imp 1.0,1)->(Imp 2.0,2)->(Imp 3.0,3)->(Imp *** Exception: Prelude.undefined
e1 = listEG [(exactly 1,1),(exactly 2,2),(exactly 3,3),(after 4,17)]
-- (Imp 1.5,100)->(Imp 2.5,200)
e2 = listEG [(exactly 1.5, 100), (exactly 2.5, 200)]
-- (Imp *** Exception: Prelude.undefined
e3 = listEG [(after 2.5, 200)]
-- (Imp 1.5,100)->(Imp 2.3,200)->(Imp *** Exception: Prelude.undefined
e3' = listEG [(exactly 1.5, 100), (exactly 2.3, 200), (after 2.5, 300)]
-- (Imp 1.0,1)->(Imp 1.5,100)->(Imp 2.0,2)->(Imp 2.5,200)->(Imp 3.0,3)->(Imp *** Exception: Prelude.undefined
e4 = e1 `mappend` e2
-- (Imp 1.0,1)->(Imp 2.0,2)<interactive>: after: comparing after
e5 = e1 `mappend` e3
-- (Imp 1.0,1)->(Imp 1.5,100)->(Imp 2.0,2)->(Imp 2.3,200)<interactive>: after: comparing after
e5' = e1 `mappend` e3'
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)->(Imp 3.0,3)->(Imp *** Exception: Prelude.undefined
f1 = eFuture e1
-- <NoBound Imp 1.5,100 `Stepper` (Imp 2.5,200)>
f2 = eFuture e2
-- <NoBound Imp *** Exception: Prelude.undefined
f3 = eFuture e3
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)->(Imp 3.0,3)->(Imp *** Exception: Prelude.undefined
f4 = f1 `mappend` f3
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)<interactive>: after: comparing after
f5 = f1 `merge` f3
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)<interactive>: after: comparing after
f5' = eFuture e5
--
type Binop a = a -> a -> a
mergeLR, mergeL, mergeR :: (Ord s) => Binop (FutureG s (ReactiveG s b))
-- Same as 'merge'
u `mergeLR` v =
(inFutR (`merge` v) <$> u) `mappend` (inFutR (u `merge`) <$> v)
u `mergeL` v = inFutR (`merge` v) <$> u
u `mergeR` v = inFutR (u `merge`) <$> v
-- inFutR :: (FutureG s (ReactiveG s b) -> FutureG t (ReactiveG t b))
-- -> (ReactiveG s b -> ReactiveG t b)
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)<interactive>: after: comparing after
f6 = f1 `mergeLR` f3
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)<interactive>: after: comparing after
f7 :: Future (Reactive Integer)
f7 = f1 `mergeL` f3
-- <NoBound Imp *** Exception: Prelude.undefined
f8 = f1 `mergeR` f3
f7' :: Future (Reactive Integer)
-- <NoBound Imp 1.0,1 `Stepper` (Imp 2.0,2)<interactive>: after: comparing after
f7' = q <$> f1
where
q (a `Stepper` Event u') = a `Stepper` Event (u' `merge` f3)