@@ -125,10 +125,10 @@ forDyn = flip mapDyn
125125
126126{-# INLINE mapDynM #-}
127127mapDynM :: forall t m a b. (Reflex t, MonadHold t m) => (forall m'. MonadSample t m' => a -> m' b) -> Dynamic t a -> m (Dynamic t b)
128−mapDynM f (~(Dynamic b e)) = do
129− let e' = push (liftM Just . f :: a -> PushM t (Maybe b)) e
128+mapDynM f d = do
129+ let e' = push (liftM Just . f :: a -> PushM t (Maybe b)) $ updated d
130130 eb' = fmap constant e'
131− v0 = pull $ f =<< sample b
131+ v0 = pull $ f =<< sample (current d)
132132 bb' :: Behavior t (Behavior t b) <- hold v0 eb'
133133 let b' = pull $ sample =<< sample bb'
134134 return $ Dynamic b' e'
@@ -203,19 +203,19 @@ distributeDMapOverDyn dm = case DMap.toList dm of
203203 return $ Dynamic bdm edm
204204
205205combineDyn :: forall t m a b c. (Reflex t, MonadHold t m) => (a -> b -> c) -> Dynamic t a -> Dynamic t b -> m (Dynamic t c)
206−combineDyn f (~(Dynamic ba ea)) (~(Dynamic bb eb)) = do
207− let eab = align ea eb
206+combineDyn f da db = do
207+ let eab = align (updated da) (updated db)
208208 ec = flip push eab $ \o -> do
209209 (a, b) <- case o of
210210 This a -> do
211− b <- sample bb
211+ b <- sample $ current db
212212 return (a, b)
213213 That b -> do
214− a <- sample ba
214+ a <- sample $ current da
215215 return (a, b)
216216 These a b -> return (a, b)
217217 return $ Just $ f a b
218− c0 :: Behavior t c = pull $ liftM2 f (sample ba) (sample bb)
218+ c0 :: Behavior t c = pull $ liftM2 f (sample $ current da) (sample $ current db)
219219 bbc :: Behavior t (Behavior t c) <- hold c0 $ fmap constant ec
220220 let bc :: Behavior t c = pull $ sample =<< sample bbc
221221 return $ Dynamic bc ec
@@ -281,16 +281,18 @@ attachDynWithMaybe f d e =
281281-- Demux
282282--------------------------------------------------------------------------------
283283
284−data Demux t k = Demux (Behavior t k) (EventSelector t (Const2 k Bool))
284+data Demux t k = Demux { demuxValue :: Behavior t k
285+ , demuxSelector :: EventSelector t (Const2 k Bool)
286+ }
285287
286288demux :: (Reflex t, Ord k) => Dynamic t k -> Demux t k
287289demux k = Demux (current k) (fan $ attachWith (\k0 k1 -> if k0 == k1 then DMap.empty else DMap.fromList [Const2 k0 :=> False, Const2 k1 :=> True]) (current k) (updated k))
288290
289291--TODO: The pattern of using hold (sample b0) can be reused in various places as a safe way of building certain kinds of Dynamics; see if we can factor this out
290292getDemuxed :: (Reflex t, MonadHold t m, Eq k) => Demux t k -> k -> m (Dynamic t Bool)
291−getDemuxed (Demux bk es) k = do
292− let e = select es (Const2 k)
293− bb <- hold (liftM (==k) $ sample bk) $ fmap return e
293+getDemuxed d k = do
294+ let e = select (demuxSelector d) (Const2 k)
295+ bb <- hold (liftM (==k) $ sample $ demuxValue d) $ fmap return e
294296 let b = pull $ join $ sample bb
295297 return $ Dynamic b e
296298