@@ -9,13 +9,13 @@ import System.Mem.Weak
9import Data.Foldable
9import Data.Foldable
10import Data.Traversable
10import Data.Traversable
11import Control.Monad hiding (mapM, mapM_, forM_, forM, sequence)
11import Control.Monad hiding (mapM, mapM_, forM_, forM, sequence)
12+import Control.Monad.Identity
12import Control.Monad.Reader hiding (mapM, mapM_, forM_, forM, sequence)
13import Control.Monad.Reader hiding (mapM, mapM_, forM_, forM, sequence)
13import GHC.Exts
14import GHC.Exts
14import Control.Applicative -- Unconditionally import, because otherwise it breaks on GHC 7.10.1RC2
15import Control.Applicative -- Unconditionally import, because otherwise it breaks on GHC 7.10.1RC2
15import Data.Dependent.Map (DMap, DSum (..))
16import Data.Dependent.Map (DMap, DSum (..))
16import qualified Data.Dependent.Map as DMap
17import qualified Data.Dependent.Map as DMap
17import Data.GADT.Compare
18import Data.GADT.Compare
18−import Data.Functor.Misc
19import Data.Maybe
19import Data.Maybe
20import Data.IntMap (IntMap)
20import Data.IntMap (IntMap)
21import qualified Data.IntMap as IntMap
21import qualified Data.IntMap as IntMap
@@ -139,7 +139,7 @@ scheduleClear r = EventM $ do
139 clears <- asks eventEnvClears
139 clears <- asks eventEnvClears
140 liftIO $ modifyIORef' clears (SomeMaybeIORef r :)
140 liftIO $ modifyIORef' clears (SomeMaybeIORef r :)
142−scheduleRootClear :: IORef (DMap k) -> EventM ()
142+scheduleRootClear :: IORef (DMap k Identity) -> EventM ()
143scheduleRootClear r = EventM $ do
143scheduleRootClear r = EventM $ do
144 clears <- asks eventEnvRootClears
144 clears <- asks eventEnvRootClears
145 liftIO $ modifyIORef' clears (SomeDMapIORef r :)
145 liftIO $ modifyIORef' clears (SomeDMapIORef r :)
@@ -223,8 +223,8 @@ data RootSubscribed a
225data Root (k :: * -> *)
225data Root (k :: * -> *)
226− = Root { rootOccurrence :: !(IORef (DMap k)) -- The currently-firing occurrence of this event
226+ = Root { rootOccurrence :: !(IORef (DMap k Identity)) -- The currently-firing occurrence of this event
227− , rootSubscribed :: !(IORef (DMap (WrapArg RootSubscribed k)))
227+ , rootSubscribed :: !(IORef (DMap k RootSubscribed))
228 , rootInit :: !(forall a. k a -> RootTrigger a -> IO (IO ()))
228 , rootInit :: !(forall a. k a -> RootTrigger a -> IO (IO ()))
@@ -251,12 +251,12 @@ data Push a b
253data MergeSubscribed k
253data MergeSubscribed k
254− = MergeSubscribed { mergeSubscribedOccurrence :: !(IORef (Maybe (DMap k)))
254+ = MergeSubscribed { mergeSubscribedOccurrence :: !(IORef (Maybe (DMap k Identity)))
255− , mergeSubscribedAccum :: !(IORef (DMap k)) -- This will accumulate occurrences until our height is reached, at which point it will be transferred to mergeSubscribedOccurrence
255+ , mergeSubscribedAccum :: !(IORef (DMap k Identity)) -- This will accumulate occurrences until our height is reached, at which point it will be transferred to mergeSubscribedOccurrence
256 , mergeSubscribedHeight :: !(IORef Int)
256 , mergeSubscribedHeight :: !(IORef Int)
257− , mergeSubscribedSubscribers :: !(IORef [WeakSubscriber (DMap k)])
257+ , mergeSubscribedSubscribers :: !(IORef [WeakSubscriber (DMap k Identity)])
258 , mergeSubscribedSelf :: !Any -- Hold all our Subscribers in memory
258 , mergeSubscribedSelf :: !Any -- Hold all our Subscribers in memory
259− , mergeSubscribedParents :: !(DMap (WrapArg EventSubscribed k))
259+ , mergeSubscribedParents :: !(DMap k EventSubscribed)
260#ifdef DEBUG_NODEIDS
260#ifdef DEBUG_NODEIDS
261 , mergeSubscribedNodeId :: Int
261 , mergeSubscribedNodeId :: Int
@@ -264,7 +264,7 @@ data MergeSubscribed k
265--TODO: DMap sucks; we should really write something better (with a functor for the value as well as the key)
265--TODO: DMap sucks; we should really write something better (with a functor for the value as well as the key)
266data Merge k
266data Merge k
267− = Merge { mergeParents :: !(DMap (WrapArg Event k))
267+ = Merge { mergeParents :: !(DMap k Event)
268 , mergeSubscribed :: !(IORef (Maybe (MergeSubscribed k))) --TODO: Can we replace this with an unsafePerformIO thunk?
268 , mergeSubscribed :: !(IORef (Maybe (MergeSubscribed k))) --TODO: Can we replace this with an unsafePerformIO thunk?
@@ -283,16 +283,16 @@ instance GCompare k => GCompare (FanSubscriberKey k) where
283 GGT -> GGT
283 GGT -> GGT
285data FanSubscribed k
285data FanSubscribed k
286− = FanSubscribed { fanSubscribedSubscribers :: !(IORef (DMap (FanSubscriberKey k)))
286+ = FanSubscribed { fanSubscribedSubscribers :: !(IORef (DMap (FanSubscriberKey k) Identity))
287− , fanSubscribedParent :: !(EventSubscribed (DMap k))
287+ , fanSubscribedParent :: !(EventSubscribed (DMap k Identity))
288− , fanSubscribedSelf :: {-# NOUNPACK #-} (Subscriber (DMap k))
288+ , fanSubscribedSelf :: {-# NOUNPACK #-} (Subscriber (DMap k Identity))
289#ifdef DEBUG_NODEIDS
289#ifdef DEBUG_NODEIDS
290 , fanSubscribedNodeId :: Int
290 , fanSubscribedNodeId :: Int
294data Fan k
294data Fan k
295− = Fan { fanParent :: !(Event (DMap k))
295+ = Fan { fanParent :: !(Event (DMap k Identity))
296 , fanSubscribed :: !(IORef (Maybe (FanSubscribed k)))
296 , fanSubscribed :: !(IORef (Maybe (FanSubscribed k)))
@@ -354,7 +354,7 @@ deRefWeakSubscriber ws = case ws of
354data Subscriber a
354data Subscriber a
355 = forall b. SubscriberPush !(a -> EventM (Maybe b)) (PushSubscribed a b)
355 = forall b. SubscriberPush !(a -> EventM (Maybe b)) (PushSubscribed a b)
356 | forall k. GCompare k => SubscriberMerge !(k a) (MergeSubscribed k) --TODO: Can we inline the GCompare?
356 | forall k. GCompare k => SubscriberMerge !(k a) (MergeSubscribed k) --TODO: Can we inline the GCompare?
357− | forall k. (GCompare k, a ~ DMap k) => SubscriberFan (FanSubscribed k)
357+ | forall k. (GCompare k, a ~ DMap k Identity) => SubscriberFan (FanSubscribed k)
358 | SubscriberHold !(Hold a)
358 | SubscriberHold !(Hold a)
359 | SubscriberSwitch (SwitchSubscribed a)
359 | SubscriberSwitch (SwitchSubscribed a)
360 | forall b. a ~ Event b => SubscriberCoincidenceOuter (CoincidenceSubscribed b)
360 | forall b. a ~ Event b => SubscriberCoincidenceOuter (CoincidenceSubscribed b)
@@ -374,7 +374,7 @@ data Event a
374 = forall k. GCompare k => EventRoot !(k a) !(Root k)
374 = forall k. GCompare k => EventRoot !(k a) !(Root k)
375 | EventNever
375 | EventNever
376 | forall b. EventPush !(Push b a)
376 | forall b. EventPush !(Push b a)
377− | forall k. (GCompare k, a ~ DMap k) => EventMerge !(Merge k)
377+ | forall k. (GCompare k, a ~ DMap k Identity) => EventMerge !(Merge k)
378 | forall k. GCompare k => EventFan !(k a) !(Fan k)
378 | forall k. GCompare k => EventFan !(k a) !(Fan k)
379 | EventSwitch !(Switch a)
379 | EventSwitch !(Switch a)
380 | EventCoincidence !(Coincidence a)
380 | EventCoincidence !(Coincidence a)
@@ -393,7 +393,7 @@ data EventSubscribed a
393 = EventSubscribedRoot {-# NOUNPACK #-} (RootSubscribed a)
393 = EventSubscribedRoot {-# NOUNPACK #-} (RootSubscribed a)
394 | EventSubscribedNever
394 | EventSubscribedNever
395 | forall b. EventSubscribedPush !(PushSubscribed b a)
395 | forall b. EventSubscribedPush !(PushSubscribed b a)
396− | forall k. (GCompare k, a ~ DMap k) => EventSubscribedMerge !(MergeSubscribed k)
396+ | forall k. (GCompare k, a ~ DMap k Identity) => EventSubscribedMerge !(MergeSubscribed k)
397 | forall k. GCompare k => EventSubscribedFan !(k a) !(FanSubscribed k)
397 | forall k. GCompare k => EventSubscribedFan !(k a) !(FanSubscribed k)
398 | EventSubscribedSwitch !(SwitchSubscribed a)
398 | EventSubscribedSwitch !(SwitchSubscribed a)
399 | EventSubscribedCoincidence !(CoincidenceSubscribed a)
399 | EventSubscribedCoincidence !(CoincidenceSubscribed a)
@@ -424,7 +424,7 @@ newSubscriberHold :: Hold a -> IO (Subscriber a)
424newSubscriberHold h = return $! SubscriberHold h
424newSubscriberHold h = return $! SubscriberHold h
426{-# NOINLINE newSubscriberFan #-}
426{-# NOINLINE newSubscriberFan #-}
427−newSubscriberFan :: GCompare k => FanSubscribed k -> IO (Subscriber (DMap k))
427+newSubscriberFan :: GCompare k => FanSubscribed k -> IO (Subscriber (DMap k Identity))
428newSubscriberFan subd = return $! SubscriberFan subd
428newSubscriberFan subd = return $! SubscriberFan subd
430{-# NOINLINE newSubscriberSwitch #-}
430{-# NOINLINE newSubscriberSwitch #-}
@@ -519,7 +519,7 @@ propagateAndUpdateSubscribersRef subscribersRef a = do
519 liftIO $ modifyIORef' subscribersRef (++stillAlive)
519 liftIO $ modifyIORef' subscribersRef (++stillAlive)
521-- Propagate the given event occurrence; before cleaning up, run the given action, which may read the state of events and behaviors
521-- Propagate the given event occurrence; before cleaning up, run the given action, which may read the state of events and behaviors
522−run :: [DSum RootTrigger] -> ResultM b -> IO b
522+run :: [DSum RootTrigger Identity] -> ResultM b -> IO b
523run roots after = do
523run roots after = do
524 when debugPropagate $ putStrLn "Running an event frame"
524 when debugPropagate $ putStrLn "Running an event frame"
525 result <- runFrame $ do
525 result <- runFrame $ do
@@ -532,7 +532,7 @@ run roots after = do
532 then do scheduleRootClear occRef
532 then do scheduleRootClear occRef
533 return $ Just r
533 return $ Just r
534 else return Nothing
534 else return Nothing
535− forM_ (catMaybes rootsToPropagate) $ \(RootTrigger (subscribersRef, _, _) :=> a) -> do
535+ forM_ (catMaybes rootsToPropagate) $ \(RootTrigger (subscribersRef, _, _) :=> Identity a) -> do
536 propagateAndUpdateSubscribersRef subscribersRef a
536 propagateAndUpdateSubscribersRef subscribersRef a
537 delayedRef <- EventM $ asks eventEnvDelayedMerges
537 delayedRef <- EventM $ asks eventEnvDelayedMerges
538 let go = do
538 let go = do
@@ -565,7 +565,7 @@ run roots after = do
566data SomeMaybeIORef = forall a. SomeMaybeIORef (IORef (Maybe a))
566data SomeMaybeIORef = forall a. SomeMaybeIORef (IORef (Maybe a))
568−data SomeDMapIORef = forall k. SomeDMapIORef (IORef (DMap k))
568+data SomeDMapIORef = forall k. SomeDMapIORef (IORef (DMap k Identity))
570data SomeAssignment = forall a. SomeAssignment (Hold a) a
570data SomeAssignment = forall a. SomeAssignment (Hold a) a
@@ -611,7 +611,7 @@ propagate a subscribers = do
611 SubscriberMerge k subscribed -> do
611 SubscriberMerge k subscribed -> do
612 when debugPropagate $ liftIO $ putStrLn $ "SubscriberMerge" <> showNodeId subscribed
612 when debugPropagate $ liftIO $ putStrLn $ "SubscriberMerge" <> showNodeId subscribed
613 oldM <- liftIO $ readIORef $ mergeSubscribedAccum subscribed
613 oldM <- liftIO $ readIORef $ mergeSubscribedAccum subscribed
614− liftIO $ writeIORef (mergeSubscribedAccum subscribed) $ DMap.insertWith (error "Same key fired multiple times for") k a oldM
614+ liftIO $ writeIORef (mergeSubscribedAccum subscribed) $ DMap.insertWith (error "Same key fired multiple times for") k (Identity a) oldM
615 when (DMap.null oldM) $ do -- Only schedule the firing once
615 when (DMap.null oldM) $ do -- Only schedule the firing once
616 height <- liftIO $ readIORef $ mergeSubscribedHeight subscribed
616 height <- liftIO $ readIORef $ mergeSubscribedHeight subscribed
617 --TODO: assertions about height
617 --TODO: assertions about height
@@ -622,17 +622,19 @@ propagate a subscribers = do
622 subs <- liftIO $ readIORef $ fanSubscribedSubscribers subscribed
622 subs <- liftIO $ readIORef $ fanSubscribedSubscribers subscribed
623 when debugPropagate $ liftIO $ putStrLn $ "SubscriberFan" <> showNodeId subscribed <> ": " ++ show (DMap.size subs) ++ " keys subscribed, " ++ show (DMap.size a) ++ " keys firing"
623 when debugPropagate $ liftIO $ putStrLn $ "SubscriberFan" <> showNodeId subscribed <> ": " ++ show (DMap.size subs) ++ " keys subscribed, " ++ show (DMap.size a) ++ " keys firing"
624 --TODO: We need a better DMap intersection; here, we are assuming that the number of firing keys is small and the number of subscribers is large
624 --TODO: We need a better DMap intersection; here, we are assuming that the number of firing keys is small and the number of subscribers is large
625− forM_ (DMap.toList a) $ \(k :=> v) -> case DMap.lookup (FanSubscriberKey k) subs of
625+ forM_ (DMap.toList a) $ \(k :=> Identity v) -> case DMap.lookup (FanSubscriberKey k) subs of
626 Nothing -> do
626 Nothing -> do
627 when debugPropagate $ liftIO $ putStrLn "No subscriber for key"
627 when debugPropagate $ liftIO $ putStrLn "No subscriber for key"
628 return ()
628 return ()
629− Just subsubs -> do
629+ Just (Identity subsubs) -> do
630 _ <- propagate v subsubs --TODO: use the value of this
630 _ <- propagate v subsubs --TODO: use the value of this
631 return ()
631 return ()
632 --TODO: The following is way too slow to do all the time
632 --TODO: The following is way too slow to do all the time
633− subs' <- liftIO $ forM (DMap.toList subs) $ ((\(FanSubscriberKey k :=> subsubs) -> do
633+ subs' <- liftIO $ forM (DMap.toList subs) $ ((\(FanSubscriberKey k :=> Identity subsubs) -> do
634 subsubs' <- traverseAndCleanWeakList_ (liftIO . deRefWeakSubscriber) subsubs (const $ return ())
634 subsubs' <- traverseAndCleanWeakList_ (liftIO . deRefWeakSubscriber) subsubs (const $ return ())
635+ return $ if null subsubs'
635− return $ if null subsubs' then Nothing else Just $ FanSubscriberKey k :=> subsubs') :: DSum (FanSubscriberKey k) -> IO (Maybe (DSum (FanSubscriberKey k))))
637+ else Just $ FanSubscriberKey k :=> Identity subsubs') :: DSum (FanSubscriberKey k) Identity -> IO (Maybe (DSum (FanSubscriberKey k) Identity)))
636 liftIO $ writeIORef (fanSubscribedSubscribers subscribed) $ DMap.fromDistinctAscList $ catMaybes subs'
638 liftIO $ writeIORef (fanSubscribedSubscribers subscribed) $ DMap.fromDistinctAscList $ catMaybes subs'
637 SubscriberHold h -> do
639 SubscriberHold h -> do
638 invalidators <- liftIO $ readIORef $ holdInvalidators h
640 invalidators <- liftIO $ readIORef $ holdInvalidators h
@@ -731,7 +733,7 @@ readBehaviorTracked b = case b of
732readEvent :: Event a -> ResultM (Maybe a)
734readEvent :: Event a -> ResultM (Maybe a)
733readEvent e = case e of
735readEvent e = case e of
734− EventRoot k r -> liftIO $ liftM (DMap.lookup k) $ readIORef $ rootOccurrence r
736+ EventRoot k r -> liftIO . liftM (fmap runIdentity . DMap.lookup k) . readIORef $ rootOccurrence r
735 EventNever -> return Nothing
737 EventNever -> return Nothing
736 EventPush p -> do
738 EventPush p -> do
737 subscribed <- getPushSubscribed p
739 subscribed <- getPushSubscribed p
@@ -747,7 +749,7 @@ readEvent e = case e of
747 return result
749 return result
748 EventFan k f -> do
750 EventFan k f -> do
749 parentOcc <- readEvent $ fanParent f
751 parentOcc <- readEvent $ fanParent f
750− return $ DMap.lookup k =<< parentOcc
752+ return . fmap runIdentity $ DMap.lookup k =<< parentOcc
751 EventSwitch s -> do
753 EventSwitch s -> do
752 subscribed <- getSwitchSubscribed s
754 subscribed <- getSwitchSubscribed s
753 liftIO $ do
755 liftIO $ do
@@ -794,7 +796,7 @@ subscribeEventSubscribed es ws = case es of
794 modifyIORef' (pushSubscribedSubscribers subscribed) (ws:)
796 modifyIORef' (pushSubscribedSubscribers subscribed) (ws:)
795 EventSubscribedFan k subscribed -> do
797 EventSubscribedFan k subscribed -> do
796 when debugSubscribe $ liftIO $ putStrLn $ "subscribeEventSubscribed Fan"
798 when debugSubscribe $ liftIO $ putStrLn $ "subscribeEventSubscribed Fan"
797− modifyIORef' (fanSubscribedSubscribers subscribed) $ DMap.insertWith (++) (FanSubscriberKey k) [ws]
799+ modifyIORef' (fanSubscribedSubscribers subscribed) $ DMap.insertWith (liftA2 (++)) (FanSubscriberKey k) (Identity [ws])
798 EventSubscribedMerge subscribed -> do
800 EventSubscribedMerge subscribed -> do
799 when debugSubscribe $ liftIO $ putStrLn $ "subscribeEventSubscribed Merge"
801 when debugSubscribe $ liftIO $ putStrLn $ "subscribeEventSubscribed Merge"
800 modifyIORef' (mergeSubscribedSubscribers subscribed) (ws:)
802 modifyIORef' (mergeSubscribedSubscribers subscribed) (ws:)
@@ -812,7 +814,7 @@ getEventSubscribedOcc es = case es of
812 EventSubscribedPush subscribed -> readIORef $ pushSubscribedOccurrence subscribed
814 EventSubscribedPush subscribed -> readIORef $ pushSubscribedOccurrence subscribed
813 EventSubscribedFan k subscribed -> do
815 EventSubscribedFan k subscribed -> do
814 parentOcc <- getEventSubscribedOcc $ fanSubscribedParent subscribed
816 parentOcc <- getEventSubscribedOcc $ fanSubscribedParent subscribed
815− let occ = DMap.lookup k =<< parentOcc
817+ let occ = fmap runIdentity $ DMap.lookup k =<< parentOcc
816 return occ
818 return occ
817 EventSubscribedMerge subscribed -> readIORef $ mergeSubscribedOccurrence subscribed
819 EventSubscribedMerge subscribed -> readIORef $ mergeSubscribedOccurrence subscribed
818 EventSubscribedSwitch subscribed -> readIORef $ switchSubscribedOccurrence subscribed
820 EventSubscribedSwitch subscribed -> readIORef $ switchSubscribedOccurrence subscribed
@@ -841,18 +843,18 @@ noinlineFalse = False
841getRootSubscribed :: GCompare k => k a -> Root k -> EventM (RootSubscribed a)
843getRootSubscribed :: GCompare k => k a -> Root k -> EventM (RootSubscribed a)
842getRootSubscribed k r = do
844getRootSubscribed k r = do
843 mSubscribed <- liftIO $ readIORef $ rootSubscribed r
845 mSubscribed <- liftIO $ readIORef $ rootSubscribed r
844− case DMap.lookup (WrapArg k) mSubscribed of
846+ case DMap.lookup k mSubscribed of
845 Just subscribed -> return subscribed
847 Just subscribed -> return subscribed
846 Nothing -> liftIO $ do
848 Nothing -> liftIO $ do
847 subscribersRef <- newIORef []
849 subscribersRef <- newIORef []
848− subscribed <- newRootSubscribed (liftM (DMap.lookup k) $ readIORef $ rootOccurrence r) subscribersRef
850+ subscribed <- newRootSubscribed (liftM (fmap runIdentity . DMap.lookup k) $ readIORef $ rootOccurrence r) subscribersRef
849 -- Strangely, init needs the same stuff as a RootSubscribed has, but it must not be the same as the one that everyone's subscribing to, or it'll leak memory
851 -- Strangely, init needs the same stuff as a RootSubscribed has, but it must not be the same as the one that everyone's subscribing to, or it'll leak memory
850 uninit <- rootInit r k $ RootTrigger (subscribersRef, rootOccurrence r, k)
852 uninit <- rootInit r k $ RootTrigger (subscribersRef, rootOccurrence r, k)
851 addFinalizer subscribed $ do
853 addFinalizer subscribed $ do
852 when noinlineFalse $ putStr "" -- For some reason, without this line, the finalizer will run earlier than it should
854 when noinlineFalse $ putStr "" -- For some reason, without this line, the finalizer will run earlier than it should
853-- putStrLn "Uninit root"
855-- putStrLn "Uninit root"
855− liftIO $ modifyIORef' (rootSubscribed r) $ DMap.insert (WrapArg k) subscribed
857+ liftIO $ modifyIORef' (rootSubscribed r) $ DMap.insert k subscribed
856 return subscribed
858 return subscribed
858-- When getPushSubscribed returns, the PushSubscribed returned will have a fully filled-in
860-- When getPushSubscribed returns, the PushSubscribed returned will have a fully filled-in
@@ -894,11 +896,11 @@ getMergeSubscribed m = {-# SCC "getMergeSubscribed.entire" #-} do
894 subscribedUnsafe <- liftIO $ unsafeInterleaveIO $ readIORef subscribedRef
896 subscribedUnsafe <- liftIO $ unsafeInterleaveIO $ readIORef subscribedRef
895 s <- liftIO $ newBox subscribedUnsafe
897 s <- liftIO $ newBox subscribedUnsafe
896 ws <- liftIO $ mkWeakPtrWithDebug s "SubscriberMerge"
898 ws <- liftIO $ mkWeakPtrWithDebug s "SubscriberMerge"
897− subscribers :: [(Any, Maybe (DSum k), Int, DSum (WrapArg EventSubscribed k))] <- forM (DMap.toList $ mergeParents m) $ {-# SCC "getMergeSubscribed.a" #-} \(WrapArg k :=> e) -> {-# SCC "getMergeSubscribed.a1" #-} do
899+ subscribers :: [(Any, Maybe (DSum k Identity), Int, DSum k EventSubscribed)] <- forM (DMap.toList $ mergeParents m) $ {-# SCC "getMergeSubscribed.a" #-} \(k :=> e) -> {-# SCC "getMergeSubscribed.a1" #-} do
898 parentSubd <- {-# SCC "getMergeSubscribed.a.parentSubd" #-} subscribe e $ WeakSubscriberMerge k ws
900 parentSubd <- {-# SCC "getMergeSubscribed.a.parentSubd" #-} subscribe e $ WeakSubscriberMerge k ws
899 parentOcc <- {-# SCC "getMergeSubscribed.a.parentOcc" #-} liftIO $ getEventSubscribedOcc parentSubd
901 parentOcc <- {-# SCC "getMergeSubscribed.a.parentOcc" #-} liftIO $ getEventSubscribedOcc parentSubd
900 height <- {-# SCC "getMergeSubscribed.a.height" #-} liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
902 height <- {-# SCC "getMergeSubscribed.a.height" #-} liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
901− return $ {-# SCC "getMergeSubscribed.a.returnVal" #-} (unsafeCoerce s :: Any, fmap (k :=>) parentOcc, height, WrapArg k :=> parentSubd)
903+ return $ {-# SCC "getMergeSubscribed.a.returnVal" #-} (unsafeCoerce s :: Any, fmap ((k :=>) . Identity) parentOcc, height, k :=> parentSubd)
902 let dm = DMap.fromDistinctAscList $ catMaybes $ map (\(_, x, _, _) -> x) subscribers
904 let dm = DMap.fromDistinctAscList $ catMaybes $ map (\(_, x, _, _) -> x) subscribers
903 subscriberHeights = map (\(_, _, x, _) -> x) subscribers
905 subscriberHeights = map (\(_, _, x, _) -> x) subscribers
904 myHeight =
906 myHeight =
@@ -1048,7 +1050,7 @@ getCoincidenceSubscribed c = do
1048 liftIO $ writeIORef (coincidenceSubscribed c) $ Just subscribed
1050 liftIO $ writeIORef (coincidenceSubscribed c) $ Just subscribed
1049 return subscribed
1051 return subscribed
1051−merge :: GCompare k => DMap (WrapArg Event k) -> Event (DMap k)
1053+merge :: GCompare k => DMap k Event -> Event (DMap k Identity)
1052merge m = EventMerge $ Merge
1054merge m = EventMerge $ Merge
1053 { mergeParents = m
1055 { mergeParents = m
1054 , mergeSubscribed = unsafeNewIORef m Nothing
1056 , mergeSubscribed = unsafeNewIORef m Nothing
@@ -1056,7 +1058,7 @@ merge m = EventMerge $ Merge
1057newtype EventSelector k = EventSelector { select :: forall a. k a -> Event a }
1059newtype EventSelector k = EventSelector { select :: forall a. k a -> Event a }
1059−fan :: GCompare k => Event (DMap k) -> EventSelector k
1061+fan :: GCompare k => Event (DMap k Identity) -> EventSelector k
1061 let f = Fan
1063 let f = Fan
1062 { fanParent = e
1064 { fanParent = e
@@ -1154,7 +1156,7 @@ invalidateSubscriberHeight ws = do
1154 SubscriberFan subscribed -> do
1156 SubscriberFan subscribed -> do
1155 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
1157 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
1156 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1158 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1157− forM_ (DMap.toList subscribers) $ ((\(FanSubscriberKey _ :=> v) -> mapM_ invalidateSubscriberHeight v) :: DSum (FanSubscriberKey k) -> IO ())
1159+ forM_ (DMap.toList subscribers) $ ((\(FanSubscriberKey _ :=> Identity v) -> mapM_ invalidateSubscriberHeight v) :: DSum (FanSubscriberKey k) Identity -> IO ())
1158 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
1160 when debugInvalidateHeight $ putStrLn $ "invalidateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
1159 SubscriberHold _ -> return ()
1161 SubscriberHold _ -> return ()
1160 SubscriberSwitch subscribed -> do
1162 SubscriberSwitch subscribed -> do
@@ -1205,7 +1207,7 @@ recalculateSubscriberHeight ws = do
1205 SubscriberFan subscribed -> do
1207 SubscriberFan subscribed -> do
1206 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
1208 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed
1207 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1209 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1208− forM_ (DMap.toList subscribers) $ ((\(FanSubscriberKey _ :=> v) -> mapM_ recalculateSubscriberHeight v) :: DSum (FanSubscriberKey k) -> IO ())
1210+ forM_ (DMap.toList subscribers) $ ((\(FanSubscriberKey _ :=> Identity v) -> mapM_ recalculateSubscriberHeight v) :: DSum (FanSubscriberKey k) Identity -> IO ())
1209 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
1211 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberFan" <> showNodeId subscribed <> " done"
1210 SubscriberHold _ -> return ()
1212 SubscriberHold _ -> return ()
1211 SubscriberSwitch subscribed -> do
1213 SubscriberSwitch subscribed -> do
@@ -1237,7 +1239,7 @@ recalculateCoincidenceHeight subscribed = do
1238calculateMergeHeight :: MergeSubscribed k -> IO Int
1240calculateMergeHeight :: MergeSubscribed k -> IO Int
1239calculateMergeHeight subscribed = if DMap.null (mergeSubscribedParents subscribed) then return 0 else do
1241calculateMergeHeight subscribed = if DMap.null (mergeSubscribedParents subscribed) then return 0 else do
1240− heights <- forM (DMap.toList $ mergeSubscribedParents subscribed) $ \(WrapArg _ :=> es) -> do
1242+ heights <- forM (DMap.toList $ mergeSubscribedParents subscribed) $ \(_ :=> es) -> do
1241 readIORef $ eventSubscribedHeightRef es
1243 readIORef $ eventSubscribedHeightRef es
1242 return $ if any (== invalidHeight) heights then invalidHeight else succ $ Prelude.maximum heights --TODO: Replace 'any' with invalidHeight-preserving 'maximum'
1244 return $ if any (== invalidHeight) heights then invalidHeight else succ $ Prelude.maximum heights --TODO: Replace 'any' with invalidHeight-preserving 'maximum'
@@ -1316,7 +1318,7 @@ instance R.Reflex Spider where
1316 constant = SpiderBehavior . BehaviorConst
1318 constant = SpiderBehavior . BehaviorConst
1317 push f = SpiderEvent. push f . unSpiderEvent
1319 push f = SpiderEvent. push f . unSpiderEvent
1318 pull = SpiderBehavior . pull
1320 pull = SpiderBehavior . pull
1319− merge = SpiderEvent . merge . (unsafeCoerce :: DMap (WrapArg (R.Event Spider) k) -> DMap (WrapArg Event k))
1321+ merge = SpiderEvent . merge . (unsafeCoerce :: DMap k (R.Event Spider) -> DMap k Event)
1320 fan e = R.EventSelector $ SpiderEvent . select (fan (unSpiderEvent e))
1322 fan e = R.EventSelector $ SpiderEvent . select (fan (unSpiderEvent e))
1321 switch = SpiderEvent . switch . (unsafeCoerce :: Behavior (R.Event Spider a) -> Behavior (Event a)) . unSpiderBehavior
1323 switch = SpiderEvent . switch . (unsafeCoerce :: Behavior (R.Event Spider a) -> Behavior (Event a)) . unSpiderBehavior
1322 coincidence = SpiderEvent . coincidence . (unsafeCoerce :: Event (R.Event Spider a) -> Event (Event a)) . unSpiderEvent
1324 coincidence = SpiderEvent . coincidence . (unsafeCoerce :: Event (R.Event Spider a) -> Event (Event a)) . unSpiderEvent
@@ -1340,7 +1342,7 @@ instance R.MonadHold Spider EventM where
1340 {-# INLINE hold #-}
1342 {-# INLINE hold #-}
1341 hold v0 e = SpiderBehavior <$> hold v0 (unSpiderEvent e)
1343 hold v0 e = SpiderBehavior <$> hold v0 (unSpiderEvent e)
1343−data RootTrigger a = forall k. GCompare k => RootTrigger (IORef [WeakSubscriber a], IORef (DMap k), k a)
1345+data RootTrigger a = forall k. GCompare k => RootTrigger (IORef [WeakSubscriber a], IORef (DMap k Identity), k a)
1344newtype SpiderEventHandle a = SpiderEventHandle { unEventHandle :: Event a }
1346newtype SpiderEventHandle a = SpiderEventHandle { unEventHandle :: Event a }
1346instance R.MonadSubscribeEvent Spider SpiderHostFrame where
1348instance R.MonadSubscribeEvent Spider SpiderHostFrame where