@@ -88,7 +88,7 @@ import Reflex.PostBuild.Class
88import Reflex.TriggerEvent.Base hiding (askEvents)
88import Reflex.TriggerEvent.Base hiding (askEvents)
89import Reflex.TriggerEvent.Class
89import Reflex.TriggerEvent.Class
91−import Control.Concurrent.Chan
91+import Control.Concurrent
92import Control.Lens hiding (element, ix)
92import Control.Lens hiding (element, ix)
93import Control.Monad.Exception
93import Control.Monad.Exception
94import Control.Monad.Primitive
94import Control.Monad.Primitive
@@ -112,6 +112,8 @@ import Data.Monoid
112import qualified Data.Some as Some
112import qualified Data.Some as Some
113import Data.Text (Text)
113import Data.Text (Text)
114import qualified Data.Text as T
114import qualified Data.Text as T
115+import qualified GHCJS.DOM as DOM
116+import GHCJS.DOM.RequestAnimationFrameCallback
115import GHCJS.DOM.Document (Document, createDocumentFragmentUnchecked, createElementUnchecked, createElementNSUnchecked, createTextNodeUnchecked)
117import GHCJS.DOM.Document (Document, createDocumentFragmentUnchecked, createElementUnchecked, createElementNSUnchecked, createTextNodeUnchecked)
116import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS)
118import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS)
117import qualified GHCJS.DOM.Element as Element
119import qualified GHCJS.DOM.Element as Element
@@ -139,6 +141,7 @@ import Language.Javascript.JSaddle (call, eval)
140import Reflex.Requester.Base
142import Reflex.Requester.Base
141import Reflex.Requester.Class
143import Reflex.Requester.Class
144+import Foreign.JavaScript.Internal.Utils
143data ImmediateDomBuilderEnv t m
146data ImmediateDomBuilderEnv t m
144 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
147 = ImmediateDomBuilderEnv { _immediateDomBuilderEnv_document :: Document
@@ -172,14 +175,32 @@ instance (PerformEvent t m, PrimMonad m) => DomRenderHook t (ImmediateDomBuilder
173{-# INLINABLE runImmediateDomBuilderT #-}
176{-# INLINABLE runImmediateDomBuilderT #-}
174runImmediateDomBuilderT
177runImmediateDomBuilderT
181+ , MonadReflexCreateTrigger t m
175− :: (Reflex t, MonadFix m, PerformEvent t m, MonadJSM m, MonadJSM (Performable m))
183+ , MonadJSM (Performable m)
176 => ImmediateDomBuilderT t m a
187 => ImmediateDomBuilderT t m a
177 -> ImmediateDomBuilderEnv t m
188 -> ImmediateDomBuilderEnv t m
179runImmediateDomBuilderT (ImmediateDomBuilderT a) env = flip runTriggerEventT (_immediateDomBuilderEnv_events env) $ do
190runImmediateDomBuilderT (ImmediateDomBuilderT a) env = flip runTriggerEventT (_immediateDomBuilderEnv_events env) $ do
191+ win <- DOM.currentWindowUnchecked
180 rec (x, req) <- runRequesterT (runReaderT a env) rsp
192 rec (x, req) <- runRequesterT (runReaderT a env) rsp
193+ rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame win f $
181− rsp <- performEvent $ ffor req $ \rm -> liftJSM $ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
194+ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
197+ runInAnimationFrame win f x = do
198+ rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
199+ v <- synchronously x
201+ freeRequestAnimationFrameCallback cb
202+ _ <- Window.requestAnimationFrame win $ Just cb
184{-# INLINABLE askDocument #-}
205{-# INLINABLE askDocument #-}
185askDocument :: Monad m => ImmediateDomBuilderT t m Document
206askDocument :: Monad m => ImmediateDomBuilderT t m Document