@@ -20,7 +20,6 @@
2020{-# LANGUAGE DeriveFunctor #-}
2121{-# LANGUAGE StandaloneDeriving #-}
2222{-# LANGUAGE InstanceSigs #-}
23−
2423#ifdef USE_REFLEX_OPTIMIZER
2524{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
2625#endif
@@ -388,7 +387,7 @@ eventRoot !k !r = Event $ wrap eventSubscribedRoot $ liftIO . getRootSubscribed
388387eventNever :: Event x a
389388eventNever = Event $ \_ -> return (EventSubscription (return ()) eventSubscribedNever, Nothing)
390389
391−eventFan :: (GCompare k, HasSpiderTimeline x) => k a -> Fan x k v -> Event x (v a)
390+eventFan :: (GCompare k, HasSpiderTimeline x) => k a -> Fan x k -> Event x a
392391eventFan !k !f = Event $ wrap eventSubscribedFan $ getFanSubscribed k f
393392
394393eventSwitch :: HasSpiderTimeline x => Switch x a -> Event x a
@@ -440,14 +439,14 @@ newSubscriberHold h = return $ Subscriber
440439 , subscriberRecalculateHeight = \_ -> return ()
441440 }
442441
443−newSubscriberFan :: forall x k v. (HasSpiderTimeline x, GCompare k) => FanSubscribed x k v -> IO (Subscriber x (DMap k v))
442+newSubscriberFan :: forall x k. (HasSpiderTimeline x, GCompare k) => FanSubscribed x k -> IO (Subscriber x (DMap k Identity))
444443newSubscriberFan subscribed = return $ Subscriber
445444 { subscriberPropagate = \a -> {-# SCC "traverseFan" #-} do
446445 subs <- liftIO $ readIORef $ fanSubscribedSubscribers subscribed
447446 tracePropagate (Proxy :: Proxy x) $ "SubscriberFan" <> showNodeId subscribed <> ": " ++ show (DMap.size subs) ++ " keys subscribed, " ++ show (DMap.size a) ++ " keys firing"
448447 liftIO $ writeIORef (fanSubscribedOccurrence subscribed) $ Just a
449448 scheduleClear $ fanSubscribedOccurrence subscribed
450− let f _ (Pair v subsubs) = do
449+ let f _ (Pair (Identity v) subsubs) = do
451450 propagate v $ _fanSubscribedChildren_list subsubs
452451 return $ Constant ()
453452 _ <- DMap.traverseWithKey f $ DMap.intersectionWithKey (\_ -> Pair) a subs --TODO: Would be nice to have DMap.traverse_
@@ -600,7 +599,7 @@ eventSubscribedNever = EventSubscribed
600599#endif
601600 }
602601
603−eventSubscribedFan :: FanSubscribed x k v -> EventSubscribed x
602+eventSubscribedFan :: FanSubscribed x k -> EventSubscribed x
604603eventSubscribedFan !subscribed = EventSubscribed
605604 { eventSubscribedHeightRef = eventSubscribedHeightRef $ _eventSubscription_subscribed $ fanSubscribedParent subscribed
606605 , eventSubscribedRetained = toAny subscribed
@@ -1018,7 +1017,7 @@ data RootSubscribed x a = forall k. GCompare k => RootSubscribed
10181017#endif
10191018 }
10201019
1021−data Root x k
1020+data Root x (k :: * -> *)
10221021 = Root { rootOccurrence :: !(IORef (DMap k Identity)) -- The currently-firing occurrence of this event
10231022 , rootSubscribed :: !(IORef (DMap k (RootSubscribed x)))
10241023 , rootInit :: !(forall a. k a -> RootTrigger x a -> IO (IO ()))
@@ -1088,25 +1087,25 @@ heightBagVerify b@(HeightBag s c) = if
10881087heightBagVerify = id
10891088#endif
10901089
1091−data FanSubscribedChildren x k v a = FanSubscribedChildren
1092− { _fanSubscribedChildren_list :: !(WeakBag (Subscriber x (v a)))
1093− , _fanSubscribedChildren_self :: {-# NOUNPACK #-} !(k a, FanSubscribed x k v)
1094− , _fanSubscribedChildren_weakSelf :: !(IORef (Weak (k a, FanSubscribed x k v)))
1090+data FanSubscribedChildren (x :: *) k a = FanSubscribedChildren
1091+ { _fanSubscribedChildren_list :: !(WeakBag (Subscriber x a))
1092+ , _fanSubscribedChildren_self :: {-# NOUNPACK #-} !(k a, FanSubscribed x k)
1093+ , _fanSubscribedChildren_weakSelf :: !(IORef (Weak (k a, FanSubscribed x k)))
10951094 }
10961095
1097−data FanSubscribed x k v
1098− = FanSubscribed { fanSubscribedCachedSubscribed :: !(IORef (Maybe (FanSubscribed x k v)))
1099− , fanSubscribedOccurrence :: !(IORef (Maybe (DMap k v)))
1100− , fanSubscribedSubscribers :: !(IORef (DMap k (FanSubscribedChildren x k v))) -- This DMap should never be empty
1096+data FanSubscribed (x :: *) k
1097+ = FanSubscribed { fanSubscribedCachedSubscribed :: !(IORef (Maybe (FanSubscribed x k)))
1098+ , fanSubscribedOccurrence :: !(IORef (Maybe (DMap k Identity)))
1099+ , fanSubscribedSubscribers :: !(IORef (DMap k (FanSubscribedChildren x k))) -- This DMap should never be empty
11011100 , fanSubscribedParent :: !(EventSubscription x)
11021101#ifdef DEBUG_NODEIDS
11031102 , fanSubscribedNodeId :: Int
11041103#endif
11051104 }
11061105
1107−data Fan x k v
1108− = Fan { fanParent :: !(Event x (DMap k v))
1109− , fanSubscribed :: !(IORef (Maybe (FanSubscribed x k v)))
1106+data Fan x k
1107+ = Fan { fanParent :: !(Event x (DMap k Identity))
1108+ , fanSubscribed :: !(IORef (Maybe (FanSubscribed x k)))
11101109 }
11111110
11121111data SwitchSubscribed x a
@@ -1560,7 +1559,7 @@ fanInt p =
15601559 return (EventSubscription (FastWeakBag.remove t) $! EventSubscribed heightRef $! toAny (_fanInt_subscriptionRef self, t), IntMap.lookup k currentOcc)
15611560
15621561{-# INLINABLE getFanSubscribed #-}
1563−getFanSubscribed :: (HasSpiderTimeline x, GCompare k) => k a -> Fan x k v -> Subscriber x (v a) -> EventM x (WeakBagTicket, FanSubscribed x k v, Maybe (v a))
1562+getFanSubscribed :: (HasSpiderTimeline x, GCompare k) => k a -> Fan x k -> Subscriber x a -> EventM x (WeakBagTicket, FanSubscribed x k, Maybe a)
15641563getFanSubscribed k f sub = do
15651564 mSubscribed <- liftIO $ readIORef $ fanSubscribed f
15661565 case mSubscribed of
@@ -1594,7 +1593,7 @@ getFanSubscribed k f sub = do
15941593 liftIO $ writeIORef (fanSubscribed f) $ Just subscribed
15951594 return (slnForSub, subscribed, coerce $ DMap.lookup k =<< parentOcc)
15961595
1597−cleanupFanSubscribed :: GCompare k => (k a, FanSubscribed x k v) -> IO ()
1596+cleanupFanSubscribed :: GCompare k => (k a, FanSubscribed x k) -> IO ()
15981597cleanupFanSubscribed (k, subscribed) = do
15991598 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
16001599 let reducedSubscribers = DMap.delete k subscribers
@@ -1606,7 +1605,7 @@ cleanupFanSubscribed (k, subscribed) = do
16061605 else writeIORef (fanSubscribedSubscribers subscribed) $! reducedSubscribers
16071606
16081607{-# INLINE subscribeFanSubscribed #-}
1609−subscribeFanSubscribed :: GCompare k => k a -> FanSubscribed x k v -> Subscriber x (v a) -> IO WeakBagTicket
1608+subscribeFanSubscribed :: GCompare k => k a -> FanSubscribed x k -> Subscriber x a -> IO WeakBagTicket
16101609subscribeFanSubscribed k subscribed sub = do
16111610 subscribers <- readIORef $ fanSubscribedSubscribers subscribed
16121611 case DMap.lookup k subscribers of
@@ -2082,15 +2081,14 @@ mergeIntCheap d = Event $ \sub -> do
20822081 )
20832082
20842083newtype EventSelector x k = EventSelector { select :: forall a. k a -> Event x a }
2085−newtype EventSelectorG x k v = EventSelectorG { selectG :: forall a. k a -> Event x (v a) }
20862084
2087−fanG :: (HasSpiderTimeline x, GCompare k) => Event x (DMap k v) -> EventSelectorG x k v
2088−fanG e =
2085+fan :: (HasSpiderTimeline x, GCompare k) => Event x (DMap k Identity) -> EventSelector x k
2086+fan e =
20892087 let f = Fan
20902088 { fanParent = e
20912089 , fanSubscribed = unsafeNewIORef e Nothing
20922090 }
2093− in EventSelectorG $ \k -> eventFan k f
2091+ in EventSelector $ \k -> eventFan k f
20942092
20952093runHoldInits :: HasSpiderTimeline x => IORef [SomeHoldInit x] -> IORef [SomeDynInit x] -> IORef [SomeMergeInit x] -> EventM x ()
20962094runHoldInits holdInitRef dynInitRef mergeInitRef = do
@@ -2559,8 +2557,6 @@ instance HasSpiderTimeline x => R.Reflex (SpiderTimeline x) where
25592557 pushCheap f = SpiderEvent . pushCheap (coerce f) . unSpiderEvent
25602558 {-# INLINABLE pull #-}
25612559 pull = SpiderBehavior . pull . coerce
2562− {-# INLINABLE fanG #-}
2563− fanG e = R.EventSelectorG $ SpiderEvent . selectG (fanG (unSpiderEvent e))
25642560 {-# INLINABLE mergeG #-}
25652561 mergeG
25662562 :: forall (k :: k2 -> *) q (v :: k2 -> *). GCompare k
@@ -2568,6 +2564,8 @@ instance HasSpiderTimeline x => R.Reflex (SpiderTimeline x) where
25682564 -> DMap k q
25692565 -> R.Event (SpiderTimeline x) (DMap k v)
25702566 mergeG nt = SpiderEvent . mergeG (unSpiderEvent #. nt) . dynamicConst
2567+ {-# INLINABLE fan #-}
2568+ fan e = R.EventSelector $ SpiderEvent . select (fan (unSpiderEvent e))
25712569 {-# INLINABLE switch #-}
25722570 switch = SpiderEvent . switch . (coerce :: Behavior x (R.Event (SpiderTimeline x) a) -> Behavior x (Event x a)) . unSpiderBehavior
25732571 {-# INLINABLE coincidence #-}