@@ -37,7 +37,6 @@ import Data.Dependent.Map (DMap, DSum (..))
37import qualified Data.Dependent.Map as DMap
37import qualified Data.Dependent.Map as DMap
38import Data.Foldable hiding (concat, elem, sequence_)
38import Data.Foldable hiding (concat, elem, sequence_)
39import Data.Function
39import Data.Function
40−import Data.Functor.Compose
41import Data.Functor.Constant
40import Data.Functor.Constant
42import Data.Functor.Product
41import Data.Functor.Product
43import Data.GADT.Compare
42import Data.GADT.Compare
@@ -51,6 +50,7 @@ import Data.Some (Some)
51import qualified Data.Some as Some
50import qualified Data.Some as Some
52import Data.These
51import Data.These
53import Data.Traversable
52import Data.Traversable
53+import Data.Type.Coercion
54import Data.Word
54import Data.Word
55import GHC.IORef (IORef (..))
55import GHC.IORef (IORef (..))
56import GHC.Stack
56import GHC.Stack
@@ -215,10 +215,10 @@ eventSwitch !s = Event $ wrap eventSubscribedSwitch $ getSwitchSubscribed s
215eventCoincidence :: Coincidence x a -> Event x a
215eventCoincidence :: Coincidence x a -> Event x a
216eventCoincidence !c = Event $ wrap eventSubscribedCoincidence $ getCoincidenceSubscribed c
216eventCoincidence !c = Event $ wrap eventSubscribedCoincidence $ getCoincidenceSubscribed c
218−eventHold :: a ~ p b => Hold x p b -> Event x a
218+eventHold :: Hold x p -> Event x p
219eventHold !h = Event $ subscribeHoldEvent h
219eventHold !h = Event $ subscribeHoldEvent h
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
222eventDyn !j = Event $ \sub -> getDynHold j >>= \h -> subscribeHoldEvent h sub
222eventDyn !j = Event $ \sub -> getDynHold j >>= \h -> subscribeHoldEvent h sub
224{-# INLINE subscribeCoincidenceInner #-}
224{-# INLINE subscribeCoincidenceInner #-}
@@ -272,7 +272,7 @@ newSubscriberPush compute subscribed = return $ Subscriber
272 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberPush" <> showNodeId subscribed <> " done"
272 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberPush" <> showNodeId subscribed <> " done"
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)
276newSubscriberHold h = return $ Subscriber
276newSubscriberHold h = return $ Subscriber
277 { subscriberPropagate = {-# SCC "traverseHold" #-} propagateSubscriberHold h
277 { subscriberPropagate = {-# SCC "traverseHold" #-} propagateSubscriberHold h
278 , subscriberInvalidateHeight = \_ -> return ()
278 , subscriberInvalidateHeight = \_ -> return ()
@@ -318,7 +318,7 @@ newSubscriberMerge k subscribed = return $ Subscriber
318 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberMerge" <> showNodeId subscribed <> " done"
318 when debugInvalidateHeight $ putStrLn $ "recalculateSubscriberHeight: SubscriberMerge" <> showNodeId subscribed <> " done"
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)))
322newSubscriberMergeChange subscribed = return $ Subscriber
322newSubscriberMergeChange subscribed = return $ Subscriber
323 { subscriberPropagate = \a -> {-# SCC "traverseMergeChange" #-} do
323 { subscriberPropagate = \a -> {-# SCC "traverseMergeChange" #-} do
324 tracePropagate $ "SubscriberMerge" <> showNodeId subscribed
324 tracePropagate $ "SubscriberMerge" <> showNodeId subscribed
@@ -555,7 +555,7 @@ walkInvalidHeightParents s0 = do
557{-# INLINE subscribeHoldEvent #-}
557{-# 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)
559subscribeHoldEvent = subscribeAndRead . holdEvent
559subscribeHoldEvent = subscribeAndRead . holdEvent
561--------------------------------------------------------------------------------
561--------------------------------------------------------------------------------
@@ -576,10 +576,10 @@ unsubscribe (EventSubscription msln _) = forM_ msln $ \sln -> WeakBag.remove sln
577newtype Behavior x a = Behavior { readBehaviorTracked :: BehaviorM x a }
577newtype Behavior x a = Behavior { readBehaviorTracked :: BehaviorM x a }
579−behaviorHold :: Hold x p a -> Behavior x a
579+behaviorHold :: Hold x p -> Behavior x (R.PatchTarget p)
580behaviorHold !h = Behavior $ readHoldTracked h
580behaviorHold !h = Behavior $ readHoldTracked h
582−behaviorHoldIdentity :: Hold x Identity a -> Behavior x a
582+behaviorHoldIdentity :: Hold x (Identity a) -> Behavior x a
583behaviorHoldIdentity = behaviorHold
583behaviorHoldIdentity = behaviorHold
585behaviorConst :: a -> Behavior x a
585behaviorConst :: a -> Behavior x a
@@ -612,11 +612,11 @@ behaviorPull !p = Behavior $ do
612 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
612 askParentsRef >>= mapM_ (\r -> liftIO $ modifyIORef' r (SomeBehaviorSubscribed (BehaviorSubscribedPull subscribed) :))
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)
616behaviorDyn !d = Behavior $ readHoldTracked =<< getDynHold d
616behaviorDyn !d = Behavior $ readHoldTracked =<< getDynHold d
618{-# INLINE readHoldTracked #-}
618{-# INLINE readHoldTracked #-}
619−readHoldTracked :: Hold x p a -> BehaviorM x a
619+readHoldTracked :: Hold x p -> BehaviorM x (R.PatchTarget p)
620readHoldTracked h = do
620readHoldTracked h = do
621 result <- liftIO $ readIORef $ holdValue h
621 result <- liftIO $ readIORef $ holdValue h
622 askInvalidator >>= mapM_ (\wi -> liftIO $ modifyIORef' (holdInvalidators h) (wi:))
622 askInvalidator >>= mapM_ (\wi -> liftIO $ modifyIORef' (holdInvalidators h) (wi:))
@@ -634,33 +634,33 @@ readBehaviorUntracked b = do
634-- Dynamic
634-- Dynamic
635--------------------------------------------------------------------------------
635--------------------------------------------------------------------------------
637−data Dynamic x p a = Dynamic
637+data Dynamic x p = Dynamic
638− { dynamicCurrent :: !(Behavior x a)
638+ { dynamicCurrent :: !(Behavior x (R.PatchTarget p))
639− , dynamicUpdated :: !(Event x (p a))
639+ , dynamicUpdated :: !(Event x p)
642−dynamicHold :: Hold x p a -> Dynamic x p a
642+dynamicHold :: Hold x p -> Dynamic x p
643dynamicHold !h = Dynamic
643dynamicHold !h = Dynamic
644 { dynamicCurrent = behaviorHold h
644 { dynamicCurrent = behaviorHold h
645 , dynamicUpdated = eventHold h
645 , dynamicUpdated = eventHold h
648−dynamicHoldIdentity :: Hold x Identity a -> Dynamic x Identity a
648+dynamicHoldIdentity :: Hold x (Identity a) -> Dynamic x (Identity a)
649dynamicHoldIdentity = dynamicHold
649dynamicHoldIdentity = dynamicHold
651−dynamicConst :: a -> Dynamic x p a
651+dynamicConst :: R.PatchTarget p -> Dynamic x p
652dynamicConst !a = Dynamic
652dynamicConst !a = Dynamic
653 { dynamicCurrent = behaviorConst a
653 { dynamicCurrent = behaviorConst a
654 , dynamicUpdated = eventNever
654 , dynamicUpdated = eventNever
657−dynamicDyn :: R.Patch p => Dyn x p a -> Dynamic x p a
657+dynamicDyn :: R.Patch p => Dyn x p -> Dynamic x p
658dynamicDyn !d = Dynamic
658dynamicDyn !d = Dynamic
659 { dynamicCurrent = behaviorDyn d
659 { dynamicCurrent = behaviorDyn d
660 , dynamicUpdated = eventDyn d
660 , dynamicUpdated = eventDyn d
663−dynamicDynIdentity :: Dyn x Identity a -> Dynamic x Identity a
663+dynamicDynIdentity :: Dyn x (Identity a) -> Dynamic x (Identity a)
664dynamicDynIdentity = dynamicDyn
664dynamicDynIdentity = dynamicDyn
666--------------------------------------------------------------------------------
666--------------------------------------------------------------------------------
@@ -671,11 +671,11 @@ dynamicDynIdentity = dynamicDyn
671--representational so we can use coerce
671--representational so we can use coerce
673--type role Hold representational
673--type role Hold representational
674−data Hold x p a
674+data Hold x p
675− = Hold { holdValue :: !(IORef a)
675+ = Hold { holdValue :: !(IORef (R.PatchTarget p))
676 , holdInvalidators :: !(IORef [Weak (Invalidator x)])
676 , holdInvalidators :: !(IORef [Weak (Invalidator x)])
677− , holdEvent :: Event x (p a) -- This must be lazy, or holds cannot be defined before their input Events
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 a)))) -- Keeps its parent alive (will be undefined until the hold is initialized) --TODO: Probably shouldn't be an IORef
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
679#ifdef DEBUG_NODEIDS
679#ifdef DEBUG_NODEIDS
680 , holdNodeId :: Int
680 , holdNodeId :: Int
@@ -779,9 +779,9 @@ instance Defer (SomeResetCoincidence x) (EventM x) where
779 getDeferralQueue = EventM $ asks eventEnvResetCoincidences
779 getDeferralQueue = EventM $ asks eventEnvResetCoincidences
781-- Note: hold cannot examine its event until after the phase is over
781-- 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) #-}
782+{-# SPECIALIZE hold :: R.Patch p => R.PatchTarget p -> Event x p -> EventM x (Hold x p) #-}
783−{-# SPECIALIZE hold :: R.Patch p => a -> Event x (p a) -> ComputeM x (Hold x p a) #-}
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) => a -> Event x (p a) -> m (Hold x p a)
784+hold :: (R.Patch p, Defer (SomeHoldInit x) m) => R.PatchTarget p -> Event x p -> m (Hold x p)
785hold v0 e = do
785hold v0 e = do
786 valRef <- liftIO $ newIORef v0
786 valRef <- liftIO $ newIORef v0
787 invsRef <- liftIO $ newIORef []
787 invsRef <- liftIO $ newIORef []
@@ -802,7 +802,7 @@ hold v0 e = do
804{-# INLINE getHoldEventSubscription #-}
804{-# 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)
806getHoldEventSubscription h = do
806getHoldEventSubscription h = do
807 ep <- liftIO $ readIORef $ holdParent h
807 ep <- liftIO $ readIORef $ holdParent h
808 case ep of
808 case ep of
@@ -843,7 +843,7 @@ instance Monad (BehaviorM x) where
843 fail s = BehaviorM $ fail s
843 fail s = BehaviorM $ fail s
845data BehaviorSubscribed x a
845data BehaviorSubscribed x a
846− = forall p. BehaviorSubscribedHold (Hold x p a)
846+ = forall p. BehaviorSubscribedHold (Hold x p)
847 | BehaviorSubscribedPull (PullSubscribed x a)
847 | BehaviorSubscribedPull (PullSubscribed x a)
849data SomeBehaviorSubscribed x = forall a. SomeBehaviorSubscribed (BehaviorSubscribed x a)
849data SomeBehaviorSubscribed x = forall a. SomeBehaviorSubscribed (BehaviorSubscribed x a)
@@ -887,11 +887,11 @@ data Root x (k :: * -> *)
887 , rootInit :: !(forall a. k a -> RootTrigger x a -> IO (IO ()))
887 , rootInit :: !(forall a. k a -> RootTrigger x a -> IO (IO ()))
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)
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)
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)))
896data SomeEventSubscription x = forall a. SomeEventSubscription (EventSubscription x a)
896data SomeEventSubscription x = forall a. SomeEventSubscription (EventSubscription x a)
@@ -980,7 +980,7 @@ data MergeSubscribed x k
980 , mergeSubscribedHeight :: !(IORef Height)
980 , mergeSubscribedHeight :: !(IORef Height)
981 , mergeSubscribedHeightBag :: !(IORef HeightBag)
981 , mergeSubscribedHeightBag :: !(IORef HeightBag)
982 , mergeSubscribedSubscribers :: !(WeakBag (Subscriber x (DMap k Identity)))
982 , 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))))
984 , mergeSubscribedParents :: !(IORef (DMap k (MergeSubscribedParent x k)))
984 , mergeSubscribedParents :: !(IORef (DMap k (MergeSubscribedParent x k)))
985 , mergeSubscribedWeakSelf :: !(IORef (Weak (MergeSubscribed x k)))
985 , mergeSubscribedWeakSelf :: !(IORef (Weak (MergeSubscribed x k)))
986#ifdef DEBUG_NODEIDS
986#ifdef DEBUG_NODEIDS
@@ -990,7 +990,7 @@ data MergeSubscribed x k
991--TODO: DMap sucks; we should really write something better (with a functor for the value as well as the key)
991--TODO: DMap sucks; we should really write something better (with a functor for the value as well as the key)
992data Merge x k
992data Merge x k
993− = Merge { mergeParents :: !(Dynamic x R.PatchDMap (DMap k (Event x)))
993+ = Merge { mergeParents :: !(Dynamic x (R.PatchDMap k (Event x)))
994 , mergeSubscribed :: !(IORef (Maybe (MergeSubscribed x k)))
994 , mergeSubscribed :: !(IORef (Maybe (MergeSubscribed x k)))
@@ -1071,22 +1071,13 @@ instance Align (Event x) where
1071 nil = eventNever
1071 nil = eventNever
1072 align ea eb = R.fmapMaybe R.dmapToThese $ merge $ dynamicConst $ DMap.fromList [R.LeftTag :=> ea, R.RightTag :=> eb]
1072 align ea eb = R.fmapMaybe R.dmapToThese $ merge $ dynamicConst $ DMap.fromList [R.LeftTag :=> ea, R.RightTag :=> eb]
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)) }
1076−newMapDyn :: (a -> b) -> Dynamic x Identity a -> Dynamic x Identity b
1076+newMapDyn :: (a -> b) -> Dynamic x (Identity a) -> Dynamic x (Identity b)
1077newMapDyn f d = dynamicDynIdentity $ unsafeDyn (fmap f $ readBehaviorTracked $ dynamicCurrent d) (Identity . f . runIdentity <$> dynamicUpdated d)
1077newMapDyn f d = dynamicDynIdentity $ unsafeDyn (fmap f $ readBehaviorTracked $ dynamicCurrent d) (Identity . f . runIdentity <$> dynamicUpdated d)
1079−instance Functor (Dynamic x Identity) where
1082−instance Applicative (Dynamic x Identity) where
1083− pure = dynamicConst
1084− (<*>) = zipDynWith ($)
1088--TODO: Avoid the duplication between this and R.zipDynWith
1079--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)
1090zipDynWith f da db =
1081zipDynWith f da db =
1091 let eab = align (dynamicUpdated da) (dynamicUpdated db)
1082 let eab = align (dynamicUpdated da) (dynamicUpdated db)
1092 ec = flip push eab $ \o -> do
1083 ec = flip push eab $ \o -> do
@@ -1101,21 +1092,11 @@ zipDynWith f da db =
1101 return $ Just $ Identity $ f a b
1092 return $ Just $ Identity $ f a b
1102 in dynamicDynIdentity $ unsafeDyn (f <$> readBehaviorUntracked (dynamicCurrent da) <*> readBehaviorUntracked (dynamicCurrent db)) ec
1093 in dynamicDynIdentity $ unsafeDyn (f <$> readBehaviorUntracked (dynamicCurrent da) <*> readBehaviorUntracked (dynamicCurrent db)) ec
1104−instance Monad (Dynamic x Identity) where
1105− {-# INLINE return #-}
1107− {-# INLINE (>>=) #-}
1108− x >>= f = dynamicDynIdentity $ newJoinDyn $ newMapDyn f x
1109− {-# INLINE (>>) #-}
1111− {-# INLINE fail #-}
1112− fail _ = error "Dynamic does not support 'fail'"
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
1115unsafeDyn readV0 v' = Dyn $ unsafeNewIORef x $ Left x
1096unsafeDyn readV0 v' = Dyn $ unsafeNewIORef x $ Left x
1116 where x = (readV0, v')
1097 where x = (readV0, v')
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)
1119newJoinDyn d =
1100newJoinDyn d =
1120 let readV0 = readBehaviorTracked . dynamicCurrent =<< readBehaviorTracked (dynamicCurrent d)
1101 let readV0 = readBehaviorTracked . dynamicCurrent =<< readBehaviorTracked (dynamicCurrent d)
1121 eOuter = push (fmap (Just . Identity) . readBehaviorUntracked . dynamicCurrent . runIdentity) $ dynamicUpdated d
1102 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
1296{-# INLINE propagateSubscriberHold #-}
1277{-# 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 ()
1298propagateSubscriberHold h a = do
1279propagateSubscriberHold h a = do
1299 {-# SCC "trace" #-} traceMWhen debugPropagate $ liftIO $ do
1280 {-# SCC "trace" #-} traceMWhen debugPropagate $ liftIO $ do
1300 invalidators <- liftIO $ readIORef $ holdInvalidators h
1281 invalidators <- liftIO $ readIORef $ holdInvalidators h
@@ -1333,7 +1314,7 @@ askBehaviorHoldInits = do
1333 return his
1314 return his
1335{-# INLINE getDynHold #-}
1316{-# 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)
1337getDynHold d = do
1318getDynHold d = do
1338 mh <- liftIO $ readIORef $ unDyn d
1319 mh <- liftIO $ readIORef $ unDyn d
1339 case mh of
1320 case mh of
@@ -1690,7 +1671,7 @@ subscribeCoincidenceSubscribed :: CoincidenceSubscribed x a -> Subscriber x a ->
1690subscribeCoincidenceSubscribed subscribed sub = WeakBag.insert sub (coincidenceSubscribedSubscribers subscribed) (coincidenceSubscribedWeakSelf subscribed) cleanupCoincidenceSubscribed
1671subscribeCoincidenceSubscribed subscribed sub = WeakBag.insert sub (coincidenceSubscribedSubscribers subscribed) (coincidenceSubscribedWeakSelf subscribed) cleanupCoincidenceSubscribed
1692{-# INLINE merge #-}
1673{-# 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)
1694merge m = eventMerge $ Merge
1675merge m = eventMerge $ Merge
1695 { mergeParents = m
1676 { mergeParents = m
1696 , mergeSubscribed = unsafeNewIORef m Nothing
1677 , mergeSubscribed = unsafeNewIORef m Nothing
@@ -1762,9 +1743,9 @@ runFrame a = SpiderHost $ ask >>= \spiderTimeline -> lift $ do
1762 mergeUpdates <- readIORef mergeUpdateRef
1743 mergeUpdates <- readIORef mergeUpdateRef
1763 writeIORef mergeUpdateRef []
1744 writeIORef mergeUpdateRef []
1764 let updateMerge :: SomeMergeUpdate x -> IO [SomeEventSubscription x]
1745 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
1766 oldParents <- readIORef $ mergeSubscribedParents m
1747 oldParents <- readIORef $ mergeSubscribedParents m
1767− let f (subscriptionsToKill, ps) (k :=> Compose me) = do
1748+ let f (subscriptionsToKill, ps) (k :=> R.ComposeMaybe me) = do
1768 (mOldSubd, newPs) <- case me of
1749 (mOldSubd, newPs) <- case me of
1769 Nothing -> return $ DMap.updateLookupWithKey (\_ _ -> Nothing) k ps
1750 Nothing -> return $ DMap.updateLookupWithKey (\_ _ -> Nothing) k ps
1770 Just e -> do
1751 Just e -> do
@@ -2009,11 +1990,30 @@ newtype SpiderPullM x a = SpiderPullM (BehaviorM x a) deriving (Functor, Applica
2010newtype SpiderPushM x a = SpiderPushM (ComputeM x a) deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
1991newtype SpiderPushM x a = SpiderPushM (ComputeM x a) deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
1993+instance Functor (R.Dynamic (SpiderTimeline x)) where
1994+ fmap f = SpiderDynamic . newMapDyn f . unSpiderDynamic
1996+instance Applicative (R.Dynamic (SpiderTimeline x)) where
1997+ pure = SpiderDynamic . dynamicConst
1998+ SpiderDynamic a <*> SpiderDynamic b = SpiderDynamic $ zipDynWith ($) a b
2002+instance Monad (R.Dynamic (SpiderTimeline x)) where
2003+ {-# INLINE return #-}
2005+ {-# INLINE (>>=) #-}
2006+ x >>= f = SpiderDynamic $ dynamicDynIdentity $ newJoinDyn $ newMapDyn (unSpiderDynamic . f) $ unSpiderDynamic x
2007+ {-# INLINE (>>) #-}
2009+ {-# INLINE fail #-}
2010+ fail _ = error "Dynamic does not support 'fail'"
2012instance R.Reflex (SpiderTimeline x) where
2012instance R.Reflex (SpiderTimeline x) where
2013 newtype Behavior (SpiderTimeline x) a = SpiderBehavior { unSpiderBehavior :: Behavior x a }
2013 newtype Behavior (SpiderTimeline x) a = SpiderBehavior { unSpiderBehavior :: Behavior x a }
2014 newtype Event (SpiderTimeline x) a = SpiderEvent { unSpiderEvent :: Event x a }
2014 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)
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 }
2016+ newtype Incremental (SpiderTimeline x) p = SpiderIncremental { unSpiderIncremental :: Dynamic x p }
2017 type PullM (SpiderTimeline x) = SpiderPullM x
2017 type PullM (SpiderTimeline x) = SpiderPullM x
2018 type PushM (SpiderTimeline x) = SpiderPushM x
2018 type PushM (SpiderTimeline x) = SpiderPushM x
2019 {-# INLINABLE never #-}
2019 {-# INLINABLE never #-}
@@ -2041,7 +2041,7 @@ instance R.Reflex (SpiderTimeline x) where
2041 {-# INLINABLE unsafeBuildIncremental #-}
2041 {-# INLINABLE unsafeBuildIncremental #-}
2042 unsafeBuildIncremental readV0 dv = SpiderIncremental $ dynamicDyn $ unsafeDyn (coerce readV0) $ unSpiderEvent dv
2042 unsafeBuildIncremental readV0 dv = SpiderIncremental $ dynamicDyn $ unsafeDyn (coerce readV0) $ unSpiderEvent dv
2043 {-# INLINABLE mergeIncremental #-}
2043 {-# 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
2045 {-# INLINABLE currentIncremental #-}
2045 {-# INLINABLE currentIncremental #-}
2046 currentIncremental = SpiderBehavior . dynamicCurrent . unSpiderIncremental
2046 currentIncremental = SpiderBehavior . dynamicCurrent . unSpiderIncremental
2047 {-# INLINABLE updatedIncremental #-}
2047 {-# INLINABLE updatedIncremental #-}
@@ -2050,6 +2050,9 @@ instance R.Reflex (SpiderTimeline x) where
2050 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ dynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ dynamicCurrent i) $ flip push (dynamicUpdated i) $ \p -> do
2050 incrementalToDynamic (SpiderIncremental i) = SpiderDynamic $ dynamicDynIdentity $ unsafeDyn (readBehaviorUntracked $ dynamicCurrent i) $ flip push (dynamicUpdated i) $ \p -> do
2051 c <- readBehaviorUntracked $ dynamicCurrent i
2051 c <- readBehaviorUntracked $ dynamicCurrent i
2052 return $ Identity <$> R.apply p c --TODO: Avoid the redundant 'apply'
2052 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
2054instance R.MonadSample (SpiderTimeline x) (EventM x) where
2057instance R.MonadSample (SpiderTimeline x) (EventM x) where
2055 {-# INLINABLE sample #-}
2058 {-# INLINABLE sample #-}
@@ -2069,7 +2072,7 @@ holdSpiderEventM v0 e = fmap (SpiderBehavior . behaviorHoldIdentity) $ hold v0 $
2069holdDynSpiderEventM :: a -> R.Event (SpiderTimeline x) a -> EventM x (R.Dynamic (SpiderTimeline x) a)
2072holdDynSpiderEventM :: a -> R.Event (SpiderTimeline x) a -> EventM x (R.Dynamic (SpiderTimeline x) a)
2070holdDynSpiderEventM v0 e = fmap (SpiderDynamic . dynamicHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
2073holdDynSpiderEventM v0 e = fmap (SpiderDynamic . dynamicHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
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)
2073holdIncrementalSpiderEventM v0 e = fmap (SpiderIncremental . dynamicHold) $ hold v0 $ unSpiderEvent e
2076holdIncrementalSpiderEventM v0 e = fmap (SpiderIncremental . dynamicHold) $ hold v0 $ unSpiderEvent e
2075instance R.MonadHold (SpiderTimeline x) (SpiderHost x) where
2078instance R.MonadHold (SpiderTimeline x) (SpiderHost x) where