@@ -20,16 +20,7 @@
2020{-# LANGUAGE UndecidableInstances #-}
2121-- | This module is the implementation of the 'Spider' 'Reflex' engine. It uses
2222-- a graph traversal algorithm to propagate 'Event's and 'Behavior's.
23−module Reflex.Spider.Internal
24− ( Spider
25− , SpiderEnv (..)
26− , Global
27− , SpiderHost
28− , runSpiderHost
29− , newSpiderEnv
30− , askSpiderEnv
31− , SpiderEventHandle
32− ) where
23+module Reflex.Spider.Internal where
3324
3425import Control.Applicative
3526import Control.Concurrent
@@ -691,7 +682,7 @@ data Hold x p a
691682 }
692683
693684data EventEnv x
694− = EventEnv { eventEnvSpiderEnv :: !(SpiderEnv x)
685+ = EventEnv { eventEnvSpiderTimeline :: !(SpiderTimeline x)
695686 , eventEnvAssignments :: !(IORef [SomeAssignment x]) -- Needed for Subscribe
696687 , eventEnvHoldInits :: !(IORef [SomeHoldInit x]) -- Needed for Subscribe
697688 , eventEnvMergeUpdates :: !(IORef [SomeMergeUpdate x])
@@ -750,17 +741,17 @@ instance HasCurrentHeight x (EventM x) where
750741 delayedRef <- asks eventEnvDelayedMerges
751742 liftIO $ modifyIORef' delayedRef $ IntMap.insertWith (++) (unHeight height) [DelayedMerge subscribed]
752743
753−class HasSpiderEnv x m | m -> x where
754− -- | Retrieve the current SpiderEnv
755− askSpiderEnv :: m (SpiderEnv x)
744+class HasSpiderTimeline x m | m -> x where
745+ -- | Retrieve the current SpiderTimeline
746+ askSpiderTimeline :: m (SpiderTimeline x)
756747
757−instance HasSpiderEnv x (EventM x) where
758− {-# INLINE askSpiderEnv #-}
759− askSpiderEnv = EventM $ asks eventEnvSpiderEnv
748+instance HasSpiderTimeline x (EventM x) where
749+ {-# INLINE askSpiderTimeline #-}
750+ askSpiderTimeline = EventM $ asks eventEnvSpiderTimeline
760751
761−instance HasSpiderEnv x (SpiderHost x) where
762− {-# INLINE askSpiderEnv #-}
763− askSpiderEnv = SpiderHost ask
752+instance HasSpiderTimeline x (SpiderHost x) where
753+ {-# INLINE askSpiderTimeline #-}
754+ askSpiderTimeline = SpiderHost ask
764755
765756putCurrentHeight :: Height -> EventM x ()
766757putCurrentHeight h = EventM $ do
@@ -811,7 +802,7 @@ hold v0 e = do
811802 return h
812803
813804{-# INLINE getHoldEventSubscription #-}
814−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, HasSpiderEnv x m, m ~ EventM x) => Hold x p a -> m (EventSubscription x (p a))
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))
815806getHoldEventSubscription h = do
816807 ep <- liftIO $ readIORef $ holdParent h
817808 case ep of
@@ -1182,8 +1173,8 @@ coincidence a = eventCoincidence $ Coincidence
11821173run :: [DSum (RootTrigger x) Identity] -> ResultM x b -> SpiderHost x b
11831174run roots after = do
11841175 tracePropagate $ "Running an event frame with " <> show (length roots) <> " events"
1185− spiderEnv <- SpiderHost ask
1186− result <- SpiderHost $ lift $ withMVar (_spiderEnv_lock spiderEnv) $ \_ -> flip runReaderT spiderEnv $ unSpiderHost $ runFrame $ do
1176+ spiderTimeline <- SpiderHost ask
1177+ result <- SpiderHost $ lift $ withMVar (_spiderTimeline_lock spiderTimeline) $ \_ -> flip runReaderT spiderTimeline $ unSpiderHost $ runFrame $ do
11871178 rootsToPropagate <- forM roots $ \r@(RootTrigger (_, occRef, k) :=> a) -> do
11881179 occBefore <- liftIO $ do
11891180 occBefore <- readIORef occRef
@@ -1249,17 +1240,17 @@ type WeakList a = [Weak a]
12491240#ifdef DEBUG
12501241withIncreasedDepth :: CanTrace x m => m a -> m a
12511242withIncreasedDepth a = do
1252− spiderEnv <- askSpiderEnv
1253− liftIO $ modifyIORef' (_spiderEnv_depth spiderEnv) succ
1243+ spiderTimeline <- askSpiderTimeline
1244+ liftIO $ modifyIORef' (_spiderTimeline_depth spiderTimeline) succ
12541245 result <- a
1255− liftIO $ modifyIORef' (_spiderEnv_depth spiderEnv) pred
1246+ liftIO $ modifyIORef' (_spiderTimeline_depth spiderTimeline) pred
12561247 return result
12571248#else
12581249withIncreasedDepth :: m a -> m a
12591250withIncreasedDepth = id
12601251#endif
12611252
1262−type CanTrace x m = (HasSpiderEnv x m, MonadIO m)
1253+type CanTrace x m = (HasSpiderTimeline x m, MonadIO m)
12631254
12641255{-# INLINE tracePropagate #-}
12651256tracePropagate :: (CanTrace x m) => String -> m ()
@@ -1278,8 +1269,8 @@ traceMWhen :: (CanTrace x m) => Bool -> m String -> m ()
12781269traceMWhen b getMessage = when b $ do
12791270 message <- getMessage
12801271#ifdef DEBUG
1281− spiderEnv <- askSpiderEnv
1282− d <- liftIO $ readIORef $ _spiderEnv_depth spiderEnv
1272+ spiderTimeline <- askSpiderTimeline
1273+ d <- liftIO $ readIORef $ _spiderTimeline_depth spiderTimeline
12831274#else
12841275 let d = 0
12851276#endif
@@ -1360,7 +1351,7 @@ zeroRef :: IORef Height
13601351zeroRef = unsafePerformIO $ newIORef zeroHeight
13611352
13621353type CanSubscribe x m =
1363− ( HasSpiderEnv x m
1354+ ( HasSpiderTimeline x m
13641355 , HasCurrentHeight x m
13651356 , Defer (SomeHoldInit x) m, Defer (SomeMergeInit x) m -- The things we need to lazily initialize state
13661357 , Defer SomeClear m -- Wiping out event firings
@@ -1530,7 +1521,7 @@ subscribeMergeSubscribed :: MergeSubscribed x k -> Subscriber x (DMap k Identity
15301521subscribeMergeSubscribed subscribed sub = WeakBag.insert sub (mergeSubscribedSubscribers subscribed) (mergeSubscribedWeakSelf subscribed) cleanupMergeSubscribed
15311522
15321523{-# SPECIALIZE getFanSubscribed :: GCompare k => k a -> Fan x k -> Subscriber x a -> EventM x (WeakBagTicket (Subscriber x a), FanSubscribed x k, Maybe a) #-}
1533−getFanSubscribed :: (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, HasCurrentHeight x m, Defer (SomeResetCoincidence x) m, HasSpiderEnv x m, m ~ EventM x, GCompare k) => k a -> Fan x k -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), FanSubscribed x k, Maybe a)
1524+getFanSubscribed :: (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, HasCurrentHeight x m, Defer (SomeResetCoincidence x) m, HasSpiderTimeline x m, m ~ EventM x, GCompare k) => k a -> Fan x k -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), FanSubscribed x k, Maybe a)
15341525getFanSubscribed k f sub = do
15351526 mSubscribed <- liftIO $ readIORef $ fanSubscribed f
15361527 case mSubscribed of
@@ -1589,7 +1580,7 @@ subscribeFanSubscribed k subscribed sub = do
15891580 Just (FanSubscribedChildren list _ weakSelf) -> {-# SCC "hitSubscribeFanSubscribed" #-} WeakBag.insert sub list weakSelf cleanupFanSubscribed
15901581
15911582{-# SPECIALIZE getSwitchSubscribed :: Switch x a -> Subscriber x a -> EventM x (WeakBagTicket (Subscriber x a), SwitchSubscribed x a, Maybe a) #-}
1592−getSwitchSubscribed :: (Defer (SomeHoldInit x) m, Defer (SomeAssignment x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, Defer (SomeResetCoincidence x) m, HasCurrentHeight x m, HasSpiderEnv x m, m ~ EventM x) => Switch x a -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), SwitchSubscribed x a, Maybe a)
1583+getSwitchSubscribed :: (Defer (SomeHoldInit x) m, Defer (SomeAssignment x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, Defer (SomeResetCoincidence x) m, HasCurrentHeight x m, HasSpiderTimeline x m, m ~ EventM x) => Switch x a -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), SwitchSubscribed x a, Maybe a)
15931584getSwitchSubscribed s sub = do
15941585 mSubscribed <- liftIO $ readIORef $ switchSubscribed s
15951586 case mSubscribed of
@@ -1645,7 +1636,7 @@ subscribeSwitchSubscribed :: SwitchSubscribed x a -> Subscriber x a -> IO (WeakB
16451636subscribeSwitchSubscribed subscribed sub = WeakBag.insert sub (switchSubscribedSubscribers subscribed) (switchSubscribedWeakSelf subscribed) cleanupSwitchSubscribed
16461637
16471638{-# SPECIALIZE getCoincidenceSubscribed :: Coincidence x a -> Subscriber x a -> EventM x (WeakBagTicket (Subscriber x a), CoincidenceSubscribed x a, Maybe a) #-}
1648−getCoincidenceSubscribed :: forall x a m. (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, HasCurrentHeight x m, Defer (SomeResetCoincidence x) m, HasSpiderEnv x m, m ~ EventM x) => Coincidence x a -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), CoincidenceSubscribed x a, Maybe a)
1639+getCoincidenceSubscribed :: forall x a m. (Defer (SomeAssignment x) m, Defer (SomeHoldInit x) m, Defer (SomeMergeInit x) m, Defer SomeClear m, HasCurrentHeight x m, Defer (SomeResetCoincidence x) m, HasSpiderTimeline x m, m ~ EventM x) => Coincidence x a -> Subscriber x a -> m (WeakBagTicket (Subscriber x a), CoincidenceSubscribed x a, Maybe a)
16491640getCoincidenceSubscribed c sub = do
16501641 mSubscribed <- liftIO $ readIORef $ coincidenceSubscribed c
16511642 case mSubscribed of
@@ -1738,9 +1729,9 @@ initMerge (SomeMergeInit subscribed changed) = do
17381729
17391730-- | Run an event action outside of a frame
17401731runFrame :: forall x a. EventM x a -> SpiderHost x a --TODO: This function also needs to hold the mutex
1741−runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
1732+runFrame a = SpiderHost $ ask >>= \spiderTimeline -> lift $ do
17421733 -- Clear out pending unsubscriptions; these will need to happen eventually anyway, and might cause us a lot of extra work during the frame, so get rid of them now
1743− pendingCleanups <- atomicModifyIORef (_spiderEnv_cleanups spiderEnv) $ \x -> ([], x)
1734+ pendingCleanups <- atomicModifyIORef (_spiderTimeline_cleanups spiderTimeline) $ \x -> ([], x)
17441735 {-# SCC "cleanups" #-} sequence_ pendingCleanups
17451736 toAssignRef <- newIORef [] -- This should only actually get used when events are firing
17461737 holdInitRef <- newIORef []
@@ -1751,7 +1742,7 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
17511742 toClearRootRef <- newIORef []
17521743 coincidenceInfosRef <- newIORef []
17531744 delayedRef <- liftIO $ newIORef IntMap.empty
1754− let env = EventEnv spiderEnv toAssignRef holdInitRef mergeUpdateRef mergeInitRef toClearRef toClearRootRef heightRef coincidenceInfosRef delayedRef
1745+ let env = EventEnv spiderTimeline toAssignRef holdInitRef mergeUpdateRef mergeInitRef toClearRef toClearRootRef heightRef coincidenceInfosRef delayedRef
17551746 let go = do
17561747 result <- a
17571748 runHoldInits holdInitRef mergeInitRef -- This must happen before doing the assignments, in case subscribing a Hold causes existing Holds to be read by the newly-propagated events
@@ -1808,7 +1799,7 @@ runFrame a = SpiderHost $ ask >>= \spiderEnv -> lift $ do
18081799 runEventM (runHoldInits holdInitRef mergeInitRef) env --TODO: Is this actually OK? It seems like it should be, since we know that no events are firing at this point, but it still seems inelegant
18091800 --TODO: Make sure we touch the pieces of the SwitchSubscribed at the appropriate times
18101801 sub <- newSubscriberSwitch subscribed
1811− subscription <- runReaderT (unSpiderHost (runFrame ({-# SCC "subscribeSwitch" #-} subscribe e sub))) spiderEnv --TODO: Assert that the event isn't firing --TODO: This should not loop because none of the events should be firing, but still, it is inefficient
1802+ subscription <- runReaderT (unSpiderHost (runFrame ({-# SCC "subscribeSwitch" #-} subscribe e sub))) spiderTimeline --TODO: Assert that the event isn't firing --TODO: This should not loop because none of the events should be firing, but still, it is inefficient
18121803 {-
18131804 stackTrace <- liftIO $ fmap renderStack $ ccsToStrings =<< (getCCSOf $! switchSubscribedParent subscribed)
18141805 liftIO $ putStrLn $ (++stackTrace) $ "subd' subscribed to " ++ case e of
@@ -1963,64 +1954,68 @@ invalidate toReconnectRef wis = do
19631954--------------------------------------------------------------------------------
19641955
19651956-- | The default, global Spider environment
1966−type Spider = SpiderEnv Global
1957+type Spider = SpiderTimeline Global
19671958
19681959-- | Designates the default, global Spider timeline
19691960data Global
19701961
1971−{-# NOINLINE globalSpiderEnv #-}
1972−globalSpiderEnv :: SpiderEnv Global
1973−globalSpiderEnv = unsafePerformIO unsafeNewSpiderEnv
1962+{-# NOINLINE globalSpiderTimeline #-}
1963+globalSpiderTimeline :: SpiderTimeline Global
1964+globalSpiderTimeline = unsafePerformIO unsafeNewSpiderTimeline
19741965
19751966-- | Stores all global data relevant to a particular Spider timeline; only one
19761967-- value should exist for each type @x@
1977−data SpiderEnv x = SpiderEnv
1978− { _spiderEnv_toUnsubscribe :: !(IORef [SomeEventSubscription x])
1979− , _spiderEnv_lock :: !(MVar ())
1980− , _spiderEnv_cleanups :: !(IORef [IO ()])
1968+data SpiderTimeline x = SpiderTimeline
1969+ { _spiderTimeline_toUnsubscribe :: !(IORef [SomeEventSubscription x])
1970+ , _spiderTimeline_lock :: !(MVar ())
1971+ , _spiderTimeline_cleanups :: !(IORef [IO ()])
19811972#ifdef DEBUG
1982− , _spiderEnv_depth :: !(IORef Int)
1973+ , _spiderTimeline_depth :: !(IORef Int)
19831974#endif
19841975 }
1985−type role SpiderEnv nominal
1976+type role SpiderTimeline nominal
19861977
1987−instance GEq SpiderEnv where
1988− a `geq` b = if _spiderEnv_lock a == _spiderEnv_lock b
1989− then Just $ unsafeCoerce Refl -- This unsafeCoerce is safe because the same SpiderEnv can't have two different 'x' arguments
1978+instance GEq SpiderTimeline where
1979+ a `geq` b = if _spiderTimeline_lock a == _spiderTimeline_lock b
1980+ then Just $ unsafeCoerce Refl -- This unsafeCoerce is safe because the same SpiderTimeline can't have two different 'x' arguments
19901981 else Nothing
19911982
1992−unsafeNewSpiderEnv :: forall x. IO (SpiderEnv x)
1993−unsafeNewSpiderEnv = do
1983+unsafeNewSpiderTimeline :: forall x. IO (SpiderTimeline x)
1984+unsafeNewSpiderTimeline = do
19941985 toUnsubscribe <- newIORef []
19951986 lock <- newMVar ()
19961987 cleanups <- newIORef []
19971988#ifdef DEBUG
19981989 depthRef <- newIORef 0
19991990#endif
2000− return $ SpiderEnv
2001− { _spiderEnv_toUnsubscribe = toUnsubscribe
2002− , _spiderEnv_lock = lock
2003− , _spiderEnv_cleanups = cleanups
1991+ return $ SpiderTimeline
1992+ { _spiderTimeline_toUnsubscribe = toUnsubscribe
1993+ , _spiderTimeline_lock = lock
1994+ , _spiderTimeline_cleanups = cleanups
20041995#ifdef DEBUG
2005− , _spiderEnv_depth = depthRef
1996+ , _spiderTimeline_depth = depthRef
20061997#endif
20071998 }
20081999
2009−-- | Create a new SpiderEnv
2010−newSpiderEnv :: IO (Some SpiderEnv)
2011−newSpiderEnv = Some.This <$> unsafeNewSpiderEnv
2000+-- | Create a new SpiderTimeline
2001+newSpiderTimeline :: IO (Some SpiderTimeline)
2002+newSpiderTimeline = withSpiderTimeline (pure . Some.This)
2003+
2004+-- | Pass a new timeline to the given function.
2005+withSpiderTimeline :: (forall x. SpiderTimeline x -> IO r) -> IO r
2006+withSpiderTimeline k = unsafeNewSpiderTimeline >>= k
20122007
20132008newtype SpiderPullM x a = SpiderPullM (BehaviorM x a) deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
20142009
20152010newtype SpiderPushM x a = SpiderPushM (ComputeM x a) deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
20162011
2017−instance R.Reflex (SpiderEnv x) where
2018− newtype Behavior (SpiderEnv x) a = SpiderBehavior { unSpiderBehavior :: Behavior x a }
2019− newtype Event (SpiderEnv x) a = SpiderEvent { unSpiderEvent :: Event x a }
2020− newtype Dynamic (SpiderEnv x) a = SpiderDynamic { unSpiderDynamic :: Dynamic x Identity a } deriving (Functor, Applicative, Monad)
2021− newtype Incremental (SpiderEnv x) p a = SpiderIncremental { unSpiderIncremental :: Dynamic x p a }
2022− type PullM (SpiderEnv x) = SpiderPullM x
2023− type PushM (SpiderEnv x) = SpiderPushM x
2012+instance R.Reflex (SpiderTimeline x) where
2013+ newtype Behavior (SpiderTimeline x) a = SpiderBehavior { unSpiderBehavior :: Behavior 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)
2016+ newtype Incremental (SpiderTimeline x) p a = SpiderIncremental { unSpiderIncremental :: Dynamic x p a }
2017+ type PullM (SpiderTimeline x) = SpiderPullM x
2018+ type PushM (SpiderTimeline x) = SpiderPushM x
20242019 {-# INLINABLE never #-}
20252020 never = SpiderEvent eventNever
20262021 {-# INLINABLE constant #-}
@@ -2030,13 +2025,13 @@ instance R.Reflex (SpiderEnv x) where
20302025 {-# INLINABLE pull #-}
20312026 pull = SpiderBehavior . pull . coerce
20322027 {-# INLINABLE merge #-}
2033− merge = SpiderEvent . merge . dynamicConst . (coerce :: DMap k (R.Event (SpiderEnv x)) -> DMap k (Event x))
2028+ merge = SpiderEvent . merge . dynamicConst . (coerce :: DMap k (R.Event (SpiderTimeline x)) -> DMap k (Event x))
20342029 {-# INLINABLE fan #-}
20352030 fan e = R.EventSelector $ SpiderEvent . select (fan (unSpiderEvent e))
20362031 {-# INLINABLE switch #-}
2037− switch = SpiderEvent . switch . (coerce :: Behavior x (R.Event (SpiderEnv x) a) -> Behavior x (Event x a)) . unSpiderBehavior
2032+ switch = SpiderEvent . switch . (coerce :: Behavior x (R.Event (SpiderTimeline x) a) -> Behavior x (Event x a)) . unSpiderBehavior
20382033 {-# INLINABLE coincidence #-}
2039− coincidence = SpiderEvent . coincidence . (coerce :: Event x (R.Event (SpiderEnv x) a) -> Event x (Event x a)) . unSpiderEvent
2034+ coincidence = SpiderEvent . coincidence . (coerce :: Event x (R.Event (SpiderTimeline x) a) -> Event x (Event x a)) . unSpiderEvent
20402035 {-# INLINABLE current #-}
20412036 current = SpiderBehavior . dynamicCurrent . unSpiderDynamic
20422037 {-# INLINABLE updated #-}
@@ -2046,7 +2041,7 @@ instance R.Reflex (SpiderEnv x) where
20462041 {-# INLINABLE unsafeBuildIncremental #-}
20472042 unsafeBuildIncremental readV0 dv = SpiderIncremental $ dynamicDyn $ unsafeDyn (coerce readV0) $ unSpiderEvent dv
20482043 {-# INLINABLE mergeIncremental #-}
2049− mergeIncremental = SpiderEvent . merge . (unsafeCoerce :: Dynamic x R.PatchDMap (DMap k (R.Event (SpiderEnv x))) -> Dynamic x R.PatchDMap (DMap k (Event x))) . unSpiderIncremental
2044+ mergeIncremental = SpiderEvent . merge . (unsafeCoerce :: Dynamic x R.PatchDMap (DMap k (R.Event (SpiderTimeline x))) -> Dynamic x R.PatchDMap (DMap k (Event x))) . unSpiderIncremental
20502045 {-# INLINABLE currentIncremental #-}
20512046 currentIncremental = SpiderBehavior . dynamicCurrent . unSpiderIncremental
20522047 {-# INLINABLE updatedIncremental #-}
@@ -2056,11 +2051,11 @@ instance R.Reflex (SpiderEnv x) where
20562051 c <- readBehaviorUntracked $ dynamicCurrent i
20572052 return $ Identity <$> R.apply p c --TODO: Avoid the redundant 'apply'
20582053
2059−instance R.MonadSample (SpiderEnv x) (EventM x) where
2054+instance R.MonadSample (SpiderTimeline x) (EventM x) where
20602055 {-# INLINABLE sample #-}
20612056 sample (SpiderBehavior b) = readBehaviorUntracked b
20622057
2063−instance R.MonadHold (SpiderEnv x) (EventM x) where
2058+instance R.MonadHold (SpiderTimeline x) (EventM x) where
20642059 {-# INLINABLE hold #-}
20652060 hold = holdSpiderEventM
20662061 {-# INLINABLE holdDyn #-}
@@ -2068,16 +2063,16 @@ instance R.MonadHold (SpiderEnv x) (EventM x) where
20682063 {-# INLINABLE holdIncremental #-}
20692064 holdIncremental = holdIncrementalSpiderEventM
20702065
2071−holdSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Behavior (SpiderEnv x) a)
2066+holdSpiderEventM :: a -> R.Event (SpiderTimeline x) a -> EventM x (R.Behavior (SpiderTimeline x) a)
20722067holdSpiderEventM v0 e = fmap (SpiderBehavior . behaviorHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
20732068
2074−holdDynSpiderEventM :: a -> R.Event (SpiderEnv x) a -> EventM x (R.Dynamic (SpiderEnv x) a)
2069+holdDynSpiderEventM :: a -> R.Event (SpiderTimeline x) a -> EventM x (R.Dynamic (SpiderTimeline x) a)
20752070holdDynSpiderEventM v0 e = fmap (SpiderDynamic . dynamicHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
20762071
2077−holdIncrementalSpiderEventM :: R.Patch p => a -> R.Event (SpiderEnv x) (p a) -> EventM x (R.Incremental (SpiderEnv x) p a)
2072+holdIncrementalSpiderEventM :: R.Patch p => a -> R.Event (SpiderTimeline x) (p a) -> EventM x (R.Incremental (SpiderTimeline x) p a)
20782073holdIncrementalSpiderEventM v0 e = fmap (SpiderIncremental . dynamicHold) $ hold v0 $ unSpiderEvent e
20792074
2080−instance R.MonadHold (SpiderEnv x) (SpiderHost x) where
2075+instance R.MonadHold (SpiderTimeline x) (SpiderHost x) where
20812076 {-# INLINABLE hold #-}
20822077 hold v0 e = R.runHostFrame $ R.hold v0 e
20832078 {-# INLINABLE holdDyn #-}
@@ -2085,19 +2080,19 @@ instance R.MonadHold (SpiderEnv x) (SpiderHost x) where
20852080 {-# INLINABLE holdIncremental #-}
20862081 holdIncremental v0 e = R.runHostFrame $ R.holdIncremental v0 e
20872082
2088−instance R.MonadSample (SpiderEnv x) (SpiderHost x) where
2083+instance R.MonadSample (SpiderTimeline x) (SpiderHost x) where
20892084 {-# INLINABLE sample #-}
20902085 sample = runFrame . readBehaviorUntracked . unSpiderBehavior
20912086
2092−instance R.MonadSample (SpiderEnv x) (SpiderPullM x) where
2087+instance R.MonadSample (SpiderTimeline x) (SpiderPullM x) where
20932088 {-# INLINABLE sample #-}
20942089 sample = coerce . readBehaviorTracked . unSpiderBehavior
20952090
2096−instance R.MonadSample (SpiderEnv x) (SpiderPushM x) where
2091+instance R.MonadSample (SpiderTimeline x) (SpiderPushM x) where
20972092 {-# INLINABLE sample #-}
20982093 sample (SpiderBehavior b) = SpiderPushM $ readBehaviorUntracked b
20992094
2100−instance R.MonadHold (SpiderEnv x) (SpiderPushM x) where
2095+instance R.MonadHold (SpiderTimeline x) (SpiderPushM x) where
21012096 {-# INLINABLE hold #-}
21022097 hold v0 e = R.current <$> R.holdDyn v0 e
21032098 {-# INLINABLE holdDyn #-}
@@ -2112,7 +2107,7 @@ data SpiderEventHandle x a = SpiderEventHandle
21122107 , spiderEventHandleValue :: IORef (Maybe a)
21132108 }
21142109
2115−instance R.MonadSubscribeEvent (SpiderEnv x) (SpiderHostFrame x) where
2110+instance R.MonadSubscribeEvent (SpiderTimeline x) (SpiderHostFrame x) where
21162111 {-# INLINABLE subscribeEvent #-}
21172112 subscribeEvent e = SpiderHostFrame $ do
21182113 --TODO: Unsubscribe eventually (manually and/or with weak ref)
@@ -2129,12 +2124,12 @@ instance R.MonadSubscribeEvent (SpiderEnv x) (SpiderHostFrame x) where
21292124 , spiderEventHandleValue = val
21302125 }
21312126
2132−instance R.ReflexHost (SpiderEnv x) where
2133− type EventTrigger (SpiderEnv x) = RootTrigger x
2134− type EventHandle (SpiderEnv x) = SpiderEventHandle x
2135− type HostFrame (SpiderEnv x) = SpiderHostFrame x
2127+instance R.ReflexHost (SpiderTimeline x) where
2128+ type EventTrigger (SpiderTimeline x) = RootTrigger x
2129+ type EventHandle (SpiderTimeline x) = SpiderEventHandle x
2130+ type HostFrame (SpiderTimeline x) = SpiderHostFrame x
21362131
2137−instance R.MonadReadEvent (SpiderEnv x) (ReadPhase x) where
2132+instance R.MonadReadEvent (SpiderTimeline x) (ReadPhase x) where
21382133 {-# NOINLINE readEvent #-}
21392134 readEvent h = ReadPhase $ fmap (fmap return) $ liftIO $ do
21402135 result <- readIORef $ spiderEventHandleValue h
@@ -2155,7 +2150,7 @@ instance MonadAtomicRef (EventM x) where
21552150 atomicModifyRef r f = liftIO $ atomicModifyRef r f
21562151
21572152-- | The monad for actions that manipulate a Spider timeline identified by @x@
2158−newtype SpiderHost x a = SpiderHost { unSpiderHost :: ReaderT (SpiderEnv x) IO a } deriving (Functor, Applicative, MonadFix, MonadIO, MonadException, MonadAsyncException)
2153+newtype SpiderHost x a = SpiderHost { unSpiderHost :: ReaderT (SpiderTimeline x) IO a } deriving (Functor, Applicative, MonadFix, MonadIO, MonadException, MonadAsyncException)
21592154
21602155instance Monad (SpiderHost x) where
21612156 {-# INLINABLE (>>=) #-}
@@ -2170,7 +2165,12 @@ instance Monad (SpiderHost x) where
21702165-- | Run an action affecting the global Spider timeline; this will be guarded by
21712166-- a mutex for that timeline
21722167runSpiderHost :: SpiderHost Global a -> IO a
2173−runSpiderHost (SpiderHost a) = runReaderT a globalSpiderEnv
2168+runSpiderHost (SpiderHost a) = runReaderT a globalSpiderTimeline
2169+
2170+-- | Run an action affecting a given Spider timeline; this will be guarded by a
2171+-- mutex for that timeline
2172+runSpiderHostForTimeline :: SpiderHost x a -> SpiderTimeline x -> IO a
2173+runSpiderHostForTimeline (SpiderHost a) = runReaderT a
21742174
21752175newtype SpiderHostFrame x a = SpiderHostFrame { runSpiderHostFrame :: EventM x a } deriving (Functor, Applicative, MonadFix, MonadIO, MonadException, MonadAsyncException)
21762176
@@ -2184,10 +2184,10 @@ instance Monad (SpiderHostFrame x) where
21842184 {-# INLINABLE fail #-}
21852185 fail s = SpiderHostFrame $ fail s
21862186
2187−instance R.MonadSample (SpiderEnv x) (SpiderHostFrame x) where
2187+instance R.MonadSample (SpiderTimeline x) (SpiderHostFrame x) where
21882188 sample = SpiderHostFrame . readBehaviorUntracked . unSpiderBehavior --TODO: This can cause problems with laziness, so we should get rid of it if we can
21892189
2190−instance R.MonadHold (SpiderEnv x) (SpiderHostFrame x) where
2190+instance R.MonadHold (SpiderTimeline x) (SpiderHostFrame x) where
21912191 {-# INLINABLE hold #-}
21922192 hold v0 e = SpiderHostFrame $ fmap (SpiderBehavior . behaviorHoldIdentity) $ hold v0 $ coerce $ unSpiderEvent e
21932193 {-# INLINABLE holdDyn #-}
@@ -2211,29 +2211,29 @@ newFanEventWithTriggerIO f = do
22112211 }
22122212 return $ EventSelector $ \k -> eventRoot k r
22132213
2214−instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHost x) where
2214+instance R.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHost x) where
22152215 newEventWithTrigger = SpiderHost . lift . fmap SpiderEvent . newEventWithTriggerIO
22162216 newFanEventWithTrigger f = SpiderHost $ lift $ do
22172217 es <- newFanEventWithTriggerIO f
22182218 return $ R.EventSelector $ SpiderEvent . select es
22192219
2220−instance R.MonadReflexCreateTrigger (SpiderEnv x) (SpiderHostFrame x) where
2220+instance R.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHostFrame x) where
22212221 newEventWithTrigger = SpiderHostFrame . EventM . liftIO . fmap SpiderEvent . newEventWithTriggerIO
22222222 newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do
22232223 es <- newFanEventWithTriggerIO f
22242224 return $ R.EventSelector $ SpiderEvent . select es
22252225
2226−instance R.MonadSubscribeEvent (SpiderEnv x) (SpiderHost x) where
2226+instance R.MonadSubscribeEvent (SpiderTimeline x) (SpiderHost x) where
22272227 {-# INLINABLE subscribeEvent #-}
22282228 subscribeEvent = runFrame . runSpiderHostFrame . R.subscribeEvent
22292229
22302230newtype ReadPhase x a = ReadPhase (ResultM x a) deriving (Functor, Applicative, Monad, MonadFix)
22312231
2232−instance R.MonadSample (SpiderEnv x) (ReadPhase x) where
2232+instance R.MonadSample (SpiderTimeline x) (ReadPhase x) where
22332233 {-# INLINABLE sample #-}
22342234 sample = ReadPhase . R.sample
22352235
2236−instance R.MonadHold (SpiderEnv x) (ReadPhase x) where
2236+instance R.MonadHold (SpiderTimeline x) (ReadPhase x) where
22372237 {-# INLINABLE hold #-}
22382238 hold v0 e = ReadPhase $ R.hold v0 e
22392239 {-# INLINABLE holdDyn #-}
@@ -2241,7 +2241,7 @@ instance R.MonadHold (SpiderEnv x) (ReadPhase x) where
22412241 {-# INLINABLE holdIncremental #-}
22422242 holdIncremental v0 e = ReadPhase $ R.holdIncremental v0 e
22432243
2244−instance R.MonadReflexHost (SpiderEnv x) (SpiderHost x) where
2244+instance R.MonadReflexHost (SpiderTimeline x) (SpiderHost x) where
22452245 type ReadPhase (SpiderHost x) = ReadPhase x
22462246 fireEventsAndRead es (ReadPhase a) = run es a
22472247 runHostFrame = runFrame . runSpiderHostFrame
@@ -2263,3 +2263,10 @@ instance MonadRef (SpiderHostFrame x) where
22632263
22642264instance MonadAtomicRef (SpiderHostFrame x) where
22652265 atomicModifyRef r = SpiderHostFrame . atomicModifyRef r
2266+
2267+--------------------------------------------------------------------------------
2268+-- Deprecated items
2269+--------------------------------------------------------------------------------
2270+
2271+{-# DEPRECATED SpiderEnv "Use 'SpiderTimeline' instead" #-}
2272+type SpiderEnv = SpiderTimeline