@@ -51,22 +51,6 @@ module Reflex.Dom.Builder.Hydration
51 , hoistTraverseIntMapWithKeyWithAdjust
51 , hoistTraverseIntMapWithKeyWithAdjust
54−import Foreign.JavaScript.TH
55−import Reflex.Adjustable.Class
56−import Reflex.Class as Reflex
57−import qualified Reflex.Spider.Internal as Spider
58−import Reflex.Dom.Builder.Class
59−import Reflex.Dom.Builder.Immediate hiding (askEvents, askParent, append, wrap, makeElement, textNodeInternal, commentNodeInternal, traverseIntMapWithKeyWithAdjust', traverseDMapWithKeyWithAdjust', hoistTraverseWithKeyWithAdjust, hoistTraverseIntMapWithKeyWithAdjust, drawChildUpdate)
61−import Reflex.Host.Class
62−import qualified Reflex.Patch.DMap as PatchDMap
63−import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
64−import Reflex.PerformEvent.Class
65−import Reflex.PostBuild.Class
66−import Reflex.TriggerEvent.Base hiding (askEvents)
67−import qualified Reflex.TriggerEvent.Base as TriggerEventT (askEvents)
68−import Reflex.TriggerEvent.Class
70import Control.Concurrent
54import Control.Concurrent
71import Control.Exception (bracketOnError)
55import Control.Exception (bracketOnError)
72import Control.Lens hiding (element, ix)
56import Control.Lens hiding (element, ix)
@@ -75,71 +59,64 @@ import Control.Monad.Primitive
75import Control.Monad.Reader
59import Control.Monad.Reader
76import Control.Monad.Ref
60import Control.Monad.Ref
77import Control.Monad.State.Strict
61import Control.Monad.State.Strict
78−import Control.Monad.Trans.Maybe
79−#ifndef USE_TEMPLATE_HASKELL
80−import Data.Functor.Contravariant (phantom)
82−import Data.Bitraversable
84import Data.Dependent.Map (DMap)
62import Data.Dependent.Map (DMap)
85−import qualified Data.Dependent.Map as DMap
86import Data.Dependent.Sum
63import Data.Dependent.Sum
64+import Data.FastMutableIntMap (PatchIntMap (..))
87−import Data.Foldable (foldl', for_)
65+import Data.Foldable (for_)
88import Data.Functor.Compose
66import Data.Functor.Compose
89import Data.Functor.Constant
67import Data.Functor.Constant
90import Data.Functor.Misc
68import Data.Functor.Misc
91import Data.Functor.Product
69import Data.Functor.Product
92import Data.IORef
70import Data.IORef
93−import qualified Data.Map as Map
71+import Data.IntMap.Strict (IntMap)
94import Data.Maybe
72import Data.Maybe
95−import Data.Monoid hiding (Product)
96−import Data.Some (Some)
97−import qualified Data.Some as Some
98import Data.Text (Text)
73import Data.Text (Text)
74+import Data.Typeable (Typeable)
75+import Foreign.JavaScript.Internal.Utils
76+import Foreign.JavaScript.TH
77+import GHCJS.DOM.Document (Document, createDocumentFragment, createElement, createElementNS, createTextNode, createComment)
78+import GHCJS.DOM.Element (removeAttribute, removeAttributeNS, setAttribute, setAttributeNS, hasAttribute, hasAttributeNS)
79+import GHCJS.DOM.EventM (on)
80+import GHCJS.DOM.Node (appendChild_, setNodeValue, toNode)
81+import GHCJS.DOM.Types (liftJSM, askJSM, runJSM, JSM, MonadJSM, IsNode, Node, ToDOMString, uncheckedCastTo)
82+import Reflex.Adjustable.Class
83+import Reflex.Class as Reflex
84+import Reflex.Dom.Builder.Class
85+import Reflex.Dom.Builder.Immediate hiding (askEvents, askParent, append, wrap, makeElement, textNodeInternal, traverseIntMapWithKeyWithAdjust', traverseDMapWithKeyWithAdjust', hoistTraverseWithKeyWithAdjust, hoistTraverseIntMapWithKeyWithAdjust, drawChildUpdate)
87+import Reflex.Host.Class
88+import Reflex.PerformEvent.Class
89+import Reflex.PostBuild.Class
90+import Reflex.Requester.Base
91+import Reflex.Requester.Class
92+import Reflex.TriggerEvent.Base hiding (askEvents)
93+import Reflex.TriggerEvent.Class
95+import qualified Data.Dependent.Map as DMap
96+import qualified Data.FastMutableIntMap as FastMutableIntMap
97+import qualified Data.IntMap.Strict as IntMap
98+import qualified Data.Map as Map
99+import qualified Data.Some as Some
99import qualified Data.Text as T
100import qualified Data.Text as T
100−import Data.Typeable (Typeable, typeRep, Proxy(..))
101−import GHC.Generics (Generic)
102import qualified GHCJS.DOM as DOM
101import qualified GHCJS.DOM as DOM
103−import GHCJS.DOM.Document (Document, createDocumentFragment, createElement, createElementNS, createTextNode, createComment)
102+import qualified GHCJS.DOM.DocumentOrShadowRoot as Document
104−import GHCJS.DOM.Element (getScrollTop, removeAttribute, removeAttributeNS, setAttribute, setAttributeNS, hasAttribute, hasAttributeNS)
105import qualified GHCJS.DOM.Element as Element
103import qualified GHCJS.DOM.Element as Element
106−import qualified GHCJS.DOM.Event as Event
107−import qualified GHCJS.DOM.GlobalEventHandlers as Events
108−import qualified GHCJS.DOM.DocumentAndElementEventHandlers as Events
109−import GHCJS.DOM.EventM (EventM, event, on)
110import qualified GHCJS.DOM.EventM as DOM
104import qualified GHCJS.DOM.EventM as DOM
111import qualified GHCJS.DOM.FileList as FileList
105import qualified GHCJS.DOM.FileList as FileList
112−import qualified GHCJS.DOM.DocumentOrShadowRoot as Document
106+import qualified GHCJS.DOM.GlobalEventHandlers as Events
113import qualified GHCJS.DOM.HTMLInputElement as Input
107import qualified GHCJS.DOM.HTMLInputElement as Input
114import qualified GHCJS.DOM.HTMLSelectElement as Select
108import qualified GHCJS.DOM.HTMLSelectElement as Select
115import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
109import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
116−import GHCJS.DOM.MouseEvent
117−import qualified GHCJS.DOM.Touch as Touch
118−import qualified GHCJS.DOM.TouchEvent as TouchEvent
119−import qualified GHCJS.DOM.TouchList as TouchList
120−import GHCJS.DOM.Node (appendChild_, getChildNodes, getOwnerDocumentUnchecked, getParentNodeUnchecked, setNodeValue, toNode)
121−import qualified GHCJS.DOM.Node as DOM (insertBefore_)
122import qualified GHCJS.DOM.Node as Node
110import qualified GHCJS.DOM.Node as Node
123−import qualified GHCJS.DOM.NodeList as NodeList
124import qualified GHCJS.DOM.Text as DOM
111import qualified GHCJS.DOM.Text as DOM
125−import GHCJS.DOM.Types
126− (liftJSM, askJSM, runJSM, JSM, MonadJSM,
127− FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node,
128− ToDOMString, TouchEvent, WheelEvent, uncheckedCastTo, ClipboardEvent)
129import qualified GHCJS.DOM.Types as DOM
112import qualified GHCJS.DOM.Types as DOM
130−import GHCJS.DOM.UIEvent
113+import qualified Reflex.Patch.DMap as PatchDMap
131−import GHCJS.DOM.KeyboardEvent as KeyboardEvent
114+import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
132−import qualified GHCJS.DOM.Window as Window
115+import qualified Reflex.TriggerEvent.Base as TriggerEventT (askEvents)
133−import Language.Javascript.JSaddle (call, eval, jsg, js1)
134−import Data.IntMap.Strict (IntMap)
135−import qualified Data.IntMap.Strict as IntMap
136−import Data.FastMutableIntMap (PatchIntMap (..))
137−import qualified Data.FastMutableIntMap as FastMutableIntMap
138−import System.IO.Unsafe (unsafePerformIO)
140−import Reflex.Requester.Base
117+#ifndef USE_TEMPLATE_HASKELL
141−import Reflex.Requester.Class
118+import Data.Functor.Contravariant (phantom)
142−import Foreign.JavaScript.Internal.Utils
119+#endif
144#ifndef ghcjs_HOST_OS
121#ifndef ghcjs_HOST_OS
145import GHCJS.DOM.Types (MonadJSM (..))
122import GHCJS.DOM.Types (MonadJSM (..))
@@ -166,7 +143,7 @@ data HydrationDomBuilderEnv t = HydrationDomBuilderEnv
166 -- ^ Action to take when all children are ready --TODO: we should probably get rid of this once we invoke it
143 -- ^ Action to take when all children are ready --TODO: we should probably get rid of this once we invoke it
167 , _hydrationDomBuilderEnv_hydrationMode :: {-# UNPACK #-} !(IORef HydrationMode)
144 , _hydrationDomBuilderEnv_hydrationMode :: {-# UNPACK #-} !(IORef HydrationMode)
168 -- ^ In hydration mode? Should be switched to `HydrationMode_Immediate` after hydration is finished
145 -- ^ In hydration mode? Should be switched to `HydrationMode_Immediate` after hydration is finished
169− , _hydrationDomBuilderEnv_switchover :: {-# UNPACK #-} !(Event t ())
146+ , _hydrationDomBuilderEnv_switchover :: !(Event t ())
172-- | The monad which performs the delayed actions to reuse prerendered nodes and set up events
149-- | The monad which performs the delayed actions to reuse prerendered nodes and set up events
@@ -461,7 +438,6 @@ makeElement elementTag cfg child = do
461 p <- liftIO $ newIORef $ toNode e
438 p <- liftIO $ newIORef $ toNode e
462 -- Run the child builder with updated parent and previous sibling references
439 -- Run the child builder with updated parent and previous sibling references
463 result <- localEnv (\env -> env { _hydrationDomBuilderEnv_parent = p }) child
440 result <- localEnv (\env -> env { _hydrationDomBuilderEnv_parent = p }) child
465 eventTriggerRefs <- wrap events e $ extractRawElementConfig cfg
441 eventTriggerRefs <- wrap events e $ extractRawElementConfig cfg
466 es <- newFanEventWithTrigger $ triggerBody eventTriggerRefs e
442 es <- newFanEventWithTrigger $ triggerBody eventTriggerRefs e
467 e' <- liftIO $ newIORef e
443 e' <- liftIO $ newIORef e
@@ -516,7 +492,6 @@ textNodeInternal !t mSetContents = getHydrationMode >>= \case
516 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
492 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
518 HydrationMode_Hydrating -> do
494 HydrationMode_Hydrating -> do
520 addHydrationStepWithSetup (maybe (pure $ pure t) (hold t) mSetContents) $ \currentText -> do
495 addHydrationStepWithSetup (maybe (pure $ pure t) (hold t) mSetContents) $ \currentText -> do
521 n <- hydrateTextNode =<< sample currentText
496 n <- hydrateTextNode =<< sample currentText
522 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
497 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
@@ -530,9 +505,9 @@ textNodeInternal !t mSetContents = getHydrationMode >>= \case
530hydrateTextNode :: MonadJSM m => Text -> HydrationRunnerT t m DOM.Text
505hydrateTextNode :: MonadJSM m => Text -> HydrationRunnerT t m DOM.Text
531hydrateTextNode t@"" = do
506hydrateTextNode t@"" = do
532 doc <- Node.getOwnerDocumentUnchecked =<< askParent
507 doc <- Node.getOwnerDocumentUnchecked =<< askParent
533− textNode <- createTextNode doc t
508+ tn <- createTextNode doc t
534− insertAfterPreviousNode textNode
509+ insertAfterPreviousNode tn
535− pure textNode
510+ pure tn
536hydrateTextNode t = do
511hydrateTextNode t = do
537 n <- join $ go <$> askParent <*> getPreviousNode
512 n <- join $ go <$> askParent <*> getPreviousNode
538 setPreviousNode $ Just $ toNode n
513 setPreviousNode $ Just $ toNode n
@@ -562,7 +537,6 @@ commentNodeInternal !t mSetContents = getHydrationMode >>= \case
562 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
537 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
564 HydrationMode_Hydrating -> do
539 HydrationMode_Hydrating -> do
566 addHydrationStep $ do
540 addHydrationStep $ do
567 n <- hydrateNode (const $ pure True) DOM.Comment
541 n <- hydrateNode (const $ pure True) DOM.Comment
568 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
542 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
@@ -597,19 +571,19 @@ skipToAndReplaceComment prefix key0Ref = getHydrationMode >>= \case
597 case T.stripPrefix (prefix <> key0) commentText of
571 case T.stripPrefix (prefix <> key0) commentText of
598 Just key -> do
572 Just key -> do
599 -- Replace the comment with an (invisible) text node
573 -- Replace the comment with an (invisible) text node
600− textNode <- createTextNode doc ("" :: Text)
574+ tn <- createTextNode doc ("" :: Text)
601− Node.replaceChild_ parent textNode comment
575+ Node.replaceChild_ parent tn comment
602− pure (textNode, key)
576+ pure (tn, key)
603 Nothing -> do
577 Nothing -> do
604 go key0 (Just node)
578 go key0 (Just node)
605 Nothing -> do
579 Nothing -> do
606 go key0 (Just node)
580 go key0 (Just node)
607 switchComment = do
581 switchComment = do
608 key0 <- liftIO $ readIORef key0Ref
582 key0 <- liftIO $ readIORef key0Ref
609− (textNode, key) <- go key0 =<< getPreviousNode
583+ (tn, key) <- go key0 =<< getPreviousNode
610− setPreviousNode $ Just $ toNode textNode
584+ setPreviousNode $ Just $ toNode tn
611 liftIO $ do
585 liftIO $ do
612− writeIORef textNodeRef textNode
586+ writeIORef textNodeRef tn
613 writeIORef keyRef key
587 writeIORef keyRef key
614 pure (switchComment, textNodeRef, keyRef)
588 pure (switchComment, textNodeRef, keyRef)
@@ -632,7 +606,6 @@ instance SupportsHydrationDomBuilder t m => NotReady t (HydrationDomBuilderT t m
632 when (new == 0) commitAction
606 when (new == 0) commitAction
633 requestDomAction_ $ ready <$ eOnce
607 requestDomAction_ $ ready <$ eOnce
634 notReady = do
608 notReady = do
635− env <- HydrationDomBuilderT ask
636 unreadyChildren <- askUnreadyChildren
609 unreadyChildren <- askUnreadyChildren
637 liftIO $ modifyIORef' unreadyChildren succ
610 liftIO $ modifyIORef' unreadyChildren succ
@@ -695,7 +668,7 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
695 requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
668 requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
697 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
670 Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
698− liftJSM $ domInputElement `on` Events.click $ do
671+ _ <- liftJSM $ domInputElement `on` Events.click $ do
699 liftIO . triggerCheckedChangedByUI =<< Input.getChecked domInputElement
672 liftIO . triggerCheckedChangedByUI =<< Input.getChecked domInputElement
701 for_ (_inputElementConfig_setChecked cfg) $ \eNewchecked ->
674 for_ (_inputElementConfig_setChecked cfg) $ \eNewchecked ->
@@ -704,7 +677,7 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
704 Input.setChecked domInputElement newChecked
677 Input.setChecked domInputElement newChecked
705 when (newChecked /= oldChecked) $ liftIO $ triggerCheckedChangedBySetChecked newChecked
678 when (newChecked /= oldChecked) $ liftIO $ triggerCheckedChangedBySetChecked newChecked
707− liftJSM $ domInputElement `on` Events.change $ do
680+ _ <- liftJSM $ domInputElement `on` Events.change $ do
708 mfiles <- Input.getFiles domInputElement
681 mfiles <- Input.getFiles domInputElement
709 let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
682 let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
710 liftIO . triggerFileChange =<< maybe (return []) getMyFiles mfiles
683 liftIO . triggerFileChange =<< maybe (return []) getMyFiles mfiles
@@ -740,7 +713,7 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
741 {-# INLINABLE textAreaElement #-}
714 {-# INLINABLE textAreaElement #-}
742 textAreaElement cfg = do --TODO
715 textAreaElement cfg = do --TODO
743− ((e, _), domElement') <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
716+ ((e, _), _domElement') <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
744 let domElement = undefined :: DOM.HTMLTextAreaElement
717 let domElement = undefined :: DOM.HTMLTextAreaElement
745 let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
718 let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
746 TextArea.setValue domTextAreaElement $ cfg ^. textAreaElementConfig_initialValue
719 TextArea.setValue domTextAreaElement $ cfg ^. textAreaElementConfig_initialValue
@@ -764,9 +737,10 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
764 , _textAreaElement_element = e
737 , _textAreaElement_element = e
765 , _textAreaElement_raw = domTextAreaElement
738 , _textAreaElement_raw = domTextAreaElement
767 {-# INLINABLE selectElement #-}
741 {-# INLINABLE selectElement #-}
768 selectElement cfg child = do
742 selectElement cfg child = do
769− ((e, result), domElement') <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
743+ ((e, result), _domElement') <- makeElement "select" (cfg ^. selectElementConfig_elementConfig) child
770 let domElement = undefined :: DOM.HTMLSelectElement
744 let domElement = undefined :: DOM.HTMLSelectElement
771 let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
745 let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
772 Select.setValue domSelectElement $ cfg ^. selectElementConfig_initialValue
746 Select.setValue domSelectElement $ cfg ^. selectElementConfig_initialValue
@@ -805,8 +779,8 @@ data HydrationDomFragment = HydrationDomFragment
806extractFragment :: MonadJSM m => HydrationDomFragment -> m ()
780extractFragment :: MonadJSM m => HydrationDomFragment -> m ()
807extractFragment fragment = do
781extractFragment fragment = do
808− state <- liftIO $ readIORef $ _hydrationDomFragment_state fragment
782+ s <- liftIO $ readIORef $ _hydrationDomFragment_state fragment
809− case state of
783+ case s of
810 FragmentState_Unmounted -> return ()
784 FragmentState_Unmounted -> return ()
811 FragmentState_Mounted (before, after) -> do
785 FragmentState_Mounted (before, after) -> do
812 extractBetweenExclusive (_hydrationDomFragment_document fragment) before after
786 extractBetweenExclusive (_hydrationDomFragment_document fragment) before after
@@ -818,8 +792,8 @@ instance SupportsHydrationDomBuilder t m => MountableDomBuilder t (HydrationDomB
818 df <- createDocumentFragment =<< askDocument
792 df <- createDocumentFragment =<< askDocument
819 p <- liftIO $ newIORef $ toNode df
793 p <- liftIO $ newIORef $ toNode df
820 result <- localEnv (\env -> env { _hydrationDomBuilderEnv_parent = p }) w
794 result <- localEnv (\env -> env { _hydrationDomBuilderEnv_parent = p }) w
821− state <- liftIO $ newIORef FragmentState_Unmounted
795+ s <- liftIO $ newIORef FragmentState_Unmounted
822− return (HydrationDomFragment df state, result)
796+ return (HydrationDomFragment df s, result)
823 mountDomFragment fragment setFragment = do
797 mountDomFragment fragment setFragment = do
824 parent <- getParent
798 parent <- getParent
825 extractFragment fragment
799 extractFragment fragment
@@ -1070,7 +1044,7 @@ hoistTraverseIntMapWithKeyWithAdjust :: forall v v' t m p.
1070 -> Event t (p v)
1044 -> Event t (p v)
1071 -> HydrationDomBuilderT t m (IntMap v', Event t (p v'))
1045 -> HydrationDomBuilderT t m (IntMap v', Event t (p v'))
1072hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_ f dm0 dm' = do
1046hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_ f dm0 dm' = do
1073− (hydrateStart, _, key) <- skipToReplaceStart
1047+ (_hydrateStart, _, key) <- skipToReplaceStart
1074 initialEnv <- HydrationDomBuilderT ask
1048 initialEnv <- HydrationDomBuilderT ask
1075 let parentUnreadyChildren = _hydrationDomBuilderEnv_unreadyChildren initialEnv
1049 let parentUnreadyChildren = _hydrationDomBuilderEnv_unreadyChildren initialEnv
1076 pendingChange :: IORef (IntMap (IORef ChildReadyStateInt), p (HydrationRunnerT t m (), DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')) <- liftIO $ newIORef mempty
1050 pendingChange :: IORef (IntMap (IORef ChildReadyStateInt), p (HydrationRunnerT t m (), DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')) <- liftIO $ newIORef mempty
@@ -1131,13 +1105,13 @@ hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_
1131 insertAfterPreviousNode ph
1105 insertAfterPreviousNode ph
1132 liftIO $ writeIORef lastPlaceholderRef ph
1106 liftIO $ writeIORef lastPlaceholderRef ph
1133 addHydrationStepWithSetup (accumMaybeB (flip apply) delayed0 delayed') $ \delayed -> do
1107 addHydrationStepWithSetup (accumMaybeB (flip apply) delayed0 delayed') $ \delayed -> do
1134− join $ sample (sequence . IntMap.elems <$> delayed)
1108+ _ <- join $ sample (sequence . IntMap.elems <$> delayed)
1135 setFinalPlaceholder
1109 setFinalPlaceholder
1136 liftIO $ writeIORef placeholders $! placeholders0
1110 liftIO $ writeIORef placeholders $! placeholders0
1137 getHydrationMode >>= \case
1111 getHydrationMode >>= \case
1138 HydrationMode_Immediate -> void $ IntMap.traverseWithKey (\_ (_, df, _, _, _) -> void $ append $ toNode df) children0
1112 HydrationMode_Immediate -> void $ IntMap.traverseWithKey (\_ (_, df, _, _, _) -> void $ append $ toNode df) children0
1139 _ -> pure ()
1113 _ -> pure ()
1140− (hydrateEnd, lastPlaceholderRef) <- skipToReplaceEnd key
1114+ (_hydrateEnd, _lastPlaceholderRef) <- skipToReplaceEnd key
1141 requestDomAction_ $ ffor children' $ \p -> do
1115 requestDomAction_ $ ffor children' $ \p -> do
1142 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
1116 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
1143 newUnready <- liftIO $ updateChildUnreadiness p oldUnready
1117 newUnready <- liftIO $ updateChildUnreadiness p oldUnready
@@ -1245,7 +1219,7 @@ hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpda
1245 insertAfterPreviousNode ph
1219 insertAfterPreviousNode ph
1246 liftIO $ writeIORef lastPlaceholderRef ph
1220 liftIO $ writeIORef lastPlaceholderRef ph
1247 addHydrationStepWithSetup (accumMaybeB (flip apply) delayed0 delayed') $ \delayed -> do
1221 addHydrationStepWithSetup (accumMaybeB (flip apply) delayed0 delayed') $ \delayed -> do
1248− join $ sample (traverse (\(_ :=> Const d) -> d) . DMap.toList <$> delayed)
1222+ _ <- join $ sample (traverse (\(_ :=> Const d) -> d) . DMap.toList <$> delayed)
1249 setFinalPlaceholder
1223 setFinalPlaceholder
1250 liftIO $ writeIORef placeholders $! placeholders0
1224 liftIO $ writeIORef placeholders $! placeholders0
1251 getHydrationMode >>= \case
1225 getHydrationMode >>= \case