@@ -13,12 +13,10 @@
1313{-# LANGUAGE MultiParamTypeClasses #-}
1414{-# LANGUAGE MultiWayIf #-}
1515{-# LANGUAGE RankNTypes #-}
16−{-# LANGUAGE RecursiveDo #-}
1716{-# LANGUAGE RoleAnnotations #-}
1817{-# LANGUAGE ScopedTypeVariables #-}
1918{-# LANGUAGE TypeFamilies #-}
2019{-# LANGUAGE TypeOperators #-}
21−{-# LANGUAGE UnboxedTuples #-}
2220{-# LANGUAGE UndecidableInstances #-}
2321module Reflex.Spider.Internal (Spider, SpiderEnv (..), Global, SpiderHost, runSpiderHost, SpiderEventHandle (..), showSubscriberType, showEventType, ComputeM (..), MergeSubscribedParent (..), HasSpiderEnv (..), newSpiderEnv, SpiderPullM (..), SpiderPushM (..), ReadPhase (..)) where
2422
@@ -322,7 +320,7 @@ getHoldEventSubscription h = do
322320 v <- liftIO $ evaluate $ holdValue h
323321 i <- liftIO $ evaluate $ holdInvalidators h
324322 defer $ SomeAssignment v i new
325− liftIO $ writeIORef (holdParent h) $! Right subscription
323+ liftIO $ writeIORef (holdParent h) $ Right subscription
326324 return subscription
327325
328326type BehaviorEnv = (Maybe (Weak Invalidator, IORef [SomeBehaviorSubscribed]), IORef [SomeHoldInit])
@@ -534,6 +532,7 @@ data Switch a
534532 , switchSubscribed :: !(IORef (Maybe (SwitchSubscribed a)))
535533 }
536534
535+{-# ANN CoincidenceSubscribed "HLint: ignore Redundant bracket" #-}
537536data CoincidenceSubscribed a
538537 = CoincidenceSubscribed { coincidenceSubscribedCachedSubscribed :: !(IORef (Maybe (CoincidenceSubscribed a)))
539538 , coincidenceSubscribedOccurrence :: !(IORef (Maybe a))
@@ -706,10 +705,10 @@ updated = \case
706705 DynamicDynIdentity d -> EventDynIdentity d
707706
708707newMapDyn :: (a -> b) -> Dynamic Identity a -> Dynamic Identity b
709−newMapDyn f d = DynamicDynIdentity $ unsafeDyn (fmap f $ readBehaviorTracked $ current d) (fmap (Identity . f . runIdentity) $ updated d)
708+newMapDyn f d = DynamicDynIdentity $ unsafeDyn (fmap f $ readBehaviorTracked $ current d) (Identity . f . runIdentity <$> updated d)
710709
711710instance Functor (Dynamic Identity) where
712− fmap f d = newMapDyn f d
711+ fmap = newMapDyn
713712
714713instance Applicative (Dynamic Identity) where
715714 pure = DynamicConst
@@ -760,8 +759,8 @@ newJoinDyn :: Dynamic Identity (Dynamic Identity a) -> Dyn Identity a
760759newJoinDyn d =
761760 let readV0 = readBehaviorTracked . current =<< readBehaviorTracked (current d)
762761 eOuter = push (fmap (Just . Identity) . readBehaviorUntracked . current . runIdentity) $ updated d
763− eInner = switch $ fmap updated $ current d
764− eBoth = coincidence $ fmap (updated . runIdentity) $ updated d
762+ eInner = switch $ updated <$> current d
763+ eBoth = coincidence $ updated . runIdentity <$> updated d
765764 v' = unSpiderEvent $ R.leftmost $ map SpiderEvent [eBoth, eOuter, eInner]
766765 in unsafeDyn readV0 v'
767766
@@ -785,7 +784,7 @@ instance Functor Event where
785784 fmap f = push $ return . Just . f
786785
787786instance Functor Behavior where
788− fmap f = pull . liftM f . readBehaviorTracked
787+ fmap f = pull . fmap f . readBehaviorTracked
789788
790789{-# NOINLINE push #-} --TODO: If this is helpful, we can get rid of the unsafeNewIORef and use unsafePerformIO directly
791790push :: forall a b. (a -> ComputeM (Maybe b)) -> Event a -> Event b
@@ -859,7 +858,7 @@ run roots after = do
859858 m <- liftIO $ readIORef $ mergeSubscribedAccum subscribed
860859 liftIO $ writeIORef (mergeSubscribedAccum subscribed) $! DMap.empty
861860 --TODO: Assert that m is not empty
862− liftIO $ writeIORef (mergeSubscribedOccurrence subscribed) $! Just m
861+ liftIO $ writeIORef (mergeSubscribedOccurrence subscribed) $ Just m
863862 scheduleClear $ mergeSubscribedOccurrence subscribed
864863 propagateAndUpdateSubscribersRef (mergeSubscribedSubscribers subscribed) m
865864 go
@@ -1022,7 +1021,7 @@ propagate a subscribers = withIncreasedDepth $ do
10221021 SubscriberHoldIdentity h -> {-# SCC "traverseHoldIdentity" #-} propagateSubscriberHold h a
10231022 SubscriberSwitch subscribed -> {-# SCC "traverseSwitch" #-} do
10241023 tracePropagate $ "SubscriberSwitch" <> showNodeId subscribed
1025− liftIO $ writeIORef (switchSubscribedOccurrence subscribed) $! Just a
1024+ liftIO $ writeIORef (switchSubscribedOccurrence subscribed) $ Just a
10261025 scheduleClear $ switchSubscribedOccurrence subscribed
10271026 propagate a $ switchSubscribedSubscribers subscribed
10281027 SubscriberCoincidenceOuter subscribed -> {-# SCC "traverseCoincidenceOuter" #-} do
@@ -1032,7 +1031,7 @@ propagate a subscribers = withIncreasedDepth $ do
10321031 (occ, innerHeight, innerSubd) <- subscribeCoincidenceInner a outerHeight subscribed
10331032 tracePropagate $ " isJust occ = " <> show (isJust occ)
10341033 tracePropagate $ " innerHeight = " <> show innerHeight
1035− liftIO $ writeIORef (coincidenceSubscribedInnerParent subscribed) $! Just innerSubd
1034+ liftIO $ writeIORef (coincidenceSubscribedInnerParent subscribed) $ Just innerSubd
10361035 scheduleClear $ coincidenceSubscribedInnerParent subscribed
10371036 case occ of
10381037 Nothing -> do
@@ -1050,7 +1049,7 @@ propagate a subscribers = withIncreasedDepth $ do
10501049 case occ of
10511050 Just _ -> return () -- SubscriberCoincidenceOuter must have already propagated this event
10521051 Nothing -> do
1053− liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) $! Just a
1052+ liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) $ Just a
10541053 scheduleClear $ coincidenceSubscribedOccurrence subscribed
10551054 propagate a $ coincidenceSubscribedSubscribers subscribed
10561055 SubscriberHandle -> {-# SCC "traverseHandle" #-} tracePropagate "SubscriberHandle"
@@ -1094,13 +1093,13 @@ runBehaviorM :: BehaviorM a -> Maybe (Weak Invalidator, IORef [SomeBehaviorSubsc
10941093runBehaviorM a mwi holdInits = runReaderT (unBehaviorM a) (mwi, holdInits)
10951094
10961095askInvalidator :: BehaviorM (Maybe (Weak Invalidator))
1097−askInvalidator = liftM (fmap fst . fst) $ BehaviorM ask
1096+askInvalidator = fmap fst . fst <$> BehaviorM ask
10981097
10991098askParentsRef :: BehaviorM (Maybe (IORef [SomeBehaviorSubscribed]))
1100−askParentsRef = liftM (fmap snd . fst) $ BehaviorM ask
1099+askParentsRef = fmap snd . fst <$> BehaviorM ask
11011100
11021101askBehaviorHoldInits :: BehaviorM (IORef [SomeHoldInit])
1103−askBehaviorHoldInits = liftM snd $ BehaviorM ask
1102+askBehaviorHoldInits = snd <$> BehaviorM ask
11041103
11051104readBehaviorTracked :: Behavior a -> BehaviorM a
11061105readBehaviorTracked b = case b of
@@ -1129,7 +1128,7 @@ readBehaviorTracked b = case b of
11291128 , pullSubscribedOwnInvalidator = i
11301129 , pullSubscribedParents = parents
11311130 }
1132− liftIO $ writeIORef (pullValue p) $! Just subscribed
1131+ liftIO $ writeIORef (pullValue p) $ Just subscribed
11331132 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
11341133 return a
11351134 BehaviorDyn d -> readHoldTracked =<< getDynHold d
@@ -1153,13 +1152,13 @@ getDynHold d = do
11531152 holdInits <- getDeferralQueue
11541153 v0 <- liftIO $ runBehaviorM readV0 Nothing holdInits
11551154 h <- hold v0 v'
1156− liftIO $ writeIORef (unDyn d) $! Right h
1155+ liftIO $ writeIORef (unDyn d) $ Right h
11571156 return h
11581157
11591158{-
11601159readEvent :: Event a -> ResultM (Maybe a)
11611160readEvent e = case e of
1162− EventRoot k r -> liftIO . liftM (coerce . DMap.lookup k) . readIORef $ rootOccurrence r
1161+ EventRoot k r -> liftIO . fmap (coerce . DMap.lookup k) . readIORef $ rootOccurrence r
11631162 EventNever -> return Nothing
11641163 EventPush p -> do
11651164 subscribed <- getPushSubscribed p
@@ -1266,25 +1265,25 @@ subscribeEventSubscribed :: EventSubscribed a -> Subscriber a -> IO (Maybe (Subs
12661265subscribeEventSubscribed es sub = case es of
12671266 EventSubscribedRoot r -> do
12681267 traceSubscribe $ "subscribeEventSubscribed Root"
1269− fmap Just $ subscribeRootSubscribed r sub
1268+ Just <$> subscribeRootSubscribed r sub
12701269 EventSubscribedNever -> do
12711270 traceSubscribe $ "subscribeEventSubscribed Never"
12721271 return Nothing
12731272 EventSubscribedPush subscribed -> do
12741273 traceSubscribe $ "subscribeEventSubscribed Push"
1275− fmap Just $ subscribePushSubscribed subscribed sub
1274+ Just <$> subscribePushSubscribed subscribed sub
12761275 EventSubscribedFan k subscribed -> do
12771276 traceSubscribe $ "subscribeEventSubscribed Fan"
1278− fmap Just $ subscribeFanSubscribed k subscribed sub
1277+ Just <$> subscribeFanSubscribed k subscribed sub
12791278 EventSubscribedMerge subscribed -> do
12801279 traceSubscribe $ "subscribeEventSubscribed Merge"
1281− fmap Just $ subscribeMergeSubscribed subscribed sub
1280+ Just <$> subscribeMergeSubscribed subscribed sub
12821281 EventSubscribedSwitch subscribed -> do
12831282 traceSubscribe $ "subscribeEventSubscribed Switch"
1284− fmap Just $ subscribeSwitchSubscribed subscribed sub
1283+ Just <$> subscribeSwitchSubscribed subscribed sub
12851284 EventSubscribedCoincidence subscribed -> do
12861285 traceSubscribe $ "subscribeEventSubscribed Coincidence"
1287− fmap Just $ subscribeCoincidenceSubscribed subscribed sub
1286+ Just <$> subscribeCoincidenceSubscribed subscribed sub
12881287
12891288{-# INLINE eventSubscribedHeightRef #-}
12901289eventSubscribedHeightRef :: EventSubscribed a -> IORef Height
@@ -1317,7 +1316,7 @@ eventSubscribedGetParents = \case
13171316 EventSubscribedFan _ subscribed -> return [Some.This $ _eventSubscription_subscribed $ fanSubscribedParent subscribed]
13181317 EventSubscribedMerge subscribed -> do
13191318 ps <- readIORef $ mergeSubscribedParents subscribed
1320− return $ fmap (\(_ :=> v) -> Some.This $ _eventSubscription_subscribed $ mergeSubscribedParentSubscription v) $ DMap.toList ps
1319+ return $ R.ffor (DMap.toList ps) $ \(_ :=> v) -> Some.This $ _eventSubscription_subscribed $ mergeSubscribedParentSubscription v
13211320 EventSubscribedSwitch subscribed -> do
13221321 s <- readIORef $ switchSubscribedCurrentParent subscribed
13231322 return [Some.This $ _eventSubscription_subscribed s]
@@ -1354,7 +1353,7 @@ getRootSubscribed k r sub = do
13541353 let subscribed = RootSubscribed
13551354 { rootSubscribedKey = k
13561355 , rootSubscribedCachedSubscribed = cached
1357− , rootSubscribedOccurrence = liftM (coerce . DMap.lookup k) $ readIORef $ rootOccurrence r
1356+ , rootSubscribedOccurrence = fmap (coerce . DMap.lookup k) $ readIORef $ rootOccurrence r
13581357 , rootSubscribedSubscribers = subs
13591358 , rootSubscribedUninit = uninit
13601359 , rootSubscribedWeakSelf = weakSelf
@@ -1366,6 +1365,7 @@ getRootSubscribed k r sub = do
13661365 modifyIORef' (rootSubscribed r) $ DMap.insertWith (error $ "getRootSubscribed: duplicate key inserted into Root") k subscribed --TODO: I think we can just write back mSubscribed rather than re-reading it
13671366 return (sln, subscribed)
13681367
1368+{-# ANN cleanupRootSubscribed "HLint: ignore Redundant bracket" #-}
13691369cleanupRootSubscribed :: RootSubscribed a -> IO ()
13701370cleanupRootSubscribed self@(RootSubscribed { rootSubscribedKey = k, rootSubscribedCachedSubscribed = cached }) = do
13711371 rootSubscribedUninit self
@@ -1390,7 +1390,7 @@ getPushSubscribed p sub = do
13901390 s <- liftIO $ newSubscriberPush (pushCompute p) subscribedUnsafe
13911391 subscription@(EventSubscription _ subd) <- subscribe (pushParent p) s
13921392 parentOcc <- liftIO $ readEventSubscribed subd
1393− occ <- runComputeM $ liftM join $ mapM (pushCompute p) parentOcc
1393+ occ <- runComputeM $ join <$> mapM (pushCompute p) parentOcc
13941394 occRef <- liftIO $ newIORef occ
13951395 when (isJust occ) $ scheduleClear occRef
13961396 weakSelf <- liftIO $ newIORef $ error "getPushSubscribed: weakSelf not initialized"
@@ -1410,13 +1410,13 @@ getPushSubscribed p sub = do
14101410 }
14111411 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "PushSubscribed"
14121412 liftIO $ writeIORef subscribedRef $! subscribed
1413− liftIO $ writeIORef (pushSubscribed p) $! Just subscribed
1413+ liftIO $ writeIORef (pushSubscribed p) $ Just subscribed
14141414 return (sln, subscribed)
14151415
14161416cleanupPushSubscribed :: PushSubscribed a b -> IO ()
14171417cleanupPushSubscribed self = do
14181418 unsubscribe $ pushSubscribedParent self
1419− writeIORef (pushSubscribedCachedSubscribed self) $! Nothing
1419+ writeIORef (pushSubscribedCachedSubscribed self) $ Nothing
14201420
14211421{-# INLINE subscribePushSubscribed #-}
14221422subscribePushSubscribed :: PushSubscribed a b -> Subscriber b -> IO (SubscriberListTicket b)
@@ -1439,18 +1439,18 @@ getMergeSubscribed m sub = do
14391439 subscription@(EventSubscription _ parentSubd) <- subscribe e s
14401440 parentOcc <- liftIO $ readEventSubscribed parentSubd
14411441 height <- liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
1442− return $ (fmap (\x -> k :=> Identity x) parentOcc, height, k :=> (MergeSubscribedParent subscription s))
1443− let dm = DMap.fromDistinctAscList $ catMaybes $ map (\(x, _, _) -> x) subscribers
1442+ return $ (fmap (\x -> k :=> Identity x) parentOcc, height, k :=> MergeSubscribedParent subscription s)
1443+ let dm = DMap.fromDistinctAscList $ mapMaybe (\(x, _, _) -> x) subscribers
14441444 heights = fmap (\(_, h, _) -> h) subscribers --TODO: Assert that there's no invalidHeight in here
14451445 myHeightBag = heightBagFromList $ filter (/= invalidHeight) heights
1446− myHeight = if any (== invalidHeight) heights
1446+ myHeight = if invalidHeight `elem` heights
14471447 then invalidHeight
14481448 else succHeight $ heightBagMax myHeightBag
14491449 currentHeight <- getCurrentHeight
14501450 let (occ, accum) = if currentHeight >= myHeight -- If we should have fired by now
14511451 then (if DMap.null dm then Nothing else Just dm, DMap.empty)
14521452 else (Nothing, dm)
1453− when (not $ DMap.null accum) $ do
1453+ unless (DMap.null accum) $ do
14541454 scheduleMerge myHeight subscribedUnsafe
14551455 occRef <- liftIO $ newIORef occ
14561456 when (isJust occ) $ scheduleClear occRef
@@ -1478,7 +1478,7 @@ getMergeSubscribed m sub = do
14781478 defer $ SomeMergeInit subscribed $ updated $ mergeParents m
14791479 liftIO $ writeIORef subscribedRef $! subscribed
14801480 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "MergeSubscribed"
1481− liftIO $ writeIORef (mergeSubscribed m) $! Just subscribed
1481+ liftIO $ writeIORef (mergeSubscribed m) $ Just subscribed
14821482 return (sln, subscribed)
14831483
14841484cleanupMergeSubscribed :: MergeSubscribed k -> IO ()
@@ -1486,7 +1486,7 @@ cleanupMergeSubscribed subscribed = do
14861486 parents <- readIORef $ mergeSubscribedParents subscribed
14871487 forM_ (DMap.toList parents) $ \(_ :=> msp) -> unsubscribe $ mergeSubscribedParentSubscription msp
14881488 -- Not necessary, because this whole MergeSubscribed is dead: writeIORef (mergeSubscribedParents subscribed) DMap.empty
1489− writeIORef (mergeSubscribedCachedSubscribed subscribed) $! Nothing -- Get rid of the cached subscribed
1489+ writeIORef (mergeSubscribedCachedSubscribed subscribed) $ Nothing -- Get rid of the cached subscribed
14901490
14911491{-# INLINE subscribeMergeSubscribed #-}
14921492subscribeMergeSubscribed :: MergeSubscribed k -> Subscriber (DMap k Identity) -> IO (SubscriberListTicket (DMap k Identity))
@@ -1520,7 +1520,7 @@ getFanSubscribed k f sub = do
15201520 liftIO $ writeIORef subscribersRef $! DMap.singleton k $ FanSubscribedChildren subsForK self weakSelf
15211521 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug self "FanSubscribed"
15221522 liftIO $ writeIORef subscribedRef $! subscribed
1523− liftIO $ writeIORef (fanSubscribed f) $! Just subscribed
1523+ liftIO $ writeIORef (fanSubscribed f) $ Just subscribed
15241524 return (slnForSub, subscribed)
15251525
15261526cleanupFanSubscribed :: GCompare k => (k a, FanSubscribed k) -> IO ()
@@ -1531,7 +1531,7 @@ cleanupFanSubscribed (k, subscribed) = do
15311531 then do
15321532 unsubscribe $ fanSubscribedParent subscribed
15331533 -- Not necessary in this case, because this whole FanSubscribed is dead: writeIORef (fanSubscribedSubscribers subscribed) reducedSubscribers
1534− writeIORef (fanSubscribedCachedSubscribed subscribed) $! Nothing
1534+ writeIORef (fanSubscribedCachedSubscribed subscribed) Nothing
15351535 else writeIORef (fanSubscribedSubscribers subscribed) $! reducedSubscribers
15361536
15371537{-# INLINE subscribeFanSubscribed #-}
@@ -1590,14 +1590,14 @@ getSwitchSubscribed s sub = do
15901590 }
15911591 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "switchSubscribedWeakSelf"
15921592 liftIO $ writeIORef subscribedRef $! subscribed
1593− liftIO $ writeIORef (switchSubscribed s) $! Just subscribed
1593+ liftIO $ writeIORef (switchSubscribed s) $ Just subscribed
15941594 return (slnForSub, subscribed)
15951595
15961596cleanupSwitchSubscribed :: SwitchSubscribed a -> IO ()
15971597cleanupSwitchSubscribed subscribed = do
15981598 unsubscribe =<< readIORef (switchSubscribedCurrentParent subscribed)
15991599 finalize =<< readIORef (switchSubscribedOwnWeakInvalidator subscribed) -- We don't need to get invalidated if we're dead
1600− writeIORef (switchSubscribedCachedSubscribed subscribed) $! Nothing
1600+ writeIORef (switchSubscribedCachedSubscribed subscribed) Nothing
16011601
16021602{-# INLINE subscribeSwitchSubscribed #-}
16031603subscribeSwitchSubscribed :: SwitchSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
@@ -1645,13 +1645,13 @@ getCoincidenceSubscribed c sub = do
16451645 }
16461646 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "CoincidenceSubscribed"
16471647 liftIO $ writeIORef subscribedRef $! subscribed
1648− liftIO $ writeIORef (coincidenceSubscribed c) $! Just subscribed
1648+ liftIO $ writeIORef (coincidenceSubscribed c) $ Just subscribed
16491649 return (slnForSub, subscribed)
16501650
16511651cleanupCoincidenceSubscribed :: CoincidenceSubscribed a -> IO ()
16521652cleanupCoincidenceSubscribed subscribed = do
16531653 unsubscribe $ coincidenceSubscribedOuterParent subscribed
1654− writeIORef (coincidenceSubscribedCachedSubscribed subscribed) $! Nothing
1654+ writeIORef (coincidenceSubscribedCachedSubscribed subscribed) Nothing
16551655
16561656{-# INLINE subscribeCoincidenceSubscribed #-}
16571657subscribeCoincidenceSubscribed :: CoincidenceSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
@@ -1674,33 +1674,27 @@ fan e =
16741674 }
16751675 in EventSelector $ \k -> EventFan k f
16761676
1677−{- SPECIALIZE runHoldInits :: IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> EventM x () #-}
1678−--runHoldInits :: (CanSubscribe x m, Defer SomeMergeUpdate m) => IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> m ()
16791677runHoldInits :: IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> EventM x ()
16801678runHoldInits holdInitRef mergeInitRef = do
16811679 holdInits <- liftIO $ readIORef holdInitRef
16821680 mergeInits <- liftIO $ readIORef mergeInitRef
1683− if null holdInits && null mergeInits then return () else do
1684− liftIO $ writeIORef holdInitRef $! []
1685− liftIO $ writeIORef mergeInitRef $! []
1681+ unless (null holdInits && null mergeInits) $ do
1682+ liftIO $ writeIORef holdInitRef []
1683+ liftIO $ writeIORef mergeInitRef []
16861684 mapM_ initHold holdInits
16871685 mapM_ initMerge mergeInits
16881686 runHoldInits holdInitRef mergeInitRef
16891687
1690−{- SPECIALIZE initHold :: SomeHoldInit -> EventM x () #-}
1691−--initHold :: CanSubscribe x m => SomeHoldInit -> m ()
16921688initHold :: SomeHoldInit -> EventM x ()
16931689initHold (SomeHoldInit h) = void $ getHoldEventSubscription h
16941690
1695−{- SPECIALIZE initMerge :: SomeMergeInit -> EventM x () #-}
1696−--initMerge :: (CanSubscribe x m, Defer SomeMergeUpdate m) => SomeMergeInit -> m ()
16971691initMerge :: SomeMergeInit -> EventM x ()
16981692initMerge (SomeMergeInit subscribed changed) = do
16991693 changeSub <- liftIO $ newSubscriberMergeChange subscribed
17001694 EventSubscription _ changeSubd <- subscribe changed changeSub
17011695 change <- liftIO $ readEventSubscribed changeSubd
17021696 forM_ change $ \c -> defer $ SomeMergeUpdate c subscribed
1703− liftIO $ writeIORef (mergeSubscribedChange subscribed) $! (changeSub, changeSubd)
1697+ liftIO $ writeIORef (mergeSubscribedChange subscribed) (changeSub, changeSubd)
17041698
17051699-- | Run an event action outside of a frame
17061700runFrame :: EventM x a -> SpiderHost x a --TODO: This function also needs to hold the mutex
@@ -1724,7 +1718,7 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
17241718 return result
17251719 result <- runEventM go env
17261720 toClear <- readIORef toClearRef
1727− forM_ toClear $ \(SomeClear ref) -> {-# SCC "clear" #-} writeIORef ref $! Nothing
1721+ forM_ toClear $ \(SomeClear ref) -> {-# SCC "clear" #-} writeIORef ref Nothing
17281722 toClearRoot <- readIORef toClearRootRef
17291723 forM_ toClearRoot $ \(SomeRootClear ref) -> {-# SCC "rootClear" #-} writeIORef ref $! DMap.empty
17301724 toAssign <- readIORef toAssignRef
@@ -1735,7 +1729,7 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
17351729 when debugInvalidate $ putStrLn $ "Invalidating Hold"
17361730 writeIORef iRef =<< evaluate =<< invalidate toReconnectRef =<< readIORef iRef
17371731 mergeUpdates <- readIORef mergeUpdateRef
1738− writeIORef mergeUpdateRef $! []
1732+ writeIORef mergeUpdateRef []
17391733 let updateMerge :: SomeMergeUpdate -> IO [SomeEventSubscription]
17401734 updateMerge (SomeMergeUpdate (R.PatchDMap p :: R.PatchDMap (DMap k Event)) m) = do
17411735 oldParents <- readIORef $ mergeSubscribedParents m
@@ -1768,15 +1762,15 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
17681762 i <- evaluate $ switchSubscribedOwnInvalidator subscribed
17691763 wi' <- mkWeakPtrWithDebug i "wi'"
17701764 writeIORef (switchSubscribedOwnWeakInvalidator subscribed) $! wi'
1771− writeIORef (switchSubscribedBehaviorParents subscribed) $! []
1772− writeIORef holdInitRef $! [] --TODO: Should we reuse this?
1765+ writeIORef (switchSubscribedBehaviorParents subscribed) []
1766+ writeIORef holdInitRef [] --TODO: Should we reuse this?
17731767 e <- runBehaviorM (readBehaviorTracked (switchSubscribedParent subscribed)) (Just (wi', switchSubscribedBehaviorParents subscribed)) holdInitRef
17741768 runEventM (runHoldInits holdInitRef mergeInitRef) env --TODO: Is this actually OK? It seems like it should be, since we know that no events are firing at this point, but it still seems inelegant
17751769 --TODO: Make sure we touch the pieces of the SwitchSubscribed at the appropriate times
17761770 sub <- newSubscriberSwitch subscribed
17771771 subscription <- runReaderT (unSpiderHost (runFrame ({-# SCC "subscribeSwitch" #-} subscribe e sub))) spiderEnv --TODO: Assert that the event isn't firing --TODO: This should not loop because none of the events should be firing, but still, it is inefficient
17781772 {-
1779− stackTrace <- liftIO $ liftM renderStack $ ccsToStrings =<< (getCCSOf $! switchSubscribedParent subscribed)
1773+ stackTrace <- liftIO $ fmap renderStack $ ccsToStrings =<< (getCCSOf $! switchSubscribedParent subscribed)
17801774 liftIO $ putStrLn $ (++stackTrace) $ "subd' subscribed to " ++ case e of
17811775 EventRoot _ -> "EventRoot"
17821776 EventNever -> "EventNever"
@@ -1987,7 +1981,7 @@ invalidate toReconnectRef wis = do
19871981 traceInvalidate $ "invalidate: Pull" <> showNodeId p
19881982 mVal <- readIORef $ pullValue p
19891983 forM_ mVal $ \val -> do
1990− writeIORef (pullValue p) $! Nothing
1984+ writeIORef (pullValue p) Nothing
19911985 writeIORef (pullSubscribedInvalidators val) =<< evaluate =<< invalidate toReconnectRef =<< readIORef (pullSubscribedInvalidators val)
19921986 InvalidatorSwitch subscribed -> do
19931987 traceInvalidate $ "invalidate: Switch" <> showNodeId subscribed
@@ -2085,7 +2079,7 @@ instance R.Reflex (SpiderEnv x) where
20852079 {-# INLINABLE incrementalToDynamic #-}
20862080 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ DynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ current i) $ flip push (updated i) $ \p -> do
20872081 c <- readBehaviorUntracked $ current i
2088− return $ fmap Identity $ R.apply p c --TODO: Avoid the redundant 'apply'
2082+ return $ Identity <$> R.apply p c --TODO: Avoid the redundant 'apply'
20892083
20902084instance R.MonadSample (SpiderEnv x) (EventM x) where
20912085 {-# INLINABLE sample #-}
@@ -2100,13 +2094,13 @@ instance R.MonadHold (SpiderEnv x) (EventM x) where
21002094 holdIncremental = holdIncrementalSpiderEventM
21012095
21022096holdSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Behavior (SpiderEnv x) a)
2103−holdSpiderEventM v0 e = liftM (SpiderBehavior . BehaviorHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
2097+holdSpiderEventM v0 e = fmap (SpiderBehavior . BehaviorHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
21042098
21052099holdDynSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Dynamic (SpiderEnv x) a)
2106−holdDynSpiderEventM v0 e = liftM (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
2100+holdDynSpiderEventM v0 e = fmap (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
21072101
21082102holdIncrementalSpiderEventM :: R.Patch p => a -> R.Event (SpiderEnv x) (p a) -> EventM x (R.Incremental (SpiderEnv x) p a)
2109−holdIncrementalSpiderEventM v0 e = liftM (SpiderIncremental . DynamicHold) $ hold v0 $ unSpiderEvent e
2103+holdIncrementalSpiderEventM v0 e = fmap (SpiderIncremental . DynamicHold) $ hold v0 $ unSpiderEvent e
21102104
21112105instance R.MonadHold (SpiderEnv x) (SpiderHost x) where
21122106 {-# INLINABLE hold #-}
@@ -2132,9 +2126,9 @@ instance R.MonadHold (SpiderEnv x) (SpiderPushM x) where
21322126 {-# INLINABLE hold #-}
21332127 hold v0 e = R.current <$> R.holdDyn v0 e
21342128 {-# INLINABLE holdDyn #-}
2135− holdDyn v0 (SpiderEvent e) = SpiderPushM $ liftM (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity e
2129+ holdDyn v0 (SpiderEvent e) = SpiderPushM $ fmap (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity e
21362130 {-# INLINABLE holdIncremental #-}
2137− holdIncremental v0 (SpiderEvent e) = SpiderPushM $ liftM (SpiderIncremental . DynamicHold) $ hold v0 e
2131+ holdIncremental v0 (SpiderEvent e) = SpiderPushM $ SpiderIncremental . DynamicHold <$> hold v0 e
21382132
21392133data RootTrigger a = forall k. GCompare k => RootTrigger (SubscriberList a, IORef (DMap k Identity), k a)
21402134newtype SpiderEventHandle a = SpiderEventHandle { unSpiderEventHandle :: EventSubscription a }
@@ -2152,7 +2146,7 @@ instance R.ReflexHost (SpiderEnv x) where
21522146
21532147instance R.MonadReadEvent (SpiderEnv x) (ReadPhase x) where
21542148 {-# INLINABLE readEvent #-}
2155− readEvent h = ReadPhase $ liftM (fmap return) $ liftIO $ do
2149+ readEvent h = ReadPhase $ fmap (fmap return) $ liftIO $ do
21562150 let EventSubscription sln subscribed = unSpiderEventHandle h
21572151 result <- readEventSubscribed subscribed
21582152 touch sln
@@ -2207,11 +2201,11 @@ addIdentity = unsafeCoerce
22072201
22082202instance R.MonadHold (SpiderEnv x) (SpiderHostFrame x) where
22092203 {-# INLINABLE hold #-}
2210− hold v0 e = SpiderHostFrame $ liftM (SpiderBehavior . BehaviorHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
2204+ hold v0 e = SpiderHostFrame $ fmap (SpiderBehavior . BehaviorHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
22112205 {-# INLINABLE holdDyn #-}
2212− holdDyn v0 e = SpiderHostFrame $ liftM (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
2206+ holdDyn v0 e = SpiderHostFrame $ fmap (SpiderDynamic . DynamicHoldIdentity) $ hold v0 $ addIdentity $ unSpiderEvent e
22132207 {-# INLINABLE holdIncremental #-}
2214− holdIncremental v0 e = SpiderHostFrame $ liftM (SpiderIncremental . DynamicHold) $ hold v0 $ unSpiderEvent e
2208+ holdIncremental v0 e = SpiderHostFrame $ fmap (SpiderIncremental . DynamicHold) $ hold v0 $ unSpiderEvent e
22152209
22162210newEventWithTriggerIO :: forall a. (RootTrigger a -> IO (IO ())) -> IO (Event a)
22172211newEventWithTriggerIO f = do
@@ -2230,13 +2224,13 @@ newFanEventWithTriggerIO f = do
22302224 return $ EventSelector $ \k -> EventRoot k r
22312225
22322226instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHost x) where
2233− newEventWithTrigger = SpiderHost . lift . liftM SpiderEvent . newEventWithTriggerIO
2227+ newEventWithTrigger = SpiderHost . lift . fmap SpiderEvent . newEventWithTriggerIO
22342228 newFanEventWithTrigger f = SpiderHost $ lift $ do
22352229 es <- newFanEventWithTriggerIO f
22362230 return $ R.EventSelector $ SpiderEvent . select es
22372231
22382232instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHostFrame x) where
2239− newEventWithTrigger = SpiderHostFrame . EventM . liftIO . liftM SpiderEvent . newEventWithTriggerIO
2233+ newEventWithTrigger = SpiderHostFrame . EventM . liftIO . fmap SpiderEvent . newEventWithTriggerIO
22402234 newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do
22412235 es <- newFanEventWithTriggerIO f
22422236 return $ R.EventSelector $ SpiderEvent . select es