@@ -73,10 +73,13 @@ import System.IO.Unsafe
7373import System.Mem.Weak
7474import Unsafe.Coerce
7575
76−#if defined(MIN_VERSION_semialign)
76+#ifdef MIN_VERSION_semialign
7777#if MIN_VERSION_these(0,8,0)
7878import Data.These.Combinators (justThese)
7979#endif
80+#if MIN_VERSION_semialign(1,1,0)
81+import Data.Zip (Zip (..))
82+#endif
8083#endif
8184
8285#ifdef DEBUG_CYCLES
@@ -103,6 +106,7 @@ import qualified Reflex.Host.Class
103106import Reflex.NotReady.Class
104107import Reflex.Patch
105108import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
109+import Reflex.PerformEvent.Base (PerformEventT)
106110
107111#ifdef DEBUG_TRACE_EVENTS
108112import qualified Data.ByteString.Char8 as BS8
@@ -294,6 +298,7 @@ cacheEvent e =
294298#endif
295299 subscribers <- liftIO FastWeakBag.empty
296300 occRef <- liftIO $ newIORef Nothing -- This should never be read prior to being set below
301+<<<<<<< HEAD
297302 (parentSub, occ) <- subscribeAndRead e $ debugSubscriber' ("cacheEvent" <> showNodeId' nodeId) $ Subscriber
298303 { subscriberPropagate = \a -> do
299304 -- checkCycle (_eventSubscription_subscribed parentSub)
@@ -303,6 +308,29 @@ cacheEvent e =
303308 , subscriberInvalidateHeight = FastWeakBag.traverse subscribers . invalidateSubscriberHeight
304309 , subscriberRecalculateHeight = FastWeakBag.traverse subscribers . recalculateSubscriberHeight
305310 }
311+||||||| merged common ancestors
312+ (parentSub, occ) <- subscribeAndRead e $ Subscriber
313+ { subscriberPropagate = \a -> do
314+ liftIO $ writeIORef occRef $ Just a
315+ scheduleClear occRef
316+ propagateFast a subscribers
317+ , subscriberInvalidateHeight = \old -> do
318+ FastWeakBag.traverse subscribers $ invalidateSubscriberHeight old
319+ , subscriberRecalculateHeight = \new -> do
320+ FastWeakBag.traverse subscribers $ recalculateSubscriberHeight new
321+ }
322+=======
323+ (parentSub, occ) <- subscribeAndRead e $ Subscriber
324+ { subscriberPropagate = \a -> do
325+ liftIO $ writeIORef occRef $ Just a
326+ scheduleClear occRef
327+ propagateFast a subscribers
328+ , subscriberInvalidateHeight = \old -> do
329+ FastWeakBag.traverse_ subscribers $ invalidateSubscriberHeight old
330+ , subscriberRecalculateHeight = \new -> do
331+ FastWeakBag.traverse_ subscribers $ recalculateSubscriberHeight new
332+ }
333+>>>>>>> develop
306334 when (isJust occ) $ do
307335 liftIO $ writeIORef occRef occ -- Set the initial value of occRef; we don't need to do this if occ is Nothing
308336 scheduleClear occRef
@@ -435,14 +463,12 @@ newSubscriberFan subscribed = debugSubscriber ("SubscriberFan " <> showNodeId su
435463 return ()
436464 , subscriberInvalidateHeight = \old -> do
437465 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
438− forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse (_fanSubscribedChildren_list v) $ invalidateSubscriberHeight old
439−
466+ forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse_ (_fanSubscribedChildren_list v) $ invalidateSubscriberHeight old
440467 , subscriberRecalculateHeight = \new -> do
441468 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
442− forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse (_fanSubscribedChildren_list v) $ recalculateSubscriberHeight new
469+ forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse_ (_fanSubscribedChildren_list v) $ recalculateSubscriberHeight new
443470 }
444471
445−
446472newSubscriberSwitch :: forall x a. HasSpiderTimeline x => SwitchSubscribed x a -> IO (Subscriber x a)
447473newSubscriberSwitch subscribed = debugSubscriber ("SubscriberCoincidenceOuter" <> showNodeId subscribed) $ Subscriber
448474 { subscriberPropagate = \a -> {-# SCC "traverseSwitch" #-} do
@@ -453,7 +479,7 @@ newSubscriberSwitch subscribed = debugSubscriber ("SubscriberCoincidenceOuter" <
453479 oldHeight <- readIORef $ switchSubscribedHeight subscribed
454480 when (oldHeight /= invalidHeight) $ do
455481 writeIORef (switchSubscribedHeight subscribed) $! invalidHeight
456− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
482+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
457483 , subscriberRecalculateHeight = (`updateSwitchHeight` subscribed)
458484 }
459485
@@ -472,8 +498,8 @@ newSubscriberCoincidenceOuter subscribed = debugSubscriber ("SubscriberCoinciden
472498 Nothing ->
473499 when (innerHeight > outerHeight) $ liftIO $ do -- If the event fires, it will fire at a later height
474500 writeIORef (coincidenceSubscribedHeight subscribed) $! innerHeight
475− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight outerHeight
476− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight innerHeight
501+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight outerHeight
502+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight innerHeight
477503 Just o -> do -- Since it's already firing, no need to adjust height
478504 liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) occ
479505 scheduleClear $ coincidenceSubscribedOccurrence subscribed
@@ -507,14 +533,14 @@ propagate :: forall x a. HasSpiderTimeline x => a -> WeakBag (Subscriber x a) ->
507533propagate a subscribers = withIncreasedDepth (Proxy::Proxy x) $
508534 -- Note: in the following traversal, we do not visit nodes that are added to the list during our traversal; they are new events, which will necessarily have full information already, so there is no need to traverse them
509535 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
510− WeakBag.traverse subscribers $ \s -> subscriberPropagate s a
536+ WeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
511537
512538-- | Propagate everything at the current height
513539propagateFast :: forall x a. HasSpiderTimeline x => a -> FastWeakBag (Subscriber x a) -> EventM x ()
514540propagateFast a subscribers = withIncreasedDepth (Proxy::Proxy x) $
515541 -- Note: in the following traversal, we do not visit nodes that are added to the list during our traversal; they are new events, which will necessarily have full information already, so there is no need to traverse them
516542 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
517− FastWeakBag.traverse subscribers $ \s -> subscriberPropagate s a
543+ FastWeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
518544
519545--------------------------------------------------------------------------------
520546-- EventSubscribed
@@ -1139,7 +1165,10 @@ instance HasSpiderTimeline x => Semialign (Event x) where
11391165 align ea eb = mapMaybe dmapToThese $ mergeG coerce $ dynamicConst $
11401166 DMap.fromDistinctAscList [LeftTag :=> ea, RightTag :=> eb]
11411167
1142−#if defined(MIN_VERSION_semialign)
1168+#ifdef MIN_VERSION_semialign
1169+#if MIN_VERSION_semialign(1,1,0)
1170+instance HasSpiderTimeline x => Zip (Event x) where
1171+#endif
11431172 zip x y = mapMaybe justThese $ align x y
11441173#endif
11451174
@@ -1587,15 +1616,15 @@ fanInt p = unsafePerformIO $ do
15871616 liftIO $ writeIORef (_fanInt_occRef self) m
15881617 scheduleIntClear $ _fanInt_occRef self
15891618 FastMutableIntMap.forIntersectionWithImmutable_ (_fanInt_subscribers self) m $ \b v -> --TODO: Do we need to know that no subscribers are being added as we traverse?
1590− FastWeakBag.traverse b $ \s ->
1619+ FastWeakBag.traverse_ b $ \s ->
15911620 subscriberPropagate s v
15921621 , subscriberInvalidateHeight = \old ->
15931622 FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1594− FastWeakBag.traverse b $ \s ->
1623+ FastWeakBag.traverse_ b $ \s ->
15951624 subscriberInvalidateHeight s old
15961625 , subscriberRecalculateHeight = \new ->
15971626 FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1598− FastWeakBag.traverse b $ \s ->
1627+ FastWeakBag.traverse_ b $ \s ->
15991628 subscriberRecalculateHeight s new
16001629 }
16011630 liftIO $ do
@@ -2326,7 +2355,7 @@ runFrame a = SpiderHost $ do
23262355 myHeight <- readIORef $ switchSubscribedHeight subscribed
23272356 when (parentHeight /= myHeight) $ do
23282357 writeIORef (switchSubscribedHeight subscribed) $! invalidHeight
2329− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight myHeight
2358+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight myHeight
23302359 mapM_ _someMergeUpdate_invalidateHeight mergeUpdates --TODO: In addition to when the patch is completely empty, we should also not run this if it has some Nothing values, but none of them have actually had any effect; potentially, we could even check for Just values with no effect (e.g. by comparing their IORefs and ignoring them if they are unchanged); actually, we could just check if the new height is different
23312360 forM_ coincidenceInfos $ \(SomeResetCoincidence subscription mcs) -> do
23322361 unsubscribe subscription
@@ -2367,7 +2396,7 @@ invalidateCoincidenceHeight subscribed = do
23672396 oldHeight <- readIORef $ coincidenceSubscribedHeight subscribed
23682397 when (oldHeight /= invalidHeight) $ do
23692398 writeIORef (coincidenceSubscribedHeight subscribed) $! invalidHeight
2370− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
2399+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
23712400
23722401updateSwitchHeight :: Height -> SwitchSubscribed x a -> IO ()
23732402updateSwitchHeight new subscribed = do
@@ -2375,7 +2404,7 @@ updateSwitchHeight new subscribed = do
23752404 when (oldHeight == invalidHeight) $ do --TODO: This 'when' should probably be an assertion
23762405 when (new /= invalidHeight) $ do --TODO: This 'when' should probably be an assertion
23772406 writeIORef (switchSubscribedHeight subscribed) $! new
2378− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ recalculateSubscriberHeight new
2407+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ recalculateSubscriberHeight new
23792408
23802409recalculateCoincidenceHeight :: CoincidenceSubscribed x a -> IO ()
23812410recalculateCoincidenceHeight subscribed = do
@@ -2384,7 +2413,7 @@ recalculateCoincidenceHeight subscribed = do
23842413 height <- calculateCoincidenceHeight subscribed
23852414 when (height /= invalidHeight) $ do
23862415 writeIORef (coincidenceSubscribedHeight subscribed) $! height
2387− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight height
2416+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight height
23882417
23892418calculateSwitchHeight :: SwitchSubscribed x a -> IO Height
23902419calculateSwitchHeight subscribed = getEventSubscribedHeight . _eventSubscription_subscribed =<< readIORef (switchSubscribedCurrentParent subscribed)
@@ -2824,3 +2853,11 @@ instance MonadAtomicRef (SpiderHostFrame x) where
28242853instance PrimMonad (SpiderHostFrame x) where
28252854 type PrimState (SpiderHostFrame x) = PrimState IO
28262855 primitive = SpiderHostFrame . EventM . primitive
2856+
2857+instance NotReady (SpiderTimeline x) (SpiderHost x) where
2858+ notReadyUntil _ = return ()
2859+ notReady = return ()
2860+
2861+instance HasSpiderTimeline x => NotReady (SpiderTimeline x) (PerformEventT (SpiderTimeline x) (SpiderHost x)) where
2862+ notReadyUntil _ = return ()
2863+ notReady = return ()