19
19
{-# LANGUAGE UndecidableInstances #-}
20
20
{-# LANGUAGE PolyKinds #-}
21
21
{-# LANGUAGE InstanceSigs #-}
22
+
22
23
#ifdef USE_REFLEX_OPTIMIZER
23
24
{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
24
25
#endif
@@ -374,7 +375,7 @@ eventRoot !k !r = Event $ wrap eventSubscribedRoot $ liftIO . getRootSubscribed
374
375
eventNever :: Event x a
375
376
eventNever = Event $ \ _ -> return (EventSubscription (return () ) eventSubscribedNever, Nothing )
376
377
377
- eventFan :: (GCompare k , HasSpiderTimeline x ) => k a -> Fan x k -> Event x a
378
+ eventFan :: (GCompare k , HasSpiderTimeline x ) => k a -> Fan x k v -> Event x ( v a )
378
379
eventFan ! k ! f = Event $ wrap eventSubscribedFan $ getFanSubscribed k f
379
380
380
381
eventSwitch :: HasSpiderTimeline x => Switch x a -> Event x a
@@ -426,14 +427,14 @@ newSubscriberHold h = return $ Subscriber
426
427
, subscriberRecalculateHeight = \ _ -> return ()
427
428
}
428
429
429
- newSubscriberFan :: forall x k . (HasSpiderTimeline x , GCompare k ) => FanSubscribed x k -> IO (Subscriber x (DMap k Identity ))
430
+ newSubscriberFan :: forall x k v . (HasSpiderTimeline x , GCompare k ) => FanSubscribed x k v -> IO (Subscriber x (DMap k v ))
430
431
newSubscriberFan subscribed = return $ Subscriber
431
432
{ subscriberPropagate = \ a -> {-# SCC "traverseFan" #-} do
432
433
subs <- liftIO $ readIORef $ fanSubscribedSubscribers subscribed
433
434
tracePropagate (Proxy :: Proxy x ) $ " SubscriberFan" <> showNodeId subscribed <> " : " ++ show (DMap. size subs) ++ " keys subscribed, " ++ show (DMap. size a) ++ " keys firing"
434
435
liftIO $ writeIORef (fanSubscribedOccurrence subscribed) $ Just a
435
436
scheduleClear $ fanSubscribedOccurrence subscribed
436
- let f _ (Pair ( Identity v) subsubs) = do
437
+ let f _ (Pair v subsubs) = do
437
438
propagate v $ _fanSubscribedChildren_list subsubs
438
439
return $ Constant ()
439
440
_ <- DMap. traverseWithKey f $ DMap. intersectionWithKey (\ _ -> Pair ) a subs -- TODO: Would be nice to have DMap.traverse_
@@ -581,7 +582,7 @@ eventSubscribedNever = EventSubscribed
581
582
#endif
582
583
}
583
584
584
- eventSubscribedFan :: FanSubscribed x k -> EventSubscribed x
585
+ eventSubscribedFan :: FanSubscribed x k v -> EventSubscribed x
585
586
eventSubscribedFan ! subscribed = EventSubscribed
586
587
{ eventSubscribedHeightRef = eventSubscribedHeightRef $ _eventSubscription_subscribed $ fanSubscribedParent subscribed
587
588
, eventSubscribedRetained = toAny subscribed
@@ -990,7 +991,7 @@ data RootSubscribed x a = forall k. GCompare k => RootSubscribed
990
991
# endif
991
992
}
992
993
993
- data Root x ( k :: * -> * )
994
+ data Root x k
994
995
= Root { rootOccurrence :: ! (IORef (DMap k Identity )) -- The currently-firing occurrence of this event
995
996
, rootSubscribed :: ! (IORef (DMap k (RootSubscribed x )))
996
997
, rootInit :: ! (forall a . k a -> RootTrigger x a -> IO (IO () ))
@@ -1060,25 +1061,25 @@ heightBagVerify b@(HeightBag s c) = if
1060
1061
heightBagVerify = id
1061
1062
#endif
1062
1063
1063
- data FanSubscribedChildren ( x :: * ) k a = FanSubscribedChildren
1064
- { _fanSubscribedChildren_list :: ! (WeakBag (Subscriber x a ))
1065
- , _fanSubscribedChildren_self :: {-# NOUNPACK #-} ! (k a , FanSubscribed x k )
1066
- , _fanSubscribedChildren_weakSelf :: ! (IORef (Weak (k a , FanSubscribed x k )))
1064
+ data FanSubscribedChildren x k v a = FanSubscribedChildren
1065
+ { _fanSubscribedChildren_list :: ! (WeakBag (Subscriber x ( v a ) ))
1066
+ , _fanSubscribedChildren_self :: {-# NOUNPACK #-} ! (k a , FanSubscribed x k v )
1067
+ , _fanSubscribedChildren_weakSelf :: ! (IORef (Weak (k a , FanSubscribed x k v )))
1067
1068
}
1068
1069
1069
- data FanSubscribed ( x :: * ) k
1070
- = FanSubscribed { fanSubscribedCachedSubscribed :: ! (IORef (Maybe (FanSubscribed x k )))
1071
- , fanSubscribedOccurrence :: ! (IORef (Maybe (DMap k Identity )))
1072
- , fanSubscribedSubscribers :: ! (IORef (DMap k (FanSubscribedChildren x k ))) -- This DMap should never be empty
1070
+ data FanSubscribed x k v
1071
+ = FanSubscribed { fanSubscribedCachedSubscribed :: ! (IORef (Maybe (FanSubscribed x k v )))
1072
+ , fanSubscribedOccurrence :: ! (IORef (Maybe (DMap k v )))
1073
+ , fanSubscribedSubscribers :: ! (IORef (DMap k (FanSubscribedChildren x k v ))) -- This DMap should never be empty
1073
1074
, fanSubscribedParent :: ! (EventSubscription x )
1074
1075
# ifdef DEBUG_NODEIDS
1075
1076
, fanSubscribedNodeId :: Int
1076
1077
# endif
1077
1078
}
1078
1079
1079
- data Fan x k
1080
- = Fan { fanParent :: ! (Event x (DMap k Identity ))
1081
- , fanSubscribed :: ! (IORef (Maybe (FanSubscribed x k )))
1080
+ data Fan x k v
1081
+ = Fan { fanParent :: ! (Event x (DMap k v ))
1082
+ , fanSubscribed :: ! (IORef (Maybe (FanSubscribed x k v )))
1082
1083
}
1083
1084
1084
1085
data SwitchSubscribed x a
@@ -1525,7 +1526,7 @@ fanInt p =
1525
1526
return (EventSubscription (FastWeakBag. remove t) $! EventSubscribed heightRef $! toAny (_fanInt_subscriptionRef self, t), IntMap. lookup k currentOcc)
1526
1527
1527
1528
{-# INLINABLE getFanSubscribed #-}
1528
- getFanSubscribed :: (HasSpiderTimeline x , GCompare k ) => k a -> Fan x k -> Subscriber x a -> EventM x (WeakBagTicket , FanSubscribed x k , Maybe a )
1529
+ 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 ) )
1529
1530
getFanSubscribed k f sub = do
1530
1531
mSubscribed <- liftIO $ readIORef $ fanSubscribed f
1531
1532
case mSubscribed of
@@ -1559,7 +1560,7 @@ getFanSubscribed k f sub = do
1559
1560
liftIO $ writeIORef (fanSubscribed f) $ Just subscribed
1560
1561
return (slnForSub, subscribed, coerce $ DMap. lookup k =<< parentOcc)
1561
1562
1562
- cleanupFanSubscribed :: GCompare k => (k a , FanSubscribed x k ) -> IO ()
1563
+ cleanupFanSubscribed :: GCompare k => (k a , FanSubscribed x k v ) -> IO ()
1563
1564
cleanupFanSubscribed (k, subscribed) = do
1564
1565
subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1565
1566
let reducedSubscribers = DMap. delete k subscribers
@@ -1571,7 +1572,7 @@ cleanupFanSubscribed (k, subscribed) = do
1571
1572
else writeIORef (fanSubscribedSubscribers subscribed) $! reducedSubscribers
1572
1573
1573
1574
{-# INLINE subscribeFanSubscribed #-}
1574
- subscribeFanSubscribed :: GCompare k => k a -> FanSubscribed x k -> Subscriber x a -> IO WeakBagTicket
1575
+ subscribeFanSubscribed :: GCompare k => k a -> FanSubscribed x k v -> Subscriber x ( v a ) -> IO WeakBagTicket
1575
1576
subscribeFanSubscribed k subscribed sub = do
1576
1577
subscribers <- readIORef $ fanSubscribedSubscribers subscribed
1577
1578
case DMap. lookup k subscribers of
@@ -2047,14 +2048,15 @@ mergeIntCheap d = Event $ \sub -> do
2047
2048
)
2048
2049
2049
2050
newtype EventSelector x k = EventSelector { select :: forall a . k a -> Event x a }
2051
+ newtype EventSelectorG x k v = EventSelectorG { selectG :: forall a . k a -> Event x (v a ) }
2050
2052
2051
- fan :: (HasSpiderTimeline x , GCompare k ) => Event x (DMap k Identity ) -> EventSelector x k
2052
- fan e =
2053
+ fanG :: (HasSpiderTimeline x , GCompare k ) => Event x (DMap k v ) -> EventSelectorG x k v
2054
+ fanG e =
2053
2055
let f = Fan
2054
2056
{ fanParent = e
2055
2057
, fanSubscribed = unsafeNewIORef e Nothing
2056
2058
}
2057
- in EventSelector $ \ k -> eventFan k f
2059
+ in EventSelectorG $ \ k -> eventFan k f
2058
2060
2059
2061
runHoldInits :: HasSpiderTimeline x => IORef [SomeHoldInit x ] -> IORef [SomeDynInit x ] -> IORef [SomeMergeInit x ] -> EventM x ()
2060
2062
runHoldInits holdInitRef dynInitRef mergeInitRef = do
@@ -2523,15 +2525,15 @@ instance HasSpiderTimeline x => R.Reflex (SpiderTimeline x) where
2523
2525
pushCheap f = SpiderEvent . pushCheap (coerce f) . unSpiderEvent
2524
2526
{-# INLINABLE pull #-}
2525
2527
pull = SpiderBehavior . pull . coerce
2528
+ {-# INLINABLE fanG #-}
2529
+ fanG e = R. EventSelectorG $ SpiderEvent . selectG (fanG (unSpiderEvent e))
2526
2530
{-# INLINABLE mergeG #-}
2527
2531
mergeG
2528
2532
:: forall (k :: k2 -> * ) q (v :: k2 -> * ). GCompare k
2529
2533
=> (forall a . q a -> R. Event (SpiderTimeline x ) (v a ))
2530
2534
-> DMap k q
2531
2535
-> R. Event (SpiderTimeline x ) (DMap k v )
2532
2536
mergeG nt = SpiderEvent . mergeG (unSpiderEvent #. nt) . dynamicConst
2533
- {-# INLINABLE fan #-}
2534
- fan e = R. EventSelector $ SpiderEvent . select (fan (unSpiderEvent e))
2535
2537
{-# INLINABLE switch #-}
2536
2538
switch = SpiderEvent . switch . (coerce :: Behavior x (R. Event (SpiderTimeline x ) a ) -> Behavior x (Event x a )) . unSpiderBehavior
2537
2539
{-# INLINABLE coincidence #-}
0 commit comments