@@ -72,10 +72,13 @@ import System.IO.Unsafe
7272import System.Mem.Weak
7373import Unsafe.Coerce
7474
75−#if defined(MIN_VERSION_semialign)
75+#ifdef MIN_VERSION_semialign
7676#if MIN_VERSION_these(0,8,0)
7777import Data.These.Combinators (justThese)
7878#endif
79+#if MIN_VERSION_semialign(1,1,0)
80+import Data.Zip (Zip (..))
81+#endif
7982#endif
8083
8184#ifdef DEBUG_CYCLES
@@ -329,9 +332,9 @@ cacheEvent e =
329332 scheduleClear occRef
330333 propagateFast a subscribers
331334 , subscriberInvalidateHeight = \old -> do
332− FastWeakBag.traverse subscribers $ invalidateSubscriberHeight old
335+ FastWeakBag.traverse_ subscribers $ invalidateSubscriberHeight old
333336 , subscriberRecalculateHeight = \new -> do
334− FastWeakBag.traverse subscribers $ recalculateSubscriberHeight new
337+ FastWeakBag.traverse_ subscribers $ recalculateSubscriberHeight new
335338 }
336339 when (isJust occ) $ do
337340 liftIO $ writeIORef occRef occ -- Set the initial value of occRef; we don't need to do this if occ is Nothing
@@ -447,12 +450,12 @@ newSubscriberFan subscribed = return $ Subscriber
447450 , subscriberInvalidateHeight = \old -> do
448451 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
449452 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
450− forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse (_fanSubscribedChildren_list v) $ invalidateSubscriberHeight old
453+ forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse_ (_fanSubscribedChildren_list v) $ invalidateSubscriberHeight old
451454 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
452455 , subscriberRecalculateHeight = \new -> do
453456 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
454457 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
455− forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse (_fanSubscribedChildren_list v) $ recalculateSubscriberHeight new
458+ forM_ (DMap.toList subscribers) $ \(_ :=> v) -> WeakBag.traverse_ (_fanSubscribedChildren_list v) $ recalculateSubscriberHeight new
456459 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
457460 }
458461
@@ -468,7 +471,7 @@ newSubscriberSwitch subscribed = return $ Subscriber
468471 oldHeight <- readIORef $ switchSubscribedHeight subscribed
469472 when (oldHeight /= invalidHeight) $ do
470473 writeIORef (switchSubscribedHeight subscribed) $! invalidHeight
471− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
474+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
472475 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberSwitch" <> showNodeId subscribed <> " done"
473476 , subscriberRecalculateHeight = \new -> do
474477 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberSwitch" <> showNodeId subscribed
@@ -491,8 +494,8 @@ newSubscriberCoincidenceOuter subscribed = return $ Subscriber
491494 Nothing -> do
492495 when (innerHeight > outerHeight) $ liftIO $ do -- If the event fires, it will fire at a later height
493496 writeIORef (coincidenceSubscribedHeight subscribed) $! innerHeight
494− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight outerHeight
495− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight innerHeight
497+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight outerHeight
498+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight innerHeight
496499 Just o -> do -- Since it's already firing, no need to adjust height
497500 liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) occ
498501 scheduleClear $ coincidenceSubscribedOccurrence subscribed
@@ -539,14 +542,14 @@ propagate :: a -> WeakBag (Subscriber x a) -> EventM x ()
539542propagate a subscribers = withIncreasedDepth $ do
540543 -- 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
541544 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
542− WeakBag.traverse subscribers $ \s -> subscriberPropagate s a
545+ WeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
543546
544547-- | Propagate everything at the current height
545548propagateFast :: a -> FastWeakBag (Subscriber x a) -> EventM x ()
546549propagateFast a subscribers = withIncreasedDepth $ do
547550 -- 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
548551 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
549− FastWeakBag.traverse subscribers $ \s -> subscriberPropagate s a
552+ FastWeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
550553
551554--------------------------------------------------------------------------------
552555-- EventSubscribed
@@ -1163,7 +1166,10 @@ instance HasSpiderTimeline x => Semialign (Event x) where
11631166 align ea eb = mapMaybe dmapToThese $ mergeG coerce $ dynamicConst $
11641167 DMap.fromDistinctAscList [LeftTag :=> ea, RightTag :=> eb]
11651168
1166−#if defined(MIN_VERSION_semialign)
1169+#ifdef MIN_VERSION_semialign
1170+#if MIN_VERSION_semialign(1,1,0)
1171+instance HasSpiderTimeline x => Zip (Event x) where
1172+#endif
11671173 zip x y = mapMaybe justThese $ align x y
11681174#endif
11691175
@@ -1521,15 +1527,15 @@ fanInt p = unsafePerformIO $ do
15211527 liftIO $ writeIORef (_fanInt_occRef self) m
15221528 scheduleIntClear $ _fanInt_occRef self
15231529 FastMutableIntMap.forIntersectionWithImmutable_ (_fanInt_subscribers self) m $ \b v -> do --TODO: Do we need to know that no subscribers are being added as we traverse?
1524− FastWeakBag.traverse b $ \s -> do
1530+ FastWeakBag.traverse_ b $ \s -> do
15251531 subscriberPropagate s v
15261532 , subscriberInvalidateHeight = \old -> do
15271533 FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b -> do
1528− FastWeakBag.traverse b $ \s -> do
1534+ FastWeakBag.traverse_ b $ \s -> do
15291535 subscriberInvalidateHeight s old
15301536 , subscriberRecalculateHeight = \new -> do
15311537 FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b -> do
1532− FastWeakBag.traverse b $ \s -> do
1538+ FastWeakBag.traverse_ b $ \s -> do
15331539 subscriberRecalculateHeight s new
15341540 }
15351541 liftIO $ do
@@ -2201,7 +2207,7 @@ runFrame a = SpiderHost $ do
22012207 myHeight <- readIORef $ switchSubscribedHeight subscribed
22022208 when (parentHeight /= myHeight) $ do
22032209 writeIORef (switchSubscribedHeight subscribed) $! invalidHeight
2204− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight myHeight
2210+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ invalidateSubscriberHeight myHeight
22052211 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
22062212 forM_ coincidenceInfos $ \(SomeResetCoincidence subscription mcs) -> do
22072213 unsubscribe subscription
@@ -2242,7 +2248,7 @@ invalidateCoincidenceHeight subscribed = do
22422248 oldHeight <- readIORef $ coincidenceSubscribedHeight subscribed
22432249 when (oldHeight /= invalidHeight) $ do
22442250 writeIORef (coincidenceSubscribedHeight subscribed) $! invalidHeight
2245− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
2251+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight oldHeight
22462252
22472253updateSwitchHeight :: Height -> SwitchSubscribed x a -> IO ()
22482254updateSwitchHeight new subscribed = do
@@ -2250,7 +2256,7 @@ updateSwitchHeight new subscribed = do
22502256 when (oldHeight == invalidHeight) $ do --TODO: This 'when' should probably be an assertion
22512257 when (new /= invalidHeight) $ do --TODO: This 'when' should probably be an assertion
22522258 writeIORef (switchSubscribedHeight subscribed) $! new
2253− WeakBag.traverse (switchSubscribedSubscribers subscribed) $ recalculateSubscriberHeight new
2259+ WeakBag.traverse_ (switchSubscribedSubscribers subscribed) $ recalculateSubscriberHeight new
22542260
22552261recalculateCoincidenceHeight :: CoincidenceSubscribed x a -> IO ()
22562262recalculateCoincidenceHeight subscribed = do
@@ -2259,7 +2265,7 @@ recalculateCoincidenceHeight subscribed = do
22592265 height <- calculateCoincidenceHeight subscribed
22602266 when (height /= invalidHeight) $ do
22612267 writeIORef (coincidenceSubscribedHeight subscribed) $! height
2262− WeakBag.traverse (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight height
2268+ WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ recalculateSubscriberHeight height
22632269
22642270calculateSwitchHeight :: SwitchSubscribed x a -> IO Height
22652271calculateSwitchHeight subscribed = getEventSubscribedHeight . _eventSubscription_subscribed =<< readIORef (switchSubscribedCurrentParent subscribed)