@@ -88,7 +88,7 @@ import Reflex.PostBuild.Class
8888import Reflex.TriggerEvent.Base hiding (askEvents)
8989import Reflex.TriggerEvent.Class
9090
91−import Control.Concurrent.Chan
91+import Control.Concurrent
9292import Control.Lens hiding (element, ix)
9393import Control.Monad.Exception
9494import Control.Monad.Primitive
@@ -112,6 +112,8 @@ import Data.Monoid
112112import qualified Data.Some as Some
113113import Data.Text (Text)
114114import qualified Data.Text as T
115+import qualified GHCJS.DOM as DOM
116+import GHCJS.DOM.RequestAnimationFrameCallback
115117import GHCJS.DOM.Document (Document, createDocumentFragmentUnchecked, createElementUnchecked, createElementNSUnchecked, createTextNodeUnchecked)
116118import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS)
117119import qualified GHCJS.DOM.Element as Element
@@ -139,6 +141,7 @@ import Language.Javascript.JSaddle (call, eval)
139141
140142import Reflex.Requester.Base
141143import Reflex.Requester.Class
144+import Foreign.JavaScript.Internal.Utils
142145
143146data ImmediateDomBuilderEnv t m
144147 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
@@ -172,14 +175,32 @@ instance (PerformEvent t m, PrimMonad m) => DomRenderHook t (ImmediateDomBuilder
172175
173176{-# INLINABLE runImmediateDomBuilderT #-}
174177runImmediateDomBuilderT
175− :: (Reflex t, MonadFix m, PerformEvent t m, MonadJSM m, MonadJSM (Performable m))
178+ :: ( Reflex t
179+ , MonadFix m
180+ , PerformEvent t m
181+ , MonadReflexCreateTrigger t m
182+ , MonadJSM m
183+ , MonadJSM (Performable m)
184+ , MonadRef m
185+ , Ref m ~ IORef
186+ )
176187 => ImmediateDomBuilderT t m a
177188 -> ImmediateDomBuilderEnv t m
178189 -> m a
179190runImmediateDomBuilderT (ImmediateDomBuilderT a) env = flip runTriggerEventT (_immediateDomBuilderEnv_events env) $ do
191+ win <- DOM.currentWindowUnchecked
180192 rec (x, req) <- runRequesterT (runReaderT a env) rsp
181− rsp <- performEvent $ ffor req $ \rm -> liftJSM $ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
193+ rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame win f $
194+ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
182195 return x
196+ where
197+ runInAnimationFrame win f x = do
198+ rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
199+ v <- synchronously x
200+ _ <- liftIO $ f v
201+ freeRequestAnimationFrameCallback cb
202+ _ <- Window.requestAnimationFrame win $ Just cb
203+ return ()
183204
184205{-# INLINABLE askDocument #-}
185206askDocument :: Monad m => ImmediateDomBuilderT t m Document