@@ -37,7 +37,6 @@ import Data.Dependent.Map (DMap, DSum (..))
3737import qualified Data.Dependent.Map as DMap
3838import Data.Foldable hiding (concat, elem, sequence_)
3939import Data.Function
40−import Data.Functor.Compose
4140import Data.Functor.Constant
4241import Data.Functor.Product
4342import Data.GADT.Compare
@@ -51,6 +50,7 @@ import Data.Some (Some)
5150import qualified Data.Some as Some
5251import Data.These
5352import Data.Traversable
53+import Data.Type.Coercion
5454import Data.Word
5555import GHC.IORef (IORef (..))
5656import GHC.Stack
@@ -215,10 +215,10 @@ eventSwitch !s = Event $ wrap eventSubscribedSwitch $ getSwitchSubscribed s
215215eventCoincidence :: Coincidence x a -> Event x a
216216eventCoincidence !c = Event $ wrap eventSubscribedCoincidence $ getCoincidenceSubscribed c
217217
218−eventHold :: a ~ p b => Hold x p b -> Event x a
218+eventHold :: Hold x p -> Event x p
219219eventHold !h = Event $ subscribeHoldEvent h
220220
221−eventDyn :: (a ~ p b, R.Patch p) => Dyn x p b -> Event x a
221+eventDyn :: R.Patch p => Dyn x p -> Event x p
222222eventDyn !j = Event $ \sub -> getDynHold j >>= \h -> subscribeHoldEvent h sub
223223
224224{-# INLINE subscribeCoincidenceInner #-}
@@ -272,7 +272,7 @@ newSubscriberPush compute subscribed = return $ Subscriber
272272 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberPush" <> showNodeId subscribed <> " done"
273273 }
274274
275−newSubscriberHold :: R.Patch p => Hold x p a -> IO (Subscriber x (p a))
275+newSubscriberHold :: R.Patch p => Hold x p -> IO (Subscriber x p)
276276newSubscriberHold h = return $ Subscriber
277277 { subscriberPropagate = {-# SCC "traverseHold" #-} propagateSubscriberHold h
278278 , subscriberInvalidateHeight = \_ -> return ()
@@ -318,7 +318,7 @@ newSubscriberMerge k subscribed = return $ Subscriber
318318 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberMerge" <> showNodeId subscribed <> " done"
319319 }
320320
321−newSubscriberMergeChange :: GCompare k => MergeSubscribed x k -> IO (Subscriber x (R.PatchDMap (DMap k (Event x))))
321+newSubscriberMergeChange :: GCompare k => MergeSubscribed x k -> IO (Subscriber x (R.PatchDMap k (Event x)))
322322newSubscriberMergeChange subscribed = return $ Subscriber
323323 { subscriberPropagate = \a -> {-# SCC "traverseMergeChange" #-} do
324324 tracePropagate $ "SubscriberMerge" <> showNodeId subscribed
@@ -555,7 +555,7 @@ walkInvalidHeightParents s0 = do
555555#endif
556556
557557{-# INLINE subscribeHoldEvent #-}
558−subscribeHoldEvent :: CanSubscribe x m => Hold x p a -> Subscriber x (p a) -> m (EventSubscription x (p a), Maybe (p a))
558+subscribeHoldEvent :: CanSubscribe x m => Hold x p -> Subscriber x p -> m (EventSubscription x p, Maybe p)
559559subscribeHoldEvent = subscribeAndRead . holdEvent
560560
561561--------------------------------------------------------------------------------
@@ -576,10 +576,10 @@ unsubscribe (EventSubscription msln _) = forM_ msln $ \sln -> WeakBag.remove sln
576576
577577newtype Behavior x a = Behavior { readBehaviorTracked :: BehaviorM x a }
578578
579−behaviorHold :: Hold x p a -> Behavior x a
579+behaviorHold :: Hold x p -> Behavior x (R.PatchTarget p)
580580behaviorHold !h = Behavior $ readHoldTracked h
581581
582−behaviorHoldIdentity :: Hold x Identity a -> Behavior x a
582+behaviorHoldIdentity :: Hold x (Identity a) -> Behavior x a
583583behaviorHoldIdentity = behaviorHold
584584
585585behaviorConst :: a -> Behavior x a
@@ -612,11 +612,11 @@ behaviorPull !p = Behavior $ do
612612 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
613613 return a
614614
615−behaviorDyn :: R.Patch p => Dyn x p a -> Behavior x a
615+behaviorDyn :: R.Patch p => Dyn x p -> Behavior x (R.PatchTarget p)
616616behaviorDyn !d = Behavior $ readHoldTracked =<< getDynHold d
617617
618618{-# INLINE readHoldTracked #-}
619−readHoldTracked :: Hold x p a -> BehaviorM x a
619+readHoldTracked :: Hold x p -> BehaviorM x (R.PatchTarget p)
620620readHoldTracked h = do
621621 result <- liftIO $ readIORef $ holdValue h
622622 askInvalidator >>= mapM_ (\wi -> liftIO $ modifyIORef' (holdInvalidators h) (wi:))
@@ -634,33 +634,33 @@ readBehaviorUntracked b = do
634634-- Dynamic
635635--------------------------------------------------------------------------------
636636
637−data Dynamic x p a = Dynamic
638− { dynamicCurrent :: !(Behavior x a)
639− , dynamicUpdated :: !(Event x (p a))
637+data Dynamic x p = Dynamic
638+ { dynamicCurrent :: !(Behavior x (R.PatchTarget p))
639+ , dynamicUpdated :: !(Event x p)
640640 }
641641
642−dynamicHold :: Hold x p a -> Dynamic x p a
642+dynamicHold :: Hold x p -> Dynamic x p
643643dynamicHold !h = Dynamic
644644 { dynamicCurrent = behaviorHold h
645645 , dynamicUpdated = eventHold h
646646 }
647647
648−dynamicHoldIdentity :: Hold x Identity a -> Dynamic x Identity a
648+dynamicHoldIdentity :: Hold x (Identity a) -> Dynamic x (Identity a)
649649dynamicHoldIdentity = dynamicHold
650650
651−dynamicConst :: a -> Dynamic x p a
651+dynamicConst :: R.PatchTarget p -> Dynamic x p
652652dynamicConst !a = Dynamic
653653 { dynamicCurrent = behaviorConst a
654654 , dynamicUpdated = eventNever
655655 }
656656
657−dynamicDyn :: R.Patch p => Dyn x p a -> Dynamic x p a
657+dynamicDyn :: R.Patch p => Dyn x p -> Dynamic x p
658658dynamicDyn !d = Dynamic
659659 { dynamicCurrent = behaviorDyn d
660660 , dynamicUpdated = eventDyn d
661661 }
662662
663−dynamicDynIdentity :: Dyn x Identity a -> Dynamic x Identity a
663+dynamicDynIdentity :: Dyn x (Identity a) -> Dynamic x (Identity a)
664664dynamicDynIdentity = dynamicDyn
665665
666666--------------------------------------------------------------------------------
@@ -671,11 +671,11 @@ dynamicDynIdentity = dynamicDyn
671671--representational so we can use coerce
672672
673673--type role Hold representational
674−data Hold x p a
675− = Hold { holdValue :: !(IORef a)
674+data Hold x p
675+ = Hold { holdValue :: !(IORef (R.PatchTarget p))
676676 , holdInvalidators :: !(IORef [Weak (Invalidator x)])
677− , holdEvent :: Event x (p a) -- This must be lazy, or holds cannot be defined before their input Events
678− , holdParent :: !(IORef (Maybe (EventSubscription x (p a)))) -- Keeps its parent alive (will be undefined until the hold is initialized) --TODO: Probably shouldn't be an IORef
677+ , holdEvent :: Event x p -- This must be lazy, or holds cannot be defined before their input Events
678+ , holdParent :: !(IORef (Maybe (EventSubscription x p))) -- Keeps its parent alive (will be undefined until the hold is initialized) --TODO: Probably shouldn't be an IORef
679679#ifdef DEBUG_NODEIDS
680680 , holdNodeId :: Int
681681#endif
@@ -779,9 +779,9 @@ instance Defer (SomeResetCoincidence x) (EventM x) where
779779 getDeferralQueue = EventM $ asks eventEnvResetCoincidences
780780
781781-- Note: hold cannot examine its event until after the phase is over
782−{-# SPECIALIZE hold :: R.Patch p => a -> Event x (p a) -> EventM x (Hold x p a) #-}
783−{-# SPECIALIZE hold :: R.Patch p => a -> Event x (p a) -> ComputeM x (Hold x p a) #-}
784−hold :: (R.Patch p, Defer (SomeHoldInit x) m) => a -> Event x (p a) -> m (Hold x p a)
782+{-# SPECIALIZE hold :: R.Patch p => R.PatchTarget p -> Event x p -> EventM x (Hold x p) #-}
783+{-# SPECIALIZE hold :: R.Patch p => R.PatchTarget p -> Event x p -> ComputeM x (Hold x p) #-}
784+hold :: (R.Patch p, Defer (SomeHoldInit x) m) => R.PatchTarget p -> Event x p -> m (Hold x p)
785785hold v0 e = do
786786 valRef <- liftIO $ newIORef v0
787787 invsRef <- liftIO $ newIORef []
@@ -802,7 +802,7 @@ hold v0 e = do
802802 return h
803803
804804{-# INLINE getHoldEventSubscription #-}
805−getHoldEventSubscription :: forall m p a x. (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer SomeClear m, R.Patch p, HasCurrentHeight x m, Defer (SomeMergeInit x) m, Defer (SomeResetCoincidence x) m, HasSpiderTimeline x m, m ~ EventM x) => Hold x p a -> m (EventSubscription x (p a))
805+getHoldEventSubscription :: forall m p x. (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer SomeClear m, R.Patch p, HasCurrentHeight x m, Defer (SomeMergeInit x) m, Defer (SomeResetCoincidence x) m, HasSpiderTimeline x m, m ~ EventM x) => Hold x p -> m (EventSubscription x p)
806806getHoldEventSubscription h = do
807807 ep <- liftIO $ readIORef $ holdParent h
808808 case ep of
@@ -843,7 +843,7 @@ instance Monad (BehaviorM x) where
843843 fail s = BehaviorM $ fail s
844844
845845data BehaviorSubscribed x a
846− = forall p. BehaviorSubscribedHold (Hold x p a)
846+ = forall p. BehaviorSubscribedHold (Hold x p)
847847 | BehaviorSubscribedPull (PullSubscribed x a)
848848
849849data SomeBehaviorSubscribed x = forall a. SomeBehaviorSubscribed (BehaviorSubscribed x a)
@@ -887,11 +887,11 @@ data Root x (k :: * -> *)
887887 , rootInit :: !(forall a. k a -> RootTrigger x a -> IO (IO ()))
888888 }
889889
890−data SomeHoldInit x = forall p a. R.Patch p => SomeHoldInit !(Hold x p a)
890+data SomeHoldInit x = forall p. R.Patch p => SomeHoldInit !(Hold x p)
891891
892−data SomeMergeUpdate x = forall k. GCompare k => SomeMergeUpdate (R.PatchDMap (DMap k (Event x))) (MergeSubscribed x k)
892+data SomeMergeUpdate x = forall k. GCompare k => SomeMergeUpdate (R.PatchDMap k (Event x)) (MergeSubscribed x k)
893893
894−data SomeMergeInit x = forall k. GCompare k => SomeMergeInit !(MergeSubscribed x k) !(Event x (R.PatchDMap (DMap k (Event x))))
894+data SomeMergeInit x = forall k. GCompare k => SomeMergeInit !(MergeSubscribed x k) !(Event x (R.PatchDMap k (Event x)))
895895
896896data SomeEventSubscription x = forall a. SomeEventSubscription (EventSubscription x a)
897897
@@ -980,7 +980,7 @@ data MergeSubscribed x k
980980 , mergeSubscribedHeight :: !(IORef Height)
981981 , mergeSubscribedHeightBag :: !(IORef HeightBag)
982982 , mergeSubscribedSubscribers :: !(WeakBag (Subscriber x (DMap k Identity)))
983− , mergeSubscribedChange :: !(IORef (Subscriber x (R.PatchDMap (DMap k (Event x))), EventSubscribed x (R.PatchDMap (DMap k (Event x)))))
983+ , mergeSubscribedChange :: !(IORef (Subscriber x (R.PatchDMap k (Event x)), EventSubscribed x (R.PatchDMap k (Event x))))
984984 , mergeSubscribedParents :: !(IORef (DMap k (MergeSubscribedParent x k)))
985985 , mergeSubscribedWeakSelf :: !(IORef (Weak (MergeSubscribed x k)))
986986#ifdef DEBUG_NODEIDS
@@ -990,7 +990,7 @@ data MergeSubscribed x k
990990
991991--TODO: DMap sucks; we should really write something better (with a functor for the value as well as the key)
992992data Merge x k
993− = Merge { mergeParents :: !(Dynamic x R.PatchDMap (DMap k (Event x)))
993+ = Merge { mergeParents :: !(Dynamic x (R.PatchDMap k (Event x)))
994994 , mergeSubscribed :: !(IORef (Maybe (MergeSubscribed x k)))
995995 }
996996
@@ -1071,22 +1071,13 @@ instance Align (Event x) where
10711071 nil = eventNever
10721072 align ea eb = R.fmapMaybe R.dmapToThese $ merge $ dynamicConst $ DMap.fromList [R.LeftTag :=> ea, R.RightTag :=> eb]
10731073
1074−newtype Dyn x p a = Dyn { unDyn :: IORef (Either (BehaviorM x a, Event x (p a)) (Hold x p a)) }
1074+newtype Dyn x p = Dyn { unDyn :: IORef (Either (BehaviorM x (R.PatchTarget p), Event x p) (Hold x p)) }
10751075
1076−newMapDyn :: (a -> b) -> Dynamic x Identity a -> Dynamic x Identity b
1076+newMapDyn :: (a -> b) -> Dynamic x (Identity a) -> Dynamic x (Identity b)
10771077newMapDyn f d = dynamicDynIdentity $ unsafeDyn (fmap f $ readBehaviorTracked $ dynamicCurrent d) (Identity . f . runIdentity <$> dynamicUpdated d)
10781078
1079−instance Functor (Dynamic x Identity) where
1080− fmap = newMapDyn
1081−
1082−instance Applicative (Dynamic x Identity) where
1083− pure = dynamicConst
1084− (<*>) = zipDynWith ($)
1085− _ *> b = b
1086− a <* _ = a
1087−
10881079--TODO: Avoid the duplication between this and R.zipDynWith
1089−zipDynWith :: (a -> b -> c) -> Dynamic x Identity a -> Dynamic x Identity b -> Dynamic x Identity c
1080+zipDynWith :: (a -> b -> c) -> Dynamic x (Identity a) -> Dynamic x (Identity b) -> Dynamic x (Identity c)
10901081zipDynWith f da db =
10911082 let eab = align (dynamicUpdated da) (dynamicUpdated db)
10921083 ec = flip push eab $ \o -> do
@@ -1101,21 +1092,11 @@ zipDynWith f da db =
11011092 return $ Just $ Identity $ f a b
11021093 in dynamicDynIdentity $ unsafeDyn (f <$> readBehaviorUntracked (dynamicCurrent da) <*> readBehaviorUntracked (dynamicCurrent db)) ec
11031094
1104−instance Monad (Dynamic x Identity) where
1105− {-# INLINE return #-}
1106− return = pure
1107− {-# INLINE (>>=) #-}
1108− x >>= f = dynamicDynIdentity $ newJoinDyn $ newMapDyn f x
1109− {-# INLINE (>>) #-}
1110− _ >> y = y
1111− {-# INLINE fail #-}
1112− fail _ = error "Dynamic does not support 'fail'"
1113−
1114−unsafeDyn :: BehaviorM x a -> Event x (p a) -> Dyn x p a
1095+unsafeDyn :: BehaviorM x (R.PatchTarget p) -> Event x p -> Dyn x p
11151096unsafeDyn readV0 v' = Dyn $ unsafeNewIORef x $ Left x
11161097 where x = (readV0, v')
11171098
1118−newJoinDyn :: Dynamic x Identity (Dynamic x Identity a) -> Dyn x Identity a
1099+newJoinDyn :: Dynamic x (Identity (Dynamic x (Identity a))) -> Dyn x (Identity a)
11191100newJoinDyn d =
11201101 let readV0 = readBehaviorTracked . dynamicCurrent =<< readBehaviorTracked (dynamicCurrent d)
11211102 eOuter = push (fmap (Just . Identity) . readBehaviorUntracked . dynamicCurrent . runIdentity) $ dynamicUpdated d
@@ -1294,7 +1275,7 @@ listsToForest l = fmap (\(a, l') -> Node a $ listsToForest $ toList l') $ groupB
12941275#endif
12951276
12961277{-# INLINE propagateSubscriberHold #-}
1297−propagateSubscriberHold :: R.Patch p => Hold x p a -> p a -> EventM x ()
1278+propagateSubscriberHold :: R.Patch p => Hold x p -> p -> EventM x ()
12981279propagateSubscriberHold h a = do
12991280 {-# SCC "trace" #-} traceMWhen debugPropagate $ liftIO $ do
13001281 invalidators <- liftIO $ readIORef $ holdInvalidators h
@@ -1333,7 +1314,7 @@ askBehaviorHoldInits = do
13331314 return his
13341315
13351316{-# INLINE getDynHold #-}
1336−getDynHold :: (Defer (SomeHoldInit x) m, R.Patch p) => Dyn x p a -> m (Hold x p a)
1317+getDynHold :: (Defer (SomeHoldInit x) m, R.Patch p) => Dyn x p -> m (Hold x p)
13371318getDynHold d = do
13381319 mh <- liftIO $ readIORef $ unDyn d
13391320 case mh of
@@ -1690,7 +1671,7 @@ subscribeCoincidenceSubscribed :: CoincidenceSubscribed x a -> Subscriber x a ->
16901671subscribeCoincidenceSubscribed subscribed sub = WeakBag.insert sub (coincidenceSubscribedSubscribers subscribed) (coincidenceSubscribedWeakSelf subscribed) cleanupCoincidenceSubscribed
16911672
16921673{-# INLINE merge #-}
1693−merge :: GCompare k => Dynamic x R.PatchDMap (DMap k (Event x)) -> Event x (DMap k Identity)
1674+merge :: GCompare k => Dynamic x (R.PatchDMap k (Event x)) -> Event x (DMap k Identity)
16941675merge m = eventMerge $ Merge
16951676 { mergeParents = m
16961677 , mergeSubscribed = unsafeNewIORef m Nothing
@@ -1762,9 +1743,9 @@ runFrame a = SpiderHost $ ask >>= \spiderTimeline -> lift $ do
17621743 mergeUpdates <- readIORef mergeUpdateRef
17631744 writeIORef mergeUpdateRef []
17641745 let updateMerge :: SomeMergeUpdate x -> IO [SomeEventSubscription x]
1765− updateMerge (SomeMergeUpdate (R.PatchDMap p :: R.PatchDMap (DMap k (Event x))) m) = do
1746+ updateMerge (SomeMergeUpdate (R.PatchDMap p :: R.PatchDMap k (Event x)) m) = do
17661747 oldParents <- readIORef $ mergeSubscribedParents m
1767− let f (subscriptionsToKill, ps) (k :=> Compose me) = do
1748+ let f (subscriptionsToKill, ps) (k :=> R.ComposeMaybe me) = do
17681749 (mOldSubd, newPs) <- case me of
17691750 Nothing -> return $ DMap.updateLookupWithKey (\_ _ -> Nothing) k ps
17701751 Just e -> do
@@ -2009,11 +1990,30 @@ newtype SpiderPullM x a = SpiderPullM (BehaviorM x a) deriving (Functor, Applica
20091990
20101991newtype SpiderPushM x a = SpiderPushM (ComputeM x a) deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
20111992
1993+instance Functor (R.Dynamic (SpiderTimeline x)) where
1994+ fmap f = SpiderDynamic . newMapDyn f . unSpiderDynamic
1995+
1996+instance Applicative (R.Dynamic (SpiderTimeline x)) where
1997+ pure = SpiderDynamic . dynamicConst
1998+ SpiderDynamic a <*> SpiderDynamic b = SpiderDynamic $ zipDynWith ($) a b
1999+ _ *> b = b
2000+ a <* _ = a
2001+
2002+instance Monad (R.Dynamic (SpiderTimeline x)) where
2003+ {-# INLINE return #-}
2004+ return = pure
2005+ {-# INLINE (>>=) #-}
2006+ x >>= f = SpiderDynamic $ dynamicDynIdentity $ newJoinDyn $ newMapDyn (unSpiderDynamic . f) $ unSpiderDynamic x
2007+ {-# INLINE (>>) #-}
2008+ _ >> y = y
2009+ {-# INLINE fail #-}
2010+ fail _ = error "Dynamic does not support 'fail'"
2011+
20122012instance R.Reflex (SpiderTimeline x) where
20132013 newtype Behavior (SpiderTimeline x) a = SpiderBehavior { unSpiderBehavior :: Behavior x a }
20142014 newtype Event (SpiderTimeline x) a = SpiderEvent { unSpiderEvent :: Event x a }
2015− newtype Dynamic (SpiderTimeline x) a = SpiderDynamic { unSpiderDynamic :: Dynamic x Identity a } deriving (Functor, Applicative, Monad)
2016− newtype Incremental (SpiderTimeline x) p a = SpiderIncremental { unSpiderIncremental :: Dynamic x p a }
2015+ newtype Dynamic (SpiderTimeline x) a = SpiderDynamic { unSpiderDynamic :: Dynamic x (Identity a) } -- deriving (Functor, Applicative, Monad)
2016+ newtype Incremental (SpiderTimeline x) p = SpiderIncremental { unSpiderIncremental :: Dynamic x p }
20172017 type PullM (SpiderTimeline x) = SpiderPullM x
20182018 type PushM (SpiderTimeline x) = SpiderPushM x
20192019 {-# INLINABLE never #-}
@@ -2041,7 +2041,7 @@ instance R.Reflex (SpiderTimeline x) where
20412041 {-# INLINABLE unsafeBuildIncremental #-}
20422042 unsafeBuildIncremental readV0 dv = SpiderIncremental $ dynamicDyn $ unsafeDyn (coerce readV0) $ unSpiderEvent dv
20432043 {-# INLINABLE mergeIncremental #-}
2044− mergeIncremental = SpiderEvent . merge . (unsafeCoerce :: Dynamic x R.PatchDMap (DMap k (R.Event (SpiderTimeline x))) -> Dynamic x R.PatchDMap (DMap k (Event x))) . unSpiderIncremental
2044+ mergeIncremental = SpiderEvent . merge . (unsafeCoerce :: Dynamic x (R.PatchDMap k (R.Event (SpiderTimeline x))) -> Dynamic x (R.PatchDMap k (Event x))) . unSpiderIncremental
20452045 {-# INLINABLE currentIncremental #-}
20462046 currentIncremental = SpiderBehavior . dynamicCurrent . unSpiderIncremental
20472047 {-# INLINABLE updatedIncremental #-}
@@ -2050,6 +2050,9 @@ instance R.Reflex (SpiderTimeline x) where
20502050 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ dynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ dynamicCurrent i) $ flip push (dynamicUpdated i) $ \p -> do
20512051 c <- readBehaviorUntracked $ dynamicCurrent i
20522052 return $ Identity <$> R.apply p c --TODO: Avoid the redundant 'apply'
2053+ eventCoercion Coercion = Coercion
2054+ behaviorCoercion Coercion = Coercion
2055+ dynamicCoercion = unsafeCoerce --TODO: How can we avoid this unsafeCoerce? This is safe only because we know how Identity works as a Patch instance
20532056
20542057instance R.MonadSample (SpiderTimeline x) (EventM x) where
20552058 {-# INLINABLE sample #-}
@@ -2069,7 +2072,7 @@ holdSpiderEventM v0 e = fmap (SpiderBehavior . behaviorHoldIdentity) $ hold v0 $
20692072holdDynSpiderEventM :: a -> R.Event (SpiderTimeline x) a -> EventM x (R.Dynamic (SpiderTimeline x) a)
20702073holdDynSpiderEventM v0 e = fmap (SpiderDynamic . dynamicHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
20712074
2072−holdIncrementalSpiderEventM :: R.Patch p => a -> R.Event (SpiderTimeline x) (p a) -> EventM x (R.Incremental (SpiderTimeline x) p a)
2075+holdIncrementalSpiderEventM :: R.Patch p => R.PatchTarget p -> R.Event (SpiderTimeline x) p -> EventM x (R.Incremental (SpiderTimeline x) p)
20732076holdIncrementalSpiderEventM v0 e = fmap (SpiderIncremental . dynamicHold) $ hold v0 $ unSpiderEvent e
20742077
20752078instance R.MonadHold (SpiderTimeline x) (SpiderHost x) where