@@ -208,20 +208,27 @@ runImmediateDomBuilderT
208208 -> ImmediateDomBuilderEnv t
209209 -> Chan [DSum (EventTriggerRef t) TriggerInvocation]
210210 -> m a
211−runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = flip runTriggerEventT eventChan $ do
212− win <- DOM.currentWindowUnchecked
213− rec (x, req) <- runRequesterT (runReaderT a env) rsp
214− rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame win f $
215− DMap.traverseWithKey (\_ r -> Identity <$> r) rm
216− return x
211+runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = do
212+ handlersMVar <- liftIO $ newMVar []
213+ flip runTriggerEventT eventChan $ do
214+ win <- DOM.currentWindowUnchecked
215+ rec (x, req) <- runRequesterT (runReaderT a env) rsp
216+ rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame handlersMVar win f $
217+ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
218+ return x
217219 where
218− runInAnimationFrame win f x = do
219− rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
220− v <- synchronously x
221− _ <- liftIO $ f v
222− freeRequestAnimationFrameCallback cb
223− _ <- Window.requestAnimationFrame win cb
224− return ()
220+ runInAnimationFrame handlersMVar win f x = do
221+ handlers <- liftIO $ takeMVar handlersMVar
222+ when (null handlers) $ do
223+ rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
224+ freeRequestAnimationFrameCallback cb
225+ handlersToRun <- liftIO $ takeMVar handlersMVar
226+ liftIO $ putMVar handlersMVar []
227+ sequence_ (reverse handlersToRun)
228+ void $ Window.requestAnimationFrame win cb
229+ liftIO $ putMVar handlersMVar ((do
230+ v <- synchronously x
231+ void . liftIO $ f v) : handlers)
225232
226233class Monad m => HasDocument m where
227234 askDocument :: m Document
@@ -471,14 +478,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
471478 inputElement cfg = do
472479 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
473480 let domInputElement = uncheckedCastTo DOM.HTMLInputElement domElement
474− Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
475− v0 <- Input.getValueUnchecked domInputElement
476− let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
481+ Input.setValue domInputElement $ cfg ^. inputElementConfig_initialValue
482+ v0 <- Input.getValue domInputElement
483+ let getMyValue = Input.getValue domInputElement
477484 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
478485 valueChangedBySetValue <- case _inputElementConfig_setValue cfg of
479486 Nothing -> return never
480487 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
481− Input.setValue domInputElement $ Just v'
488+ Input.setValue domInputElement v'
482489 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
483490 v <- holdDyn v0 $ leftmost
484491 [ valueChangedBySetValue
@@ -523,14 +530,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
523530 textAreaElement cfg = do --TODO
524531 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
525532 let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
526− TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
527− v0 <- TextArea.getValueUnchecked domTextAreaElement
528− let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
533+ TextArea.setValue domTextAreaElement $ cfg ^. textAreaElementConfig_initialValue
534+ v0 <- TextArea.getValue domTextAreaElement
535+ let getMyValue = TextArea.getValue domTextAreaElement
529536 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
530537 valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
531538 Nothing -> return never
532539 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
533− TextArea.setValue domTextAreaElement $ Just v'
540+ TextArea.setValue domTextAreaElement v'
534541 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
535542 v <- holdDyn v0 $ leftmost
536543 [ valueChangedBySetValue