@@ -788,6 +788,7 @@ data EventEnv x
788788 , eventEnvCurrentHeight :: !(IORef Height) -- Needed for Subscribe
789789 , eventEnvResetCoincidences :: !(IORef [SomeResetCoincidence x]) -- Needed for Subscribe
790790 , eventEnvDelayedMerges :: !(IORef (IntMap [EventM x ()]))
791+ , eventEnvToReconnect :: !(IORef [SomeSwitchSubscribed x])
791792 }
792793
793794{-# INLINE runEventM #-}
@@ -1212,6 +1213,9 @@ coincidence a = eventCoincidence $ Coincidence
12121213-- Propagate the given event occurrence; before cleaning up, run the given action, which may read the state of events and behaviors
12131214run :: forall x b. HasSpiderTimeline x => [DSum (RootTrigger x) Identity] -> ResultM x b -> SpiderHost x b
12141215run roots after = do
1216+ --TDOO: This is kind of a hack: if we detect that `toReconnect` is not empty, which means we've invalidated behaviors between the last frame and this one
1217+ toReconnect <- liftIO $ readIORef $ eventEnvToReconnect $ _spiderTimeline_eventEnv (spiderTimeline :: SpiderTimelineEnv x)
1218+ when (not $ null toReconnect) $ runFrame $ pure ()
12151219 tracePropagate (Proxy :: Proxy x) $ "Running an event frame with " <> show (length roots) <> " events"
12161220 t <- SpiderHost ask
12171221 result <- SpiderHost $ lift $ withMVar (_spiderTimeline_lock t) $ \_ -> flip runReaderT t $ unSpiderHost $ runFrame $ do
@@ -2056,10 +2060,11 @@ newEventEnv = do
20562060 toClearRootRef <- newIORef []
20572061 coincidenceInfosRef <- newIORef []
20582062 delayedRef <- newIORef IntMap.empty
2059− return $ EventEnv toAssignRef holdInitRef dynInitRef mergeUpdateRef mergeInitRef toClearRef toClearIntRef toClearRootRef heightRef coincidenceInfosRef delayedRef
2063+ toReconnectRef <- newIORef []
2064+ return $ EventEnv toAssignRef holdInitRef dynInitRef mergeUpdateRef mergeInitRef toClearRef toClearIntRef toClearRootRef heightRef coincidenceInfosRef delayedRef toReconnectRef
20602065
20612066clearEventEnv :: EventEnv x -> IO ()
2062−clearEventEnv (EventEnv toAssignRef holdInitRef dynInitRef mergeUpdateRef mergeInitRef toClearRef toClearIntRef toClearRootRef heightRef coincidenceInfosRef delayedRef) = do
2067+clearEventEnv (EventEnv toAssignRef holdInitRef dynInitRef mergeUpdateRef mergeInitRef toClearRef toClearIntRef toClearRootRef heightRef coincidenceInfosRef delayedRef toReconnectRef) = do
20632068 writeIORef toAssignRef []
20642069 writeIORef holdInitRef []
20652070 writeIORef dynInitRef []
@@ -2071,6 +2076,7 @@ clearEventEnv (EventEnv toAssignRef holdInitRef dynInitRef mergeUpdateRef mergeI
20712076 writeIORef toClearRootRef []
20722077 writeIORef coincidenceInfosRef []
20732078 writeIORef delayedRef IntMap.empty
2079+ writeIORef toReconnectRef []
20742080
20752081-- | Run an event action outside of a frame
20762082runFrame :: forall x a. HasSpiderTimeline x => EventM x a -> SpiderHost x a --TODO: This function also needs to hold the mutex
@@ -2088,7 +2094,7 @@ runFrame a = SpiderHost $ ask >>= \_ -> lift $ do
20882094 toClearRoot <- readIORef $ eventEnvRootClears env
20892095 forM_ toClearRoot $ \(SomeRootClear ref) -> {-# SCC "rootClear" #-} writeIORef ref $! DMap.empty
20902096 toAssign <- readIORef $ eventEnvAssignments env
2091− toReconnectRef <- newIORef []
2097+ let toReconnectRef = eventEnvToReconnect env
20922098 coincidenceInfos <- readIORef $ eventEnvResetCoincidences env
20932099 forM_ toAssign $ \(SomeAssignment vRef iRef v) -> {-# SCC "assignment" #-} do
20942100 writeIORef vRef v
@@ -2394,6 +2400,7 @@ instance HasSpiderTimeline x => Reflex.Host.Class.MonadSubscribeEvent (SpiderTim
23942400
23952401instance HasSpiderTimeline x => Reflex.Host.Class.ReflexHost (SpiderTimeline x) where
23962402 type EventTrigger (SpiderTimeline x) = RootTrigger x
2403+ type BehaviorInvalidator (SpiderTimeline x) = Maybe (Weak (Invalidator x))
23972404 type EventHandle (SpiderTimeline x) = SpiderEventHandle x
23982405 type HostFrame (SpiderTimeline x) = SpiderHostFrame x
23992406
@@ -2410,12 +2417,26 @@ instance Reflex.Host.Class.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHo
24102417 es <- newFanEventWithTriggerIO f
24112418 return $ Reflex.Class.EventSelector $ SpiderEvent . Reflex.Spider.Internal.select es
24122419
2420+instance HasSpiderTimeline x => Reflex.Host.Class.MonadReflexCreateBehavior (SpiderTimeline x) (SpiderHost x) where
2421+ newBehavior getValue = pure $ SpiderBehavior $ pull $ do
2422+ !invalidator <- askInvalidator
2423+ BehaviorM $ lift $ getValue invalidator
2424+ invalidateBehavior mi = forM_ mi $ \i -> do
2425+ liftIO $ void $ invalidate (eventEnvToReconnect $ _spiderTimeline_eventEnv (spiderTimeline :: SpiderTimelineEnv x)) [i]
2426+
24132427instance Reflex.Host.Class.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHostFrame x) where
24142428 newEventWithTrigger = SpiderHostFrame . EventM . liftIO . fmap SpiderEvent . newEventWithTriggerIO
24152429 newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do
24162430 es <- newFanEventWithTriggerIO f
24172431 return $ Reflex.Class.EventSelector $ SpiderEvent . Reflex.Spider.Internal.select es
24182432
2433+instance HasSpiderTimeline x => Reflex.Host.Class.MonadReflexCreateBehavior (SpiderTimeline x) (SpiderHostFrame x) where
2434+ newBehavior getValue = pure $ SpiderBehavior $ pull $ do
2435+ !invalidator <- askInvalidator
2436+ BehaviorM $ lift $ getValue invalidator
2437+ invalidateBehavior mi = forM_ mi $ \i -> do
2438+ liftIO $ void $ invalidate (eventEnvToReconnect $ _spiderTimeline_eventEnv (spiderTimeline :: SpiderTimelineEnv x)) [i]
2439+
24192440instance HasSpiderTimeline x => Reflex.Host.Class.MonadSubscribeEvent (SpiderTimeline x) (SpiderHost x) where
24202441 {-# INLINABLE subscribeEvent #-}
24212442 subscribeEvent = runFrame . runSpiderHostFrame . Reflex.Host.Class.subscribeEvent
@@ -2558,7 +2579,7 @@ instance Monad (SpiderHost x) where
25582579-- | Run an action affecting the global Spider timeline; this will be guarded by
25592580-- a mutex for that timeline
25602581runSpiderHost :: SpiderHost Global a -> IO a
2561−runSpiderHost (SpiderHost a) = runReaderT a globalSpiderTimelineEnv
2582+runSpiderHost a = runSpiderHostForTimeline a globalSpiderTimelineEnv
25622583
25632584-- | Run an action affecting a given Spider timeline; this will be guarded by a
25642585-- mutex for that timeline