@@ -129,7 +129,7 @@ class HasNodeId a where
129129
130130instance HasNodeId (CacheSubscribed x a) where
131131 getNodeId = _cacheSubscribed_nodeId
132−
132+
133133instance HasNodeId (FanInt x a) where
134134 getNodeId = _fanInt_nodeId
135135
@@ -156,7 +156,7 @@ showNodeId :: HasNodeId a => a -> String
156156showNodeId = showNodeId' . getNodeId
157157
158158showNodeId' :: Int -> String
159−showNodeId' = ("#"<>) . show
159+showNodeId' = ("#"<>) . show
160160
161161
162162#else
@@ -253,9 +253,9 @@ headE originalE = do
253253 let clearParent = liftIO $ writeIORef parent Nothing
254254 (_, occ) <- subscribeAndReadHead originalE $ terminalSubscriber $ const clearParent
255255 when (isJust occ) clearParent
256− return $ Event $ \sub ->
256+ return $ Event $ \sub ->
257257 liftIO (readIORef parent) >>= \case
258− Nothing -> subscribeAndReadNever
258+ Nothing -> subscribeAndReadNever
259259 Just e -> subscribeAndReadHead e sub
260260
261261data CacheSubscribed x a
@@ -305,8 +305,8 @@ cacheEvent e =
305305 liftIO $ writeIORef occRef (Just a)
306306 scheduleClear occRef
307307 propagateFast a subscribers
308− , subscriberInvalidateHeight = FastWeakBag.traverse subscribers . invalidateSubscriberHeight
309− , subscriberRecalculateHeight = FastWeakBag.traverse subscribers . recalculateSubscriberHeight
308+ , subscriberInvalidateHeight = FastWeakBag.traverse subscribers . invalidateSubscriberHeight
309+ , subscriberRecalculateHeight = FastWeakBag.traverse subscribers . recalculateSubscriberHeight
310310 }
311311||||||| merged common ancestors
312312 (parentSub, occ) <- subscribeAndRead e $ Subscriber
@@ -340,20 +340,20 @@ cacheEvent e =
340340 , _cacheSubscribed_occurrence = occRef
341341#ifdef DEBUG_NODEIDS
342342 , _cacheSubscribed_nodeId = nodeId
343−#endif
343+#endif
344344 }
345345 subscribedTicket <- liftIO $ mkFastWeakTicket subscribed
346346 liftIO $ writeIORef mSubscribedRef =<< getFastWeakTicketWeak subscribedTicket
347347 return subscribedTicket
348348 liftIO $ cacheSubscription sub mSubscribedRef subscribedTicket
349349
350−cacheSubscription :: Subscriber x a -> IORef (FastWeak (CacheSubscribed x a))
350+cacheSubscription :: Subscriber x a -> IORef (FastWeak (CacheSubscribed x a))
351351 -> FastWeakTicket (CacheSubscribed x a) -> IO (EventSubscription x, Maybe a)
352−cacheSubscription sub mSubscribedRef subscribedTicket = do
352+cacheSubscription sub mSubscribedRef subscribedTicket = do
353353 subscribed <- getFastWeakTicketValue subscribedTicket
354354 ticket <- FastWeakBag.insert sub $ _cacheSubscribed_subscribers subscribed
355355 occ <- readIORef $ _cacheSubscribed_occurrence subscribed
356−
356+
357357 let parentSub = _cacheSubscribed_parent subscribed
358358 es = EventSubscription
359359 { _eventSubscription_unsubscribe = do
@@ -372,9 +372,9 @@ cacheSubscription sub mSubscribedRef subscribedTicket = do
372372 , eventSubscribedGetParents = return [_eventSubscription_subscribed parentSub]
373373 , eventSubscribedHasOwnHeightRef = False
374374 , eventSubscribedWhoCreated = whoCreatedIORef mSubscribedRef
375−#endif
375+#endif
376376 }
377− }
377+ }
378378 return (es, occ)
379379
380380
@@ -495,7 +495,7 @@ newSubscriberCoincidenceOuter subscribed = debugSubscriber ("SubscriberCoinciden
495495 liftIO $ writeIORef (coincidenceSubscribedInnerParent subscribed) $ Just innerSubd
496496 scheduleClear $ coincidenceSubscribedInnerParent subscribed
497497 case occ of
498− Nothing ->
498+ Nothing ->
499499 when (innerHeight > outerHeight) $ liftIO $ do -- If the event fires, it will fire at a later height
500500 writeIORef (coincidenceSubscribedHeight subscribed) $! innerHeight
501501 WeakBag.traverse_ (coincidenceSubscribedSubscribers subscribed) $ invalidateSubscriberHeight outerHeight
@@ -505,7 +505,7 @@ newSubscriberCoincidenceOuter subscribed = debugSubscriber ("SubscriberCoinciden
505505 scheduleClear $ coincidenceSubscribedOccurrence subscribed
506506 propagate o $ coincidenceSubscribedSubscribers subscribed
507507 , subscriberInvalidateHeight = \_ -> invalidateCoincidenceHeight subscribed
508− , subscriberRecalculateHeight = \_ -> recalculateCoincidenceHeight subscribed
508+ , subscriberRecalculateHeight = \_ -> recalculateCoincidenceHeight subscribed
509509 }
510510
511511newSubscriberCoincidenceInner :: forall x a. HasSpiderTimeline x => CoincidenceSubscribed x a -> IO (Subscriber x a)
@@ -526,18 +526,18 @@ invalidateSubscriberHeight :: Height -> Subscriber x a -> IO ()
526526invalidateSubscriberHeight = flip subscriberInvalidateHeight
527527
528528recalculateSubscriberHeight :: Height -> Subscriber x a -> IO ()
529−recalculateSubscriberHeight = flip subscriberRecalculateHeight
529+recalculateSubscriberHeight = flip subscriberRecalculateHeight
530530
531531-- | Propagate everything at the current height
532532propagate :: forall x a. HasSpiderTimeline x => a -> WeakBag (Subscriber x a) -> EventM x ()
533−propagate a subscribers = withIncreasedDepth (Proxy::Proxy x) $
533+propagate a subscribers = withIncreasedDepth (Proxy::Proxy x) $
534534 -- Note: in the following traversal, we do not visit nodes that are added to the list during our traversal; they are new events, which will necessarily have full information already, so there is no need to traverse them
535535 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
536536 WeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
537537
538538-- | Propagate everything at the current height
539539propagateFast :: forall x a. HasSpiderTimeline x => a -> FastWeakBag (Subscriber x a) -> EventM x ()
540−propagateFast a subscribers = withIncreasedDepth (Proxy::Proxy x) $
540+propagateFast a subscribers = withIncreasedDepth (Proxy::Proxy x) $
541541 -- Note: in the following traversal, we do not visit nodes that are added to the list during our traversal; they are new events, which will necessarily have full information already, so there is no need to traverse them
542542 --TODO: Should we check if nodes already have their values before propagating? Maybe we're re-doing work
543543 FastWeakBag.traverse_ subscribers $ \s -> subscriberPropagate s a
@@ -1023,7 +1023,7 @@ data SomeMergeUpdate x = SomeMergeUpdate
10231023newtype SomeMergeInit x = SomeMergeInit { unSomeMergeInit :: EventM x () }
10241024
10251025-- EventM can do everything BehaviorM can, plus create holds
1026−newtype EventM x a = EventM { unEventM :: IO a } deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadException, MonadAsyncException)
1026+newtype EventM x a = EventM { unEventM :: IO a } deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadException, MonadAsyncException)
10271027
10281028newtype MergeSubscribedParent x a = MergeSubscribedParent { unMergeSubscribedParent :: EventSubscription x }
10291029
@@ -1048,7 +1048,7 @@ heightBagFromList :: [Height] -> HeightBag
10481048heightBagFromList heights = heightBagVerify $ foldl' (flip heightBagAdd) heightBagEmpty heights
10491049
10501050heightBagAdd :: Height -> HeightBag -> HeightBag
1051−heightBagAdd (Height h) (HeightBag s c) = heightBagVerify $ HeightBag (succ s) $
1051+heightBagAdd (Height h) (HeightBag s c) = heightBagVerify $ HeightBag (succ s) $
10521052 IntMap.insertWithKey (\_ _ old -> succ old) h 0 c
10531053
10541054heightBagRemove :: Height -> HeightBag -> HeightBag
@@ -1059,11 +1059,11 @@ heightBagRemove (Height h) b@(HeightBag s c) = heightBagVerify $ case IntMap.loo
10591059 _ -> IntMap.insert h (pred old) c
10601060
10611061heightBagRemoveMaybe :: Height -> HeightBag -> Maybe HeightBag
1062−heightBagRemoveMaybe (Height h) b@(HeightBag s c) = heightBagVerify . removed <$> IntMap.lookup h c where
1062+heightBagRemoveMaybe (Height h) b@(HeightBag s c) = heightBagVerify . removed <$> IntMap.lookup h c where
10631063 removed old = HeightBag (pred s) $ case old of
10641064 0 -> IntMap.delete h c
10651065 _ -> IntMap.insert h (pred old) c
1066−
1066+
10671067
10681068heightBagMax :: HeightBag -> Height
10691069heightBagMax (HeightBag _ c) = case IntMap.maxViewWithKey c of
@@ -1328,7 +1328,7 @@ debugSubscriber :: forall x a. HasSpiderTimeline x => String -> Subscriber x a -
13281328debugSubscriber description = return . debugSubscriber' description
13291329
13301330debugSubscriber' :: forall x a. HasSpiderTimeline x => String -> Subscriber x a -> Subscriber x a
1331−debugSubscriber' description subscribed = Subscriber
1331+debugSubscriber' description subscribed = Subscriber
13321332 {
13331333 subscriberPropagate = \m -> do
13341334 tracePropagate (Proxy :: Proxy x) ("subscriberPropagate: " <> description)
@@ -1430,12 +1430,12 @@ filterStack prefix = filter (not . (prefix `isPrefixOf`))
14301430
14311431#ifdef DEBUG_CYCLES
14321432
1433−data EventLoopException = EventLoopException [[String]]
1433+data EventLoopException = EventLoopException [[String]]
14341434instance Exception EventLoopException
14351435
14361436instance Show EventLoopException where
1437− show (EventLoopException stacks) = "causality loop detected:\n" <> if null stacks
1438− then "no location information, compile with profiling enabled for stack tree"
1437+ show (EventLoopException stacks) = "causality loop detected:\n" <> if null stacks
1438+ then "no location information, compile with profiling enabled for stack tree"
14391439 else showStacks stacks
14401440
14411441#else
@@ -1461,7 +1461,7 @@ propagateSubscriberHold h a = do
14611461 case {-# SCC "apply" #-} apply a v of
14621462 Nothing -> return ()
14631463 Just v' -> do
1464− withIncreasedDepth (Proxy :: Proxy x) $
1464+ withIncreasedDepth (Proxy :: Proxy x) $
14651465 tracePropagate (Proxy :: Proxy x) ("propagateSubscriberHold: assigning Hold" <> showNodeId h)
14661466 vRef <- {-# SCC "vRef" #-} liftIO $ evaluate $ holdValue h
14671467 iRef <- {-# SCC "iRef" #-} liftIO $ evaluate $ holdInvalidators h
@@ -1582,7 +1582,7 @@ data FanInt x a = FanInt
15821582 { _fanInt_subscribers :: {-# UNPACK #-} !(FastMutableIntMap (FastWeakBag (Subscriber x a))) --TODO: Clean up the keys in here when their child weak bags get empty --TODO: Remove our own subscription when the subscribers list is completely empty
15831583 , _fanInt_subscriptionRef :: {-# UNPACK #-} !(IORef (EventSubscription x)) -- This should have a valid subscription iff subscribers is non-empty
15841584 , _fanInt_occRef :: {-# UNPACK #-} !(IORef (IntMap a))
1585−#ifdef DEBUG_NODEIDS
1585+#ifdef DEBUG_NODEIDS
15861586 , _fanInt_nodeId :: {-# UNPACK #-} !Int
15871587#endif
15881588 }
@@ -1592,15 +1592,15 @@ newFanInt = do
15921592 subscribers <- FastMutableIntMap.newEmpty --TODO: Clean up the keys in here when their child weak bags get empty --TODO: Remove our own subscription when the subscribers list is completely empty
15931593 subscriptionRef <- newIORef $ error "fanInt: no subscription"
15941594 occRef <- newIORef $ error "fanInt: no occurrence"
1595−#ifdef DEBUG_NODEIDS
1595+#ifdef DEBUG_NODEIDS
15961596 nodeId <- newNodeId
15971597#endif
15981598 return $ FanInt
15991599 { _fanInt_subscribers = subscribers
16001600 , _fanInt_subscriptionRef = subscriptionRef
16011601 , _fanInt_occRef = occRef
1602−#ifdef DEBUG_NODEIDS
1603− , _fanInt_nodeId = nodeId
1602+#ifdef DEBUG_NODEIDS
1603+ , _fanInt_nodeId = nodeId
16041604#endif
16051605 }
16061606
@@ -1616,15 +1616,15 @@ fanInt p = unsafePerformIO $ do
16161616 liftIO $ writeIORef (_fanInt_occRef self) m
16171617 scheduleIntClear $ _fanInt_occRef self
16181618 FastMutableIntMap.forIntersectionWithImmutable_ (_fanInt_subscribers self) m $ \b v -> --TODO: Do we need to know that no subscribers are being added as we traverse?
1619− FastWeakBag.traverse_ b $ \s ->
1619+ FastWeakBag.traverse_ b $ \s ->
16201620 subscriberPropagate s v
1621− , subscriberInvalidateHeight = \old ->
1622− FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1623− FastWeakBag.traverse_ b $ \s ->
1621+ , subscriberInvalidateHeight = \old ->
1622+ FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1623+ FastWeakBag.traverse_ b $ \s ->
16241624 subscriberInvalidateHeight s old
16251625 , subscriberRecalculateHeight = \new ->
1626− FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1627− FastWeakBag.traverse_ b $ \s ->
1626+ FastMutableIntMap.for_ (_fanInt_subscribers self) $ \b ->
1627+ FastWeakBag.traverse_ b $ \s ->
16281628 subscriberRecalculateHeight s new
16291629 }
16301630 liftIO $ do
@@ -1640,14 +1640,14 @@ fanInt p = unsafePerformIO $ do
16401640 Just b -> return b
16411641 ticket <- liftIO $ FastWeakBag.insert sub b
16421642 currentOcc <- readIORef (_fanInt_occRef self)
1643−
1643+
16441644 subscribed <- fanIntSubscribed ticket self
16451645 return (EventSubscription (FastWeakBag.remove ticket) subscribed, IntMap.lookup k currentOcc)
16461646
16471647fanIntSubscribed :: FastWeakBagTicket k -> FanInt x a -> IO (EventSubscribed x)
1648−fanIntSubscribed ticket self = do
1648+fanIntSubscribed ticket self = do
16491649 subscribedParent <- _eventSubscription_subscribed <$> readIORef (_fanInt_subscriptionRef self)
1650− return $ EventSubscribed
1650+ return $ EventSubscribed
16511651 { eventSubscribedHeightRef = eventSubscribedHeightRef subscribedParent
16521652 , eventSubscribedRetained = toAny (_fanInt_subscriptionRef self, ticket)
16531653#ifdef DEBUG_CYCLES
@@ -1656,7 +1656,7 @@ fanIntSubscribed ticket self = do
16561656 , eventSubscribedWhoCreated = whoCreatedIORef $ _fanInt_subscriptionRef self
16571657#endif
16581658 }
1659−
1659+
16601660
16611661{-# INLINABLE getFanSubscribed #-}
16621662getFanSubscribed :: (HasSpiderTimeline x, GCompare k) => k a -> Fan x k v -> Subscriber x (v a) -> EventM x (WeakBagTicket, FanSubscribed x k v, Maybe (v a))
@@ -1869,7 +1869,7 @@ mergeCheap nt = mergeGCheap' unMergeSubscribedParent getInitialSubscribers updat
18691869 liftIO $ modifyIORef' heightBagRef $ heightBagAdd newParentHeight
18701870 return $ DMap.insertLookupWithKey' (\_ new _ -> new) k newParent ps
18711871 forM_ mOldSubd $ \oldSubd -> do
1872− oldHeight <- liftIO $ getEventSubscribedHeight $
1872+ oldHeight <- liftIO $ getEventSubscribedHeight $
18731873 _eventSubscription_subscribed $ unMergeSubscribedParent oldSubd
18741874
18751875 liftIO $ modifyIORef heightBagRef $ heightBagRemove oldHeight
@@ -1915,7 +1915,7 @@ mergeCheapWithMove nt = mergeGCheap' _mergeSubscribedParentWithMove_subscription
19151915 let moveOrDelete :: forall a. k a -> PatchDMapWithMove.NodeInfo k q a -> MergeSubscribedParentWithMove x k a -> Constant (EventM x (Maybe (EventSubscription x))) a
19161916 moveOrDelete _ ni parent = Constant $ case getComposeMaybe $ PatchDMapWithMove._nodeInfo_to ni of
19171917 Nothing -> do
1918− oldHeight <- liftIO $ getEventSubscribedHeight $ _eventSubscription_subscribed $
1918+ oldHeight <- liftIO $ getEventSubscribedHeight $ _eventSubscription_subscribed $
19191919 _mergeSubscribedParentWithMove_subscription parent
19201920
19211921 liftIO $ modifyIORef heightBagRef $ heightBagRemove oldHeight
@@ -1923,7 +1923,7 @@ mergeCheapWithMove nt = mergeGCheap' _mergeSubscribedParentWithMove_subscription
19231923 Just toKey -> do
19241924 liftIO $ writeIORef (_mergeSubscribedParentWithMove_key parent) $! toKey
19251925 return Nothing
1926− toDelete <- fmap catMaybes $ mapM (\(_ :=> v) -> getConstant v) $ DMap.toList $
1926+ toDelete <- fmap catMaybes $ mapM (\(_ :=> v) -> getConstant v) $ DMap.toList $
19271927 DMap.intersectionWithKey moveOrDelete (unPatchDMapWithMove p) oldParents
19281928
19291929 return (toDelete, applyAlways p' oldParents)
@@ -1976,16 +1976,16 @@ invalidateMergeHeight' :: IORef Height -> Subscriber x a -> IO ()
19761976invalidateMergeHeight' heightRef sub = do
19771977 oldHeight <- readIORef heightRef
19781978 -- If the height used to be valid, it must be invalid now; we should never have *more* heights than we have parents
1979− when (oldHeight /= invalidHeight) $ do
1979+ when (oldHeight /= invalidHeight) $ do
19801980 writeIORef heightRef $! invalidHeight
19811981 subscriberInvalidateHeight sub oldHeight
19821982
19831983revalidateMergeHeight :: Merge x k v s -> IO ()
19841984revalidateMergeHeight m = do
19851985 currentHeight <- readIORef $ _merge_heightRef m
1986−
1986+
19871987 -- revalidateMergeHeight may be called multiple times; perhaps the's a way to finesse it to avoid this check
1988− when (currentHeight == invalidHeight) $ do
1988+ when (currentHeight == invalidHeight) $ do
19891989 heights <- readIORef $ _merge_heightBagRef m
19901990 parents <- readIORef $ _merge_parentsRef m
19911991 -- When the number of heights in the bag reaches the number of parents, we should have a valid height
@@ -2001,22 +2001,22 @@ revalidateMergeHeight m = do
20012001scheduleMergeSelf :: HasSpiderTimeline x => Merge x k v s -> Height -> EventM x ()
20022002scheduleMergeSelf m height = scheduleMerge' height (_merge_heightRef m) $ do
20032003 vals <- liftIO $ readIORef $ _merge_accumRef m
2004− -- Once we're done with this, we can clear it immediately, because if there's a cacheEvent in front of us,
2004+ -- Once we're done with this, we can clear it immediately, because if there's a cacheEvent in front of us,
20052005 -- it'll handle subsequent subscribers, and if not, we won't get subsequent subscribers
2006− liftIO $ writeIORef (_merge_accumRef m) $! DMap.empty
2006+ liftIO $ writeIORef (_merge_accumRef m) $! DMap.empty
20072007 --TODO: Assert that m is not empty
20082008 subscriberPropagate (_merge_sub m) vals
20092009
20102010checkCycle :: HasSpiderTimeline x => EventSubscribed x -> EventM x ()
20112011checkCycle subscribed = liftIO $ do
20122012 height <- readIORef (eventSubscribedHeightRef subscribed)
2013−
2013+
20142014 -- currentHeight <- getCurrentHeight
20152015 -- when (height <= currentHeight) $ if height /= invalidHeight
20162016 -- then do
20172017 -- myStack <- liftIO $ whoCreatedIORef undefined --TODO
20182018 -- error $ "Height (" ++ show height ++ ") is not greater than current height (" ++ show currentHeight ++ ")\n" ++ unlines (reverse myStack)
2019− -- else liftIO $
2019+ -- else liftIO $
20202020 when (height == invalidHeight) $
20212021#ifdef DEBUG_CYCLES
20222022 do
@@ -2069,17 +2069,17 @@ mergeGCheap' getParent getInitialSubscribers updateFunc destroy d = Event $ \sub
20692069 parentsRef :: IORef (DMap k s) <- liftIO $ newIORef $ error "merge: parentsRef not yet initialized"
20702070 changeSubdRef <- liftIO $ newIORef $ error "getMergeSubscribed: changeSubdRef not yet initialized"
20712071
2072− let subscribed = EventSubscribed
2073− { eventSubscribedHeightRef = heightRef
2072+ let subscribed = EventSubscribed
2073+ { eventSubscribedHeightRef = heightRef
20742074 , eventSubscribedRetained = toAny (parentsRef, changeSubdRef)
20752075#ifdef DEBUG_CYCLES
20762076 , eventSubscribedGetParents = do
20772077 let getParent' (_ :=> v) = _eventSubscription_subscribed (getParent v)
2078− fmap getParent' . DMap.toList <$> readIORef parentsRef
2078+ fmap getParent' . DMap.toList <$> readIORef parentsRef
20792079 , eventSubscribedHasOwnHeightRef = False
20802080 , eventSubscribedWhoCreated = whoCreatedIORef heightRef
2081−#endif
2082− }
2081+#endif
2082+ }
20832083
20842084 m = Merge
20852085 { _merge_parentsRef = parentsRef
@@ -2117,9 +2117,9 @@ mergeGCheap' getParent getInitialSubscribers updateFunc destroy d = Event $ \sub
21172117 -- its subscription.
21182118 liftIO $ writeIORef changeSubdRef (changeSubscriber, changeSubscription)
21192119 let unsubscribeAll = destroy =<< readIORef parentsRef
2120−
2120+
21212121 return (EventSubscription unsubscribeAll subscribed, occ)
2122−
2122+
21232123
21242124mergeInt :: forall x a. (HasSpiderTimeline x) => DynamicS x (PatchIntMap (Event x a)) -> Event x (IntMap a)
21252125mergeInt = cacheEvent . mergeIntCheap
@@ -2133,14 +2133,14 @@ mergeIntCheap d = Event $ \sub -> do
21332133 heightBagRef <- liftIO $ newIORef heightBagEmpty
21342134 parents <- liftIO $ FastMutableIntMap.newEmpty
21352135 changeSubdRef <- liftIO $ newIORef $ error "getMergeSubscribed: changeSubdRef not yet initialized"
2136− let subscribed = EventSubscribed
2137− { eventSubscribedHeightRef = heightRef
2136+ let subscribed = EventSubscribed
2137+ { eventSubscribedHeightRef = heightRef
21382138 , eventSubscribedRetained = toAny (parents, changeSubdRef)
21392139#ifdef DEBUG_CYCLES
21402140 , eventSubscribedGetParents = fmap (_eventSubscription_subscribed . snd) <$> FastMutableIntMap.toList parents
21412141 , eventSubscribedHasOwnHeightRef = False
21422142 , eventSubscribedWhoCreated = whoCreatedIORef heightRef
2143−#endif
2143+#endif
21442144 }
21452145 let scheduleSelf = do
21462146 height <- liftIO $ readIORef $ heightRef
@@ -2229,7 +2229,7 @@ mergeIntCheap d = Event $ \sub -> do
22292229 -- its subscription.
22302230 liftIO $ writeIORef changeSubdRef (changeSubscriber, changeSubscription)
22312231 let unsubscribeAll = traverse_ unsubscribe =<< FastMutableIntMap.getFrozenAndClear parents
2232−
2232+
22332233
22342234 return (EventSubscription unsubscribeAll subscribed, occ)
22352235