instance HasSpiderTimeline x => Reflex.Host.Class.MonadSubscribeEvent (SpiderTimeline x) (SpiderHostFrame x) where {-# INLINABLE subscribeEvent #-} subscribeEvent e = SpiderHostFrame $ do --TODO: Unsubscribe eventually (manually and/or with weak ref) val <- liftIO $ newIORef Nothing subscription <- subscribe (unSpiderEvent e) $ Subscriber { subscriberPropagate = \a -> do liftIO $ writeIORef val $ Just a scheduleClear val , subscriberInvalidateHeight = \_ -> return () , subscriberRecalculateHeight = \_ -> return () } return $ SpiderEventHandle { spiderEventHandleSubscription = subscription , spiderEventHandleValue = val } instance HasSpiderTimeline x => Reflex.Host.Class.ReflexHost (SpiderTimeline x) where type EventTrigger (SpiderTimeline x) = RootTrigger x type EventHandle (SpiderTimeline x) = SpiderEventHandle x type HostFrame (SpiderTimeline x) = SpiderHostFrame x instance HasSpiderTimeline x => Reflex.Host.Class.MonadReadEvent (SpiderTimeline x) (Reflex.Spider.Internal.ReadPhase x) where {-# NOINLINE readEvent #-} readEvent h = Reflex.Spider.Internal.ReadPhase $ fmap (fmap return) $ liftIO $ do result <- readIORef $ spiderEventHandleValue h touch h return result instance ( #ifdef SPECIALIZE_TO_SPIDERTIMELINE_GLOBAL x ~ Global #endif ) => Reflex.Host.Class.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHost x) where newEventWithTrigger = SpiderHost . lift . fmap SpiderEvent . newEventWithTriggerIO newFanEventWithTrigger f = SpiderHost $ lift $ do es <- newFanEventWithTriggerIO f return $ Reflex.Class.EventSelector $ SpiderEvent . Reflex.Spider.Internal.select es instance ( #ifdef SPECIALIZE_TO_SPIDERTIMELINE_GLOBAL x ~ Global #endif ) => Reflex.Host.Class.MonadReflexCreateTrigger (SpiderTimeline x) (SpiderHostFrame x) where newEventWithTrigger = SpiderHostFrame . EventM . liftIO . fmap SpiderEvent . newEventWithTriggerIO newFanEventWithTrigger f = SpiderHostFrame $ EventM $ liftIO $ do es <- newFanEventWithTriggerIO f return $ Reflex.Class.EventSelector $ SpiderEvent . Reflex.Spider.Internal.select es instance HasSpiderTimeline x => Reflex.Host.Class.MonadSubscribeEvent (SpiderTimeline x) (SpiderHost x) where {-# INLINABLE subscribeEvent #-} subscribeEvent = runFrame . runSpiderHostFrame . Reflex.Host.Class.subscribeEvent instance HasSpiderTimeline x => Reflex.Host.Class.MonadReflexHost (SpiderTimeline x) (SpiderHost x) where type ReadPhase (SpiderHost x) = Reflex.Spider.Internal.ReadPhase x fireEventsAndRead es (Reflex.Spider.Internal.ReadPhase a) = run es a runHostFrame = runFrame . runSpiderHostFrame