@@ -13,12 +13,10 @@
13{-# LANGUAGE MultiParamTypeClasses #-}
13{-# LANGUAGE MultiParamTypeClasses #-}
14{-# LANGUAGE MultiWayIf #-}
14{-# LANGUAGE MultiWayIf #-}
15{-# LANGUAGE RankNTypes #-}
15{-# LANGUAGE RankNTypes #-}
16−{-# LANGUAGE RecursiveDo #-}
17{-# LANGUAGE RoleAnnotations #-}
16{-# LANGUAGE RoleAnnotations #-}
18{-# LANGUAGE ScopedTypeVariables #-}
17{-# LANGUAGE ScopedTypeVariables #-}
19{-# LANGUAGE TypeFamilies #-}
18{-# LANGUAGE TypeFamilies #-}
20{-# LANGUAGE TypeOperators #-}
19{-# LANGUAGE TypeOperators #-}
21−{-# LANGUAGE UnboxedTuples #-}
22{-# LANGUAGE UndecidableInstances #-}
20{-# LANGUAGE UndecidableInstances #-}
23module Reflex.Spider.Internal (Spider, SpiderEnv (..), Global, SpiderHost, runSpiderHost, SpiderEventHandle (..), showSubscriberType, showEventType, ComputeM (..), MergeSubscribedParent (..), HasSpiderEnv (..), newSpiderEnv, SpiderPullM (..), SpiderPushM (..), ReadPhase (..)) where
21module Reflex.Spider.Internal (Spider, SpiderEnv (..), Global, SpiderHost, runSpiderHost, SpiderEventHandle (..), showSubscriberType, showEventType, ComputeM (..), MergeSubscribedParent (..), HasSpiderEnv (..), newSpiderEnv, SpiderPullM (..), SpiderPushM (..), ReadPhase (..)) where
@@ -322,7 +320,7 @@ getHoldEventSubscription h = do
322 v <- liftIO $ evaluate $ holdValue h
320 v <- liftIO $ evaluate $ holdValue h
323 i <- liftIO $ evaluate $ holdInvalidators h
321 i <- liftIO $ evaluate $ holdInvalidators h
324 defer $ SomeAssignment v i new
322 defer $ SomeAssignment v i new
325− liftIO $ writeIORef (holdParent h) $! Right subscription
323+ liftIO $ writeIORef (holdParent h) $ Right subscription
326 return subscription
324 return subscription
328type BehaviorEnv = (Maybe (Weak Invalidator, IORef [SomeBehaviorSubscribed]), IORef [SomeHoldInit])
326type BehaviorEnv = (Maybe (Weak Invalidator, IORef [SomeBehaviorSubscribed]), IORef [SomeHoldInit])
@@ -534,6 +532,7 @@ data Switch a
534 , switchSubscribed :: !(IORef (Maybe (SwitchSubscribed a)))
532 , switchSubscribed :: !(IORef (Maybe (SwitchSubscribed a)))
535+{-# ANN CoincidenceSubscribed "HLint: ignore Redundant bracket" #-}
537data CoincidenceSubscribed a
536data CoincidenceSubscribed a
538 = CoincidenceSubscribed { coincidenceSubscribedCachedSubscribed :: !(IORef (Maybe (CoincidenceSubscribed a)))
537 = CoincidenceSubscribed { coincidenceSubscribedCachedSubscribed :: !(IORef (Maybe (CoincidenceSubscribed a)))
539 , coincidenceSubscribedOccurrence :: !(IORef (Maybe a))
538 , coincidenceSubscribedOccurrence :: !(IORef (Maybe a))
@@ -706,10 +705,10 @@ updated = \case
706 DynamicDynIdentity d -> EventDynIdentity d
705 DynamicDynIdentity d -> EventDynIdentity d
708newMapDyn :: (a -> b) -> Dynamic Identity a -> Dynamic Identity b
707newMapDyn :: (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)
711instance Functor (Dynamic Identity) where
710instance Functor (Dynamic Identity) where
712− fmap f d = newMapDyn f d
711+ fmap = newMapDyn
714instance Applicative (Dynamic Identity) where
713instance Applicative (Dynamic Identity) where
715 pure = DynamicConst
714 pure = DynamicConst
@@ -760,8 +759,8 @@ newJoinDyn :: Dynamic Identity (Dynamic Identity a) -> Dyn Identity a
760newJoinDyn d =
759newJoinDyn d =
761 let readV0 = readBehaviorTracked . current =<< readBehaviorTracked (current d)
760 let readV0 = readBehaviorTracked . current =<< readBehaviorTracked (current d)
762 eOuter = push (fmap (Just . Identity) . readBehaviorUntracked . current . runIdentity) $ updated d
761 eOuter = push (fmap (Just . Identity) . readBehaviorUntracked . current . runIdentity) $ updated d
763− eInner = switch $ fmap updated $ current d
762+ eInner = switch $ updated <$> current d
764− eBoth = coincidence $ fmap (updated . runIdentity) $ updated d
763+ eBoth = coincidence $ updated . runIdentity <$> updated d
765 v' = unSpiderEvent $ R.leftmost $ map SpiderEvent [eBoth, eOuter, eInner]
764 v' = unSpiderEvent $ R.leftmost $ map SpiderEvent [eBoth, eOuter, eInner]
766 in unsafeDyn readV0 v'
765 in unsafeDyn readV0 v'
@@ -785,7 +784,7 @@ instance Functor Event where
785 fmap f = push $ return . Just . f
784 fmap f = push $ return . Just . f
787instance Functor Behavior where
786instance Functor Behavior where
788− fmap f = pull . liftM f . readBehaviorTracked
787+ fmap f = pull . fmap f . readBehaviorTracked
790{-# NOINLINE push #-} --TODO: If this is helpful, we can get rid of the unsafeNewIORef and use unsafePerformIO directly
789{-# NOINLINE push #-} --TODO: If this is helpful, we can get rid of the unsafeNewIORef and use unsafePerformIO directly
791push :: forall a b. (a -> ComputeM (Maybe b)) -> Event a -> Event b
790push :: forall a b. (a -> ComputeM (Maybe b)) -> Event a -> Event b
@@ -859,7 +858,7 @@ run roots after = do
859 m <- liftIO $ readIORef $ mergeSubscribedAccum subscribed
858 m <- liftIO $ readIORef $ mergeSubscribedAccum subscribed
860 liftIO $ writeIORef (mergeSubscribedAccum subscribed) $! DMap.empty
859 liftIO $ writeIORef (mergeSubscribedAccum subscribed) $! DMap.empty
861 --TODO: Assert that m is not empty
860 --TODO: Assert that m is not empty
862− liftIO $ writeIORef (mergeSubscribedOccurrence subscribed) $! Just m
861+ liftIO $ writeIORef (mergeSubscribedOccurrence subscribed) $ Just m
863 scheduleClear $ mergeSubscribedOccurrence subscribed
862 scheduleClear $ mergeSubscribedOccurrence subscribed
864 propagateAndUpdateSubscribersRef (mergeSubscribedSubscribers subscribed) m
863 propagateAndUpdateSubscribersRef (mergeSubscribedSubscribers subscribed) m
@@ -1022,7 +1021,7 @@ propagate a subscribers = withIncreasedDepth $ do
1022 SubscriberHoldIdentity h -> {-# SCC "traverseHoldIdentity" #-} propagateSubscriberHold h a
1021 SubscriberHoldIdentity h -> {-# SCC "traverseHoldIdentity" #-} propagateSubscriberHold h a
1023 SubscriberSwitch subscribed -> {-# SCC "traverseSwitch" #-} do
1022 SubscriberSwitch subscribed -> {-# SCC "traverseSwitch" #-} do
1024 tracePropagate $ "SubscriberSwitch" <> showNodeId subscribed
1023 tracePropagate $ "SubscriberSwitch" <> showNodeId subscribed
1025− liftIO $ writeIORef (switchSubscribedOccurrence subscribed) $! Just a
1024+ liftIO $ writeIORef (switchSubscribedOccurrence subscribed) $ Just a
1026 scheduleClear $ switchSubscribedOccurrence subscribed
1025 scheduleClear $ switchSubscribedOccurrence subscribed
1027 propagate a $ switchSubscribedSubscribers subscribed
1026 propagate a $ switchSubscribedSubscribers subscribed
1028 SubscriberCoincidenceOuter subscribed -> {-# SCC "traverseCoincidenceOuter" #-} do
1027 SubscriberCoincidenceOuter subscribed -> {-# SCC "traverseCoincidenceOuter" #-} do
@@ -1032,7 +1031,7 @@ propagate a subscribers = withIncreasedDepth $ do
1032 (occ, innerHeight, innerSubd) <- subscribeCoincidenceInner a outerHeight subscribed
1031 (occ, innerHeight, innerSubd) <- subscribeCoincidenceInner a outerHeight subscribed
1033 tracePropagate $ " isJust occ = " <> show (isJust occ)
1032 tracePropagate $ " isJust occ = " <> show (isJust occ)
1034 tracePropagate $ " innerHeight = " <> show innerHeight
1033 tracePropagate $ " innerHeight = " <> show innerHeight
1035− liftIO $ writeIORef (coincidenceSubscribedInnerParent subscribed) $! Just innerSubd
1034+ liftIO $ writeIORef (coincidenceSubscribedInnerParent subscribed) $ Just innerSubd
1036 scheduleClear $ coincidenceSubscribedInnerParent subscribed
1035 scheduleClear $ coincidenceSubscribedInnerParent subscribed
1037 case occ of
1036 case occ of
1038 Nothing -> do
1037 Nothing -> do
@@ -1050,7 +1049,7 @@ propagate a subscribers = withIncreasedDepth $ do
1050 case occ of
1049 case occ of
1051 Just _ -> return () -- SubscriberCoincidenceOuter must have already propagated this event
1050 Just _ -> return () -- SubscriberCoincidenceOuter must have already propagated this event
1052 Nothing -> do
1051 Nothing -> do
1053− liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) $! Just a
1052+ liftIO $ writeIORef (coincidenceSubscribedOccurrence subscribed) $ Just a
1054 scheduleClear $ coincidenceSubscribedOccurrence subscribed
1053 scheduleClear $ coincidenceSubscribedOccurrence subscribed
1055 propagate a $ coincidenceSubscribedSubscribers subscribed
1054 propagate a $ coincidenceSubscribedSubscribers subscribed
1056 SubscriberHandle -> {-# SCC "traverseHandle" #-} tracePropagate "SubscriberHandle"
1055 SubscriberHandle -> {-# SCC "traverseHandle" #-} tracePropagate "SubscriberHandle"
@@ -1094,13 +1093,13 @@ runBehaviorM :: BehaviorM a -> Maybe (Weak Invalidator, IORef [SomeBehaviorSubsc
1094runBehaviorM a mwi holdInits = runReaderT (unBehaviorM a) (mwi, holdInits)
1093runBehaviorM a mwi holdInits = runReaderT (unBehaviorM a) (mwi, holdInits)
1096askInvalidator :: BehaviorM (Maybe (Weak Invalidator))
1095askInvalidator :: BehaviorM (Maybe (Weak Invalidator))
1097−askInvalidator = liftM (fmap fst . fst) $ BehaviorM ask
1096+askInvalidator = fmap fst . fst <$> BehaviorM ask
1099askParentsRef :: BehaviorM (Maybe (IORef [SomeBehaviorSubscribed]))
1098askParentsRef :: BehaviorM (Maybe (IORef [SomeBehaviorSubscribed]))
1100−askParentsRef = liftM (fmap snd . fst) $ BehaviorM ask
1099+askParentsRef = fmap snd . fst <$> BehaviorM ask
1102askBehaviorHoldInits :: BehaviorM (IORef [SomeHoldInit])
1101askBehaviorHoldInits :: BehaviorM (IORef [SomeHoldInit])
1103−askBehaviorHoldInits = liftM snd $ BehaviorM ask
1102+askBehaviorHoldInits = snd <$> BehaviorM ask
1105readBehaviorTracked :: Behavior a -> BehaviorM a
1104readBehaviorTracked :: Behavior a -> BehaviorM a
1106readBehaviorTracked b = case b of
1105readBehaviorTracked b = case b of
@@ -1129,7 +1128,7 @@ readBehaviorTracked b = case b of
1129 , pullSubscribedOwnInvalidator = i
1128 , pullSubscribedOwnInvalidator = i
1130 , pullSubscribedParents = parents
1129 , pullSubscribedParents = parents
1132− liftIO $ writeIORef (pullValue p) $! Just subscribed
1131+ liftIO $ writeIORef (pullValue p) $ Just subscribed
1133 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
1132 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
1134 return a
1133 return a
1135 BehaviorDyn d -> readHoldTracked =<< getDynHold d
1134 BehaviorDyn d -> readHoldTracked =<< getDynHold d
@@ -1153,13 +1152,13 @@ getDynHold d = do
1153 holdInits <- getDeferralQueue
1152 holdInits <- getDeferralQueue
1154 v0 <- liftIO $ runBehaviorM readV0 Nothing holdInits
1153 v0 <- liftIO $ runBehaviorM readV0 Nothing holdInits
1155 h <- hold v0 v'
1154 h <- hold v0 v'
1156− liftIO $ writeIORef (unDyn d) $! Right h
1155+ liftIO $ writeIORef (unDyn d) $ Right h
1157 return h
1156 return h
1160readEvent :: Event a -> ResultM (Maybe a)
1159readEvent :: Event a -> ResultM (Maybe a)
1161readEvent e = case e of
1160readEvent 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
1163 EventNever -> return Nothing
1162 EventNever -> return Nothing
1164 EventPush p -> do
1163 EventPush p -> do
1165 subscribed <- getPushSubscribed p
1164 subscribed <- getPushSubscribed p
@@ -1266,25 +1265,25 @@ subscribeEventSubscribed :: EventSubscribed a -> Subscriber a -> IO (Maybe (Subs
1266subscribeEventSubscribed es sub = case es of
1265subscribeEventSubscribed es sub = case es of
1267 EventSubscribedRoot r -> do
1266 EventSubscribedRoot r -> do
1268 traceSubscribe $ "subscribeEventSubscribed Root"
1267 traceSubscribe $ "subscribeEventSubscribed Root"
1269− fmap Just $ subscribeRootSubscribed r sub
1268+ Just <$> subscribeRootSubscribed r sub
1270 EventSubscribedNever -> do
1269 EventSubscribedNever -> do
1271 traceSubscribe $ "subscribeEventSubscribed Never"
1270 traceSubscribe $ "subscribeEventSubscribed Never"
1272 return Nothing
1271 return Nothing
1273 EventSubscribedPush subscribed -> do
1272 EventSubscribedPush subscribed -> do
1274 traceSubscribe $ "subscribeEventSubscribed Push"
1273 traceSubscribe $ "subscribeEventSubscribed Push"
1275− fmap Just $ subscribePushSubscribed subscribed sub
1274+ Just <$> subscribePushSubscribed subscribed sub
1276 EventSubscribedFan k subscribed -> do
1275 EventSubscribedFan k subscribed -> do
1277 traceSubscribe $ "subscribeEventSubscribed Fan"
1276 traceSubscribe $ "subscribeEventSubscribed Fan"
1278− fmap Just $ subscribeFanSubscribed k subscribed sub
1277+ Just <$> subscribeFanSubscribed k subscribed sub
1279 EventSubscribedMerge subscribed -> do
1278 EventSubscribedMerge subscribed -> do
1280 traceSubscribe $ "subscribeEventSubscribed Merge"
1279 traceSubscribe $ "subscribeEventSubscribed Merge"
1281− fmap Just $ subscribeMergeSubscribed subscribed sub
1280+ Just <$> subscribeMergeSubscribed subscribed sub
1282 EventSubscribedSwitch subscribed -> do
1281 EventSubscribedSwitch subscribed -> do
1283 traceSubscribe $ "subscribeEventSubscribed Switch"
1282 traceSubscribe $ "subscribeEventSubscribed Switch"
1284− fmap Just $ subscribeSwitchSubscribed subscribed sub
1283+ Just <$> subscribeSwitchSubscribed subscribed sub
1285 EventSubscribedCoincidence subscribed -> do
1284 EventSubscribedCoincidence subscribed -> do
1286 traceSubscribe $ "subscribeEventSubscribed Coincidence"
1285 traceSubscribe $ "subscribeEventSubscribed Coincidence"
1287− fmap Just $ subscribeCoincidenceSubscribed subscribed sub
1286+ Just <$> subscribeCoincidenceSubscribed subscribed sub
1289{-# INLINE eventSubscribedHeightRef #-}
1288{-# INLINE eventSubscribedHeightRef #-}
1290eventSubscribedHeightRef :: EventSubscribed a -> IORef Height
1289eventSubscribedHeightRef :: EventSubscribed a -> IORef Height
@@ -1317,7 +1316,7 @@ eventSubscribedGetParents = \case
1317 EventSubscribedFan _ subscribed -> return [Some.This $ _eventSubscription_subscribed $ fanSubscribedParent subscribed]
1316 EventSubscribedFan _ subscribed -> return [Some.This $ _eventSubscription_subscribed $ fanSubscribedParent subscribed]
1318 EventSubscribedMerge subscribed -> do
1317 EventSubscribedMerge subscribed -> do
1319 ps <- readIORef $ mergeSubscribedParents subscribed
1318 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
1321 EventSubscribedSwitch subscribed -> do
1320 EventSubscribedSwitch subscribed -> do
1322 s <- readIORef $ switchSubscribedCurrentParent subscribed
1321 s <- readIORef $ switchSubscribedCurrentParent subscribed
1323 return [Some.This $ _eventSubscription_subscribed s]
1322 return [Some.This $ _eventSubscription_subscribed s]
@@ -1354,7 +1353,7 @@ getRootSubscribed k r sub = do
1354 let subscribed = RootSubscribed
1353 let subscribed = RootSubscribed
1355 { rootSubscribedKey = k
1354 { rootSubscribedKey = k
1356 , rootSubscribedCachedSubscribed = cached
1355 , rootSubscribedCachedSubscribed = cached
1357− , rootSubscribedOccurrence = liftM (coerce . DMap.lookup k) $ readIORef $ rootOccurrence r
1356+ , rootSubscribedOccurrence = fmap (coerce . DMap.lookup k) $ readIORef $ rootOccurrence r
1358 , rootSubscribedSubscribers = subs
1357 , rootSubscribedSubscribers = subs
1359 , rootSubscribedUninit = uninit
1358 , rootSubscribedUninit = uninit
1360 , rootSubscribedWeakSelf = weakSelf
1359 , rootSubscribedWeakSelf = weakSelf
@@ -1366,6 +1365,7 @@ getRootSubscribed k r sub = do
1366 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
1365 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
1367 return (sln, subscribed)
1366 return (sln, subscribed)
1368+{-# ANN cleanupRootSubscribed "HLint: ignore Redundant bracket" #-}
1369cleanupRootSubscribed :: RootSubscribed a -> IO ()
1369cleanupRootSubscribed :: RootSubscribed a -> IO ()
1370cleanupRootSubscribed self@(RootSubscribed { rootSubscribedKey = k, rootSubscribedCachedSubscribed = cached }) = do
1370cleanupRootSubscribed self@(RootSubscribed { rootSubscribedKey = k, rootSubscribedCachedSubscribed = cached }) = do
1371 rootSubscribedUninit self
1371 rootSubscribedUninit self
@@ -1390,7 +1390,7 @@ getPushSubscribed p sub = do
1390 s <- liftIO $ newSubscriberPush (pushCompute p) subscribedUnsafe
1390 s <- liftIO $ newSubscriberPush (pushCompute p) subscribedUnsafe
1391 subscription@(EventSubscription _ subd) <- subscribe (pushParent p) s
1391 subscription@(EventSubscription _ subd) <- subscribe (pushParent p) s
1392 parentOcc <- liftIO $ readEventSubscribed subd
1392 parentOcc <- liftIO $ readEventSubscribed subd
1393− occ <- runComputeM $ liftM join $ mapM (pushCompute p) parentOcc
1393+ occ <- runComputeM $ join <$> mapM (pushCompute p) parentOcc
1394 occRef <- liftIO $ newIORef occ
1394 occRef <- liftIO $ newIORef occ
1395 when (isJust occ) $ scheduleClear occRef
1395 when (isJust occ) $ scheduleClear occRef
1396 weakSelf <- liftIO $ newIORef $ error "getPushSubscribed: weakSelf not initialized"
1396 weakSelf <- liftIO $ newIORef $ error "getPushSubscribed: weakSelf not initialized"
@@ -1410,13 +1410,13 @@ getPushSubscribed p sub = do
1411 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "PushSubscribed"
1411 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "PushSubscribed"
1412 liftIO $ writeIORef subscribedRef $! subscribed
1412 liftIO $ writeIORef subscribedRef $! subscribed
1413− liftIO $ writeIORef (pushSubscribed p) $! Just subscribed
1413+ liftIO $ writeIORef (pushSubscribed p) $ Just subscribed
1414 return (sln, subscribed)
1414 return (sln, subscribed)
1416cleanupPushSubscribed :: PushSubscribed a b -> IO ()
1416cleanupPushSubscribed :: PushSubscribed a b -> IO ()
1417cleanupPushSubscribed self = do
1417cleanupPushSubscribed self = do
1418 unsubscribe $ pushSubscribedParent self
1418 unsubscribe $ pushSubscribedParent self
1419− writeIORef (pushSubscribedCachedSubscribed self) $! Nothing
1419+ writeIORef (pushSubscribedCachedSubscribed self) $ Nothing
1421{-# INLINE subscribePushSubscribed #-}
1421{-# INLINE subscribePushSubscribed #-}
1422subscribePushSubscribed :: PushSubscribed a b -> Subscriber b -> IO (SubscriberListTicket b)
1422subscribePushSubscribed :: PushSubscribed a b -> Subscriber b -> IO (SubscriberListTicket b)
@@ -1439,18 +1439,18 @@ getMergeSubscribed m sub = do
1439 subscription@(EventSubscription _ parentSubd) <- subscribe e s
1439 subscription@(EventSubscription _ parentSubd) <- subscribe e s
1440 parentOcc <- liftIO $ readEventSubscribed parentSubd
1440 parentOcc <- liftIO $ readEventSubscribed parentSubd
1441 height <- liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
1441 height <- liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
1442− return $ (fmap (\x -> k :=> Identity x) parentOcc, height, k :=> (MergeSubscribedParent subscription s))
1442+ return $ (fmap (\x -> k :=> Identity x) parentOcc, height, k :=> MergeSubscribedParent subscription s)
1443− let dm = DMap.fromDistinctAscList $ catMaybes $ map (\(x, _, _) -> x) subscribers
1443+ let dm = DMap.fromDistinctAscList $ mapMaybe (\(x, _, _) -> x) subscribers
1444 heights = fmap (\(_, h, _) -> h) subscribers --TODO: Assert that there's no invalidHeight in here
1444 heights = fmap (\(_, h, _) -> h) subscribers --TODO: Assert that there's no invalidHeight in here
1445 myHeightBag = heightBagFromList $ filter (/= invalidHeight) heights
1445 myHeightBag = heightBagFromList $ filter (/= invalidHeight) heights
1446− myHeight = if any (== invalidHeight) heights
1446+ myHeight = if invalidHeight `elem` heights
1447 then invalidHeight
1447 then invalidHeight
1448 else succHeight $ heightBagMax myHeightBag
1448 else succHeight $ heightBagMax myHeightBag
1449 currentHeight <- getCurrentHeight
1449 currentHeight <- getCurrentHeight
1450 let (occ, accum) = if currentHeight >= myHeight -- If we should have fired by now
1450 let (occ, accum) = if currentHeight >= myHeight -- If we should have fired by now
1451 then (if DMap.null dm then Nothing else Just dm, DMap.empty)
1451 then (if DMap.null dm then Nothing else Just dm, DMap.empty)
1452 else (Nothing, dm)
1452 else (Nothing, dm)
1453− when (not $ DMap.null accum) $ do
1453+ unless (DMap.null accum) $ do
1454 scheduleMerge myHeight subscribedUnsafe
1454 scheduleMerge myHeight subscribedUnsafe
1455 occRef <- liftIO $ newIORef occ
1455 occRef <- liftIO $ newIORef occ
1456 when (isJust occ) $ scheduleClear occRef
1456 when (isJust occ) $ scheduleClear occRef
@@ -1478,7 +1478,7 @@ getMergeSubscribed m sub = do
1478 defer $ SomeMergeInit subscribed $ updated $ mergeParents m
1478 defer $ SomeMergeInit subscribed $ updated $ mergeParents m
1479 liftIO $ writeIORef subscribedRef $! subscribed
1479 liftIO $ writeIORef subscribedRef $! subscribed
1480 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "MergeSubscribed"
1480 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "MergeSubscribed"
1481− liftIO $ writeIORef (mergeSubscribed m) $! Just subscribed
1481+ liftIO $ writeIORef (mergeSubscribed m) $ Just subscribed
1482 return (sln, subscribed)
1482 return (sln, subscribed)
1484cleanupMergeSubscribed :: MergeSubscribed k -> IO ()
1484cleanupMergeSubscribed :: MergeSubscribed k -> IO ()
@@ -1486,7 +1486,7 @@ cleanupMergeSubscribed subscribed = do
1486 parents <- readIORef $ mergeSubscribedParents subscribed
1486 parents <- readIORef $ mergeSubscribedParents subscribed
1487 forM_ (DMap.toList parents) $ \(_ :=> msp) -> unsubscribe $ mergeSubscribedParentSubscription msp
1487 forM_ (DMap.toList parents) $ \(_ :=> msp) -> unsubscribe $ mergeSubscribedParentSubscription msp
1488 -- Not necessary, because this whole MergeSubscribed is dead: writeIORef (mergeSubscribedParents subscribed) DMap.empty
1488 -- 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
1491{-# INLINE subscribeMergeSubscribed #-}
1491{-# INLINE subscribeMergeSubscribed #-}
1492subscribeMergeSubscribed :: MergeSubscribed k -> Subscriber (DMap k Identity) -> IO (SubscriberListTicket (DMap k Identity))
1492subscribeMergeSubscribed :: MergeSubscribed k -> Subscriber (DMap k Identity) -> IO (SubscriberListTicket (DMap k Identity))
@@ -1520,7 +1520,7 @@ getFanSubscribed k f sub = do
1520 liftIO $ writeIORef subscribersRef $! DMap.singleton k $ FanSubscribedChildren subsForK self weakSelf
1520 liftIO $ writeIORef subscribersRef $! DMap.singleton k $ FanSubscribedChildren subsForK self weakSelf
1521 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug self "FanSubscribed"
1521 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug self "FanSubscribed"
1522 liftIO $ writeIORef subscribedRef $! subscribed
1522 liftIO $ writeIORef subscribedRef $! subscribed
1523− liftIO $ writeIORef (fanSubscribed f) $! Just subscribed
1523+ liftIO $ writeIORef (fanSubscribed f) $ Just subscribed
1524 return (slnForSub, subscribed)
1524 return (slnForSub, subscribed)
1526cleanupFanSubscribed :: GCompare k => (k a, FanSubscribed k) -> IO ()
1526cleanupFanSubscribed :: GCompare k => (k a, FanSubscribed k) -> IO ()
@@ -1531,7 +1531,7 @@ cleanupFanSubscribed (k, subscribed) = do
1532 unsubscribe $ fanSubscribedParent subscribed
1532 unsubscribe $ fanSubscribedParent subscribed
1533 -- Not necessary in this case, because this whole FanSubscribed is dead: writeIORef (fanSubscribedSubscribers subscribed) reducedSubscribers
1533 -- 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
1535 else writeIORef (fanSubscribedSubscribers subscribed) $! reducedSubscribers
1535 else writeIORef (fanSubscribedSubscribers subscribed) $! reducedSubscribers
1537{-# INLINE subscribeFanSubscribed #-}
1537{-# INLINE subscribeFanSubscribed #-}
@@ -1590,14 +1590,14 @@ getSwitchSubscribed s sub = do
1591 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "switchSubscribedWeakSelf"
1591 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "switchSubscribedWeakSelf"
1592 liftIO $ writeIORef subscribedRef $! subscribed
1592 liftIO $ writeIORef subscribedRef $! subscribed
1593− liftIO $ writeIORef (switchSubscribed s) $! Just subscribed
1593+ liftIO $ writeIORef (switchSubscribed s) $ Just subscribed
1594 return (slnForSub, subscribed)
1594 return (slnForSub, subscribed)
1596cleanupSwitchSubscribed :: SwitchSubscribed a -> IO ()
1596cleanupSwitchSubscribed :: SwitchSubscribed a -> IO ()
1597cleanupSwitchSubscribed subscribed = do
1597cleanupSwitchSubscribed subscribed = do
1598 unsubscribe =<< readIORef (switchSubscribedCurrentParent subscribed)
1598 unsubscribe =<< readIORef (switchSubscribedCurrentParent subscribed)
1599 finalize =<< readIORef (switchSubscribedOwnWeakInvalidator subscribed) -- We don't need to get invalidated if we're dead
1599 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
1602{-# INLINE subscribeSwitchSubscribed #-}
1602{-# INLINE subscribeSwitchSubscribed #-}
1603subscribeSwitchSubscribed :: SwitchSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
1603subscribeSwitchSubscribed :: SwitchSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
@@ -1645,13 +1645,13 @@ getCoincidenceSubscribed c sub = do
1646 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "CoincidenceSubscribed"
1646 liftIO $ writeIORef weakSelf =<< evaluate =<< mkWeakPtrWithDebug subscribed "CoincidenceSubscribed"
1647 liftIO $ writeIORef subscribedRef $! subscribed
1647 liftIO $ writeIORef subscribedRef $! subscribed
1648− liftIO $ writeIORef (coincidenceSubscribed c) $! Just subscribed
1648+ liftIO $ writeIORef (coincidenceSubscribed c) $ Just subscribed
1649 return (slnForSub, subscribed)
1649 return (slnForSub, subscribed)
1651cleanupCoincidenceSubscribed :: CoincidenceSubscribed a -> IO ()
1651cleanupCoincidenceSubscribed :: CoincidenceSubscribed a -> IO ()
1652cleanupCoincidenceSubscribed subscribed = do
1652cleanupCoincidenceSubscribed subscribed = do
1653 unsubscribe $ coincidenceSubscribedOuterParent subscribed
1653 unsubscribe $ coincidenceSubscribedOuterParent subscribed
1654− writeIORef (coincidenceSubscribedCachedSubscribed subscribed) $! Nothing
1654+ writeIORef (coincidenceSubscribedCachedSubscribed subscribed) Nothing
1656{-# INLINE subscribeCoincidenceSubscribed #-}
1656{-# INLINE subscribeCoincidenceSubscribed #-}
1657subscribeCoincidenceSubscribed :: CoincidenceSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
1657subscribeCoincidenceSubscribed :: CoincidenceSubscribed a -> Subscriber a -> IO (SubscriberListTicket a)
@@ -1674,33 +1674,27 @@ fan e =
1675 in EventSelector $ \k -> EventFan k f
1675 in EventSelector $ \k -> EventFan k f
1677−{- SPECIALIZE runHoldInits :: IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> EventM x () #-}
1678−--runHoldInits :: (CanSubscribe x m, Defer SomeMergeUpdate m) => IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> m ()
1679runHoldInits :: IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> EventM x ()
1677runHoldInits :: IORef [SomeHoldInit] -> IORef [SomeMergeInit] -> EventM x ()
1680runHoldInits holdInitRef mergeInitRef = do
1678runHoldInits holdInitRef mergeInitRef = do
1681 holdInits <- liftIO $ readIORef holdInitRef
1679 holdInits <- liftIO $ readIORef holdInitRef
1682 mergeInits <- liftIO $ readIORef mergeInitRef
1680 mergeInits <- liftIO $ readIORef mergeInitRef
1683− if null holdInits && null mergeInits then return () else do
1681+ unless (null holdInits && null mergeInits) $ do
1684− liftIO $ writeIORef holdInitRef $! []
1682+ liftIO $ writeIORef holdInitRef []
1685− liftIO $ writeIORef mergeInitRef $! []
1683+ liftIO $ writeIORef mergeInitRef []
1686 mapM_ initHold holdInits
1684 mapM_ initHold holdInits
1687 mapM_ initMerge mergeInits
1685 mapM_ initMerge mergeInits
1688 runHoldInits holdInitRef mergeInitRef
1686 runHoldInits holdInitRef mergeInitRef
1690−{- SPECIALIZE initHold :: SomeHoldInit -> EventM x () #-}
1691−--initHold :: CanSubscribe x m => SomeHoldInit -> m ()
1692initHold :: SomeHoldInit -> EventM x ()
1688initHold :: SomeHoldInit -> EventM x ()
1693initHold (SomeHoldInit h) = void $ getHoldEventSubscription h
1689initHold (SomeHoldInit h) = void $ getHoldEventSubscription h
1695−{- SPECIALIZE initMerge :: SomeMergeInit -> EventM x () #-}
1696−--initMerge :: (CanSubscribe x m, Defer SomeMergeUpdate m) => SomeMergeInit -> m ()
1697initMerge :: SomeMergeInit -> EventM x ()
1691initMerge :: SomeMergeInit -> EventM x ()
1698initMerge (SomeMergeInit subscribed changed) = do
1692initMerge (SomeMergeInit subscribed changed) = do
1699 changeSub <- liftIO $ newSubscriberMergeChange subscribed
1693 changeSub <- liftIO $ newSubscriberMergeChange subscribed
1700 EventSubscription _ changeSubd <- subscribe changed changeSub
1694 EventSubscription _ changeSubd <- subscribe changed changeSub
1701 change <- liftIO $ readEventSubscribed changeSubd
1695 change <- liftIO $ readEventSubscribed changeSubd
1702 forM_ change $ \c -> defer $ SomeMergeUpdate c subscribed
1696 forM_ change $ \c -> defer $ SomeMergeUpdate c subscribed
1703− liftIO $ writeIORef (mergeSubscribedChange subscribed) $! (changeSub, changeSubd)
1697+ liftIO $ writeIORef (mergeSubscribedChange subscribed) (changeSub, changeSubd)
1705-- | Run an event action outside of a frame
1699-- | Run an event action outside of a frame
1706runFrame :: EventM x a -> SpiderHost x a --TODO: This function also needs to hold the mutex
1700runFrame :: 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
1724 return result
1718 return result
1725 result <- runEventM go env
1719 result <- runEventM go env
1726 toClear <- readIORef toClearRef
1720 toClear <- readIORef toClearRef
1727− forM_ toClear $ \(SomeClear ref) -> {-# SCC "clear" #-} writeIORef ref $! Nothing
1721+ forM_ toClear $ \(SomeClear ref) -> {-# SCC "clear" #-} writeIORef ref Nothing
1728 toClearRoot <- readIORef toClearRootRef
1722 toClearRoot <- readIORef toClearRootRef
1729 forM_ toClearRoot $ \(SomeRootClear ref) -> {-# SCC "rootClear" #-} writeIORef ref $! DMap.empty
1723 forM_ toClearRoot $ \(SomeRootClear ref) -> {-# SCC "rootClear" #-} writeIORef ref $! DMap.empty
1730 toAssign <- readIORef toAssignRef
1724 toAssign <- readIORef toAssignRef
@@ -1735,7 +1729,7 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
1735 when debugInvalidate $ putStrLn $ "Invalidating Hold"
1729 when debugInvalidate $ putStrLn $ "Invalidating Hold"
1736 writeIORef iRef =<< evaluate =<< invalidate toReconnectRef =<< readIORef iRef
1730 writeIORef iRef =<< evaluate =<< invalidate toReconnectRef =<< readIORef iRef
1737 mergeUpdates <- readIORef mergeUpdateRef
1731 mergeUpdates <- readIORef mergeUpdateRef
1738− writeIORef mergeUpdateRef $! []
1732+ writeIORef mergeUpdateRef []
1739 let updateMerge :: SomeMergeUpdate -> IO [SomeEventSubscription]
1733 let updateMerge :: SomeMergeUpdate -> IO [SomeEventSubscription]
1740 updateMerge (SomeMergeUpdate (R.PatchDMap p :: R.PatchDMap (DMap k Event)) m) = do
1734 updateMerge (SomeMergeUpdate (R.PatchDMap p :: R.PatchDMap (DMap k Event)) m) = do
1741 oldParents <- readIORef $ mergeSubscribedParents m
1735 oldParents <- readIORef $ mergeSubscribedParents m
@@ -1768,15 +1762,15 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
1768 i <- evaluate $ switchSubscribedOwnInvalidator subscribed
1762 i <- evaluate $ switchSubscribedOwnInvalidator subscribed
1769 wi' <- mkWeakPtrWithDebug i "wi'"
1763 wi' <- mkWeakPtrWithDebug i "wi'"
1770 writeIORef (switchSubscribedOwnWeakInvalidator subscribed) $! wi'
1764 writeIORef (switchSubscribedOwnWeakInvalidator subscribed) $! wi'
1771− writeIORef (switchSubscribedBehaviorParents subscribed) $! []
1765+ writeIORef (switchSubscribedBehaviorParents subscribed) []
1772− writeIORef holdInitRef $! [] --TODO: Should we reuse this?
1766+ writeIORef holdInitRef [] --TODO: Should we reuse this?
1773 e <- runBehaviorM (readBehaviorTracked (switchSubscribedParent subscribed)) (Just (wi', switchSubscribedBehaviorParents subscribed)) holdInitRef
1767 e <- runBehaviorM (readBehaviorTracked (switchSubscribedParent subscribed)) (Just (wi', switchSubscribedBehaviorParents subscribed)) holdInitRef
1774 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
1768 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
1775 --TODO: Make sure we touch the pieces of the SwitchSubscribed at the appropriate times
1769 --TODO: Make sure we touch the pieces of the SwitchSubscribed at the appropriate times
1776 sub <- newSubscriberSwitch subscribed
1770 sub <- newSubscriberSwitch subscribed
1777 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
1771 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
1779− stackTrace <- liftIO $ liftM renderStack $ ccsToStrings =<< (getCCSOf $! switchSubscribedParent subscribed)
1773+ stackTrace <- liftIO $ fmap renderStack $ ccsToStrings =<< (getCCSOf $! switchSubscribedParent subscribed)
1780 liftIO $ putStrLn $ (++stackTrace) $ "subd' subscribed to " ++ case e of
1774 liftIO $ putStrLn $ (++stackTrace) $ "subd' subscribed to " ++ case e of
1781 EventRoot _ -> "EventRoot"
1775 EventRoot _ -> "EventRoot"
1782 EventNever -> "EventNever"
1776 EventNever -> "EventNever"
@@ -1987,7 +1981,7 @@ invalidate toReconnectRef wis = do
1987 traceInvalidate $ "invalidate: Pull" <> showNodeId p
1981 traceInvalidate $ "invalidate: Pull" <> showNodeId p
1988 mVal <- readIORef $ pullValue p
1982 mVal <- readIORef $ pullValue p
1989 forM_ mVal $ \val -> do
1983 forM_ mVal $ \val -> do
1990− writeIORef (pullValue p) $! Nothing
1984+ writeIORef (pullValue p) Nothing
1991 writeIORef (pullSubscribedInvalidators val) =<< evaluate =<< invalidate toReconnectRef =<< readIORef (pullSubscribedInvalidators val)
1985 writeIORef (pullSubscribedInvalidators val) =<< evaluate =<< invalidate toReconnectRef =<< readIORef (pullSubscribedInvalidators val)
1992 InvalidatorSwitch subscribed -> do
1986 InvalidatorSwitch subscribed -> do
1993 traceInvalidate $ "invalidate: Switch" <> showNodeId subscribed
1987 traceInvalidate $ "invalidate: Switch" <> showNodeId subscribed
@@ -2085,7 +2079,7 @@ instance R.Reflex (SpiderEnv x) where
2085 {-# INLINABLE incrementalToDynamic #-}
2079 {-# INLINABLE incrementalToDynamic #-}
2086 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ DynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ current i) $ flip push (updated i) $ \p -> do
2080 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ DynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ current i) $ flip push (updated i) $ \p -> do
2087 c <- readBehaviorUntracked $ current i
2081 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'
2090instance R.MonadSample (SpiderEnv x) (EventM x) where
2084instance R.MonadSample (SpiderEnv x) (EventM x) where
2091 {-# INLINABLE sample #-}
2085 {-# INLINABLE sample #-}
@@ -2100,13 +2094,13 @@ instance R.MonadHold (SpiderEnv x) (EventM x) where
2100 holdIncremental = holdIncrementalSpiderEventM
2094 holdIncremental = holdIncrementalSpiderEventM
2102holdSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Behavior (SpiderEnv x) a)
2096holdSpiderEventM :: 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
2105holdDynSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Dynamic (SpiderEnv x) a)
2099holdDynSpiderEventM :: 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
2108holdIncrementalSpiderEventM :: R.Patch p => a -> R.Event (SpiderEnv x) (p a) -> EventM x (R.Incremental (SpiderEnv x) p a)
2102holdIncrementalSpiderEventM :: 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
2111instance R.MonadHold (SpiderEnv x) (SpiderHost x) where
2105instance R.MonadHold (SpiderEnv x) (SpiderHost x) where
2112 {-# INLINABLE hold #-}
2106 {-# INLINABLE hold #-}
@@ -2132,9 +2126,9 @@ instance R.MonadHold (SpiderEnv x) (SpiderPushM x) where
2132 {-# INLINABLE hold #-}
2126 {-# INLINABLE hold #-}
2133 hold v0 e = R.current <$> R.holdDyn v0 e
2127 hold v0 e = R.current <$> R.holdDyn v0 e
2134 {-# INLINABLE holdDyn #-}
2128 {-# 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
2136 {-# INLINABLE holdIncremental #-}
2130 {-# 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
2139data RootTrigger a = forall k. GCompare k => RootTrigger (SubscriberList a, IORef (DMap k Identity), k a)
2133data RootTrigger a = forall k. GCompare k => RootTrigger (SubscriberList a, IORef (DMap k Identity), k a)
2140newtype SpiderEventHandle a = SpiderEventHandle { unSpiderEventHandle :: EventSubscription a }
2134newtype SpiderEventHandle a = SpiderEventHandle { unSpiderEventHandle :: EventSubscription a }
@@ -2152,7 +2146,7 @@ instance R.ReflexHost (SpiderEnv x) where
2153instance R.MonadReadEvent (SpiderEnv x) (ReadPhase x) where
2147instance R.MonadReadEvent (SpiderEnv x) (ReadPhase x) where
2154 {-# INLINABLE readEvent #-}
2148 {-# INLINABLE readEvent #-}
2155− readEvent h = ReadPhase $ liftM (fmap return) $ liftIO $ do
2149+ readEvent h = ReadPhase $ fmap (fmap return) $ liftIO $ do
2156 let EventSubscription sln subscribed = unSpiderEventHandle h
2150 let EventSubscription sln subscribed = unSpiderEventHandle h
2157 result <- readEventSubscribed subscribed
2151 result <- readEventSubscribed subscribed
2158 touch sln
2152 touch sln
@@ -2207,11 +2201,11 @@ addIdentity = unsafeCoerce
2208instance R.MonadHold (SpiderEnv x) (SpiderHostFrame x) where
2202instance R.MonadHold (SpiderEnv x) (SpiderHostFrame x) where
2209 {-# INLINABLE hold #-}
2203 {-# 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
2211 {-# INLINABLE holdDyn #-}
2205 {-# 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
2213 {-# INLINABLE holdIncremental #-}
2207 {-# 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
2216newEventWithTriggerIO :: forall a. (RootTrigger a -> IO (IO ())) -> IO (Event a)
2210newEventWithTriggerIO :: forall a. (RootTrigger a -> IO (IO ())) -> IO (Event a)
2217newEventWithTriggerIO f = do
2211newEventWithTriggerIO f = do
@@ -2230,13 +2224,13 @@ newFanEventWithTriggerIO f = do
2230 return $ EventSelector $ \k -> EventRoot k r
2224 return $ EventSelector $ \k -> EventRoot k r
2232instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHost x) where
2226instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHost x) where
2233− newEventWithTrigger = SpiderHost . lift . liftM SpiderEvent . newEventWithTriggerIO
2227+ newEventWithTrigger = SpiderHost . lift . fmap SpiderEvent . newEventWithTriggerIO
2234 newFanEventWithTrigger f = SpiderHost $ lift $ do
2228 newFanEventWithTrigger f = SpiderHost $ lift $ do
2235 es <- newFanEventWithTriggerIO f
2229 es <- newFanEventWithTriggerIO f
2236 return $ R.EventSelector $ SpiderEvent . select es
2230 return $ R.EventSelector $ SpiderEvent . select es
2238instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHostFrame x) where
2232instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHostFrame x) where
2239− newEventWithTrigger = SpiderHostFrame . EventM . liftIO . liftM SpiderEvent . newEventWithTriggerIO
2233+ newEventWithTrigger = SpiderHostFrame . EventM . liftIO . fmap SpiderEvent . newEventWithTriggerIO
2240 newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do
2234 newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do
2241 es <- newFanEventWithTriggerIO f
2235 es <- newFanEventWithTriggerIO f
2242 return $ R.EventSelector $ SpiderEvent . select es
2236 return $ R.EventSelector $ SpiderEvent . select es