@@ -34,13 +34,11 @@ module Reflex.Dom.Builder.Hydration
3434 ( EventTriggerRef (..)
3535 , HydrationDomBuilderEnv (..)
3636 , HydrationDomBuilderT (..)
37− , HydrationDomBuilderT' (..)
3837 , HydrationDomBuilderState (..)
3938 , HydrationMode (..)
4039 , HydrationRunnerT (..)
40+ , runHydrationRunnerT
4141 , DOM(..), runDOMForest
42− , HydrationRunnerEnv (..)
43− , HydrationRunnerState (..)
4442 , runHydrationDomBuilderT
4543 , askParent
4644 , askEvents
@@ -181,8 +179,14 @@ import Foreign.JavaScript.Internal.Utils
181179#ifndef ghcjs_HOST_OS
182180import GHCJS.DOM.Types (MonadJSM (..))
183181
184−instance MonadJSM m => MonadJSM (HydrationDomBuilderT' env state t m) where
185− liftJSM' = HydrationDomBuilderT . liftJSM'
182+instance MonadJSM m => MonadJSM (HydrationDomBuilderT t m) where
183+ liftJSM' = lift . liftJSM'
184+
185+instance MonadJSM m => MonadJSM (HydrationRunnerT t m) where
186+ liftJSM' = lift . liftJSM'
187+
188+instance MonadJSM m => MonadJSM (DomRenderHookT t m) where
189+ liftJSM' = lift . liftJSM'
186190#endif
187191
188192data HydrationDomSpace
@@ -211,29 +215,28 @@ instance DomSpace HydrationDomSpace where
211215 in DMap.alter f' en $ _ghcjsEventSpec_filters es
212216 }
213217
214−data HydrationDomBuilderEnv t m = HydrationDomBuilderEnv
218+data HydrationDomBuilderEnv = HydrationDomBuilderEnv
215219 { _hydrationDomBuilderEnv_document :: {-# UNPACK #-} !Document
220+ -- ^ Reference to the document
216221 , _hydrationDomBuilderEnv_parent :: {-# UNPACK #-} !(IORef Node)
217− , _hydrationDomBuilderEnv_unreadyChildren :: {-# UNPACK #-} !(IORef Word) -- Number of children who still aren't fully rendered
218− , _hydrationDomBuilderEnv_commitAction :: !(JSM ()) -- Action to take when all children are ready --TODO: we should probably get rid of this once we invoke it
219− , _hydrationDomBuilderEnv_hydrationMode :: {-# UNPACK #-} !(IORef HydrationMode) -- In hydration mode?
222+ -- ^ This is in an IORef because in the time up to hydration we can't actually know what the
223+ -- parent is - we populate this reference during the DOM traversal at hydration time
224+ , _hydrationDomBuilderEnv_unreadyChildren :: {-# UNPACK #-} !(IORef Word)
225+ -- ^ Number of children who still aren't fully rendered
226+ , _hydrationDomBuilderEnv_commitAction :: !(JSM ())
227+ -- ^ Action to take when all children are ready --TODO: we should probably get rid of this once we invoke it
228+ , _hydrationDomBuilderEnv_hydrationMode :: {-# UNPACK #-} !(IORef HydrationMode)
229+ -- ^ In hydration mode? Should be switched to `HydrationMode_Immediate` after hydration is finished
220230 , _hydrationDomBuilderEnv_prerenderDepth :: {-# UNPACK #-} !(IORef Word)
231+ -- ^ TODO
221232 }
222233
223−data HydrationRunnerEnv = HydrationRunnerEnv
224− { _hydrationRunnerEnv_document :: {-# UNPACK #-} !Document
225− , _hydrationRunnerEnv_parent :: {-# UNPACK #-} !Node
226− , _hydrationRunnerEnv_unreadyChildren :: {-# UNPACK #-} !(IORef Word) -- Number of children who still aren't fully rendered
227− , _hydrationRunnerEnv_commitAction :: !(JSM ()) -- Action to take when all children are ready --TODO: we should probably get rid of this once we invoke it
228− }
229−
230−--newtype Forest a = Forest { unForest :: [DOM a] } deriving (Functor, Foldable, Traversable)
231234data DOM t m
232235 = DOM_Element (HydrationRunnerT t m Node) [DOM t m]
233236 -- ^ Nodes with children, the action returns the node for the children to use as a parent
234237 | DOM_Node (HydrationRunnerT t m ())
235238 -- ^ Nodes without children
236− | DOM_Replace (Behavior t [DOM t m])
239+ | DOM_Replace (HydrationRunnerT t m ()) (HydrationRunnerT t m ()) (Behavior t [DOM t m])
237240 -- ^ runWithReplace content changes over time
238241
239242runDOMForest
@@ -247,19 +250,36 @@ runDOMTree
247250 => DOM t m -> HydrationRunnerT t m ()
248251runDOMTree = \case
249252 DOM_Node m -> m
250− DOM_Element m children -> m >>= \p -> localEnv (\_ -> HydrationRunnerState Nothing) (\e -> e { _hydrationRunnerEnv_parent = p }) $ runDOMForest children
251− DOM_Replace b -> runDOMForest =<< sample b
253+ DOM_Element m children -> m >>= localRunner (runDOMForest children) Nothing
254+ DOM_Replace start end b -> do
255+ start
256+ runDOMForest =<< lift (sample b)
257+ end
252258
253259data HydrationDomBuilderState t m = HydrationDomBuilderState
254260 { _hydrationDomBuilderState_delayed :: [DOM t m]
255261 }
256262
257263-- | The monad which performs the delayed actions to reuse prerendered nodes and set up events
258−type HydrationRunnerT t m a = HydrationDomBuilderT' HydrationRunnerEnv HydrationRunnerState t m a
264+-- State contains reference to the previous node sibling, if any.
265+-- TODO: This probably doesn't need to be a full transformer of `m`, seems like we only need (Reflex t, MonadJSM m, MonadReflexCreateTrigger t m, DomRenderHook t m)
266+newtype HydrationRunnerT t m a = HydrationRunnerT { unHydrationRunnerT :: StateT (Maybe Node) (ReaderT Node (DomRenderHookT t m)) a }
267+ deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException
268+#if MIN_VERSION_base(4,9,1)
269+ , MonadAsyncException
270+#endif
271+ )
259272
260−data HydrationRunnerState = HydrationRunnerState
261− { _hydrationRunnerState_previousNode :: {-# UNPACK #-} !(Maybe Node)
262− }
273+localRunner :: Monad m => HydrationRunnerT t m a -> Maybe Node -> Node -> HydrationRunnerT t m a
274+localRunner (HydrationRunnerT m) prev = HydrationRunnerT . lift . lift . runReaderT (evalStateT m prev)
275+
276+runHydrationRunnerT
277+ :: (MonadRef m, Ref m ~ IORef, Monad m, PerformEvent t m, MonadFix m, MonadReflexCreateTrigger t m, MonadJSM m, MonadJSM (Performable m))
278+ => HydrationRunnerT t m a -> Maybe Node -> Node -> Chan [DSum (EventTriggerRef t) TriggerInvocation] -> m a
279+runHydrationRunnerT (HydrationRunnerT m) prev parent = runDomRenderHookT (runReaderT (evalStateT m prev) parent)
280+
281+instance MonadTrans (HydrationRunnerT t) where
282+ lift = HydrationRunnerT . lift . lift . lift
263283
264284addAction :: Monad m => DOM t m -> HydrationDomBuilderT t m ()
265285addAction a = HydrationDomBuilderT $ modify $ \(HydrationDomBuilderState as) -> HydrationDomBuilderState (a : as)
@@ -272,33 +292,65 @@ addAction a = HydrationDomBuilderT $ modify $ \(HydrationDomBuilderState as) ->
272292-- static builder). The action runs in 'HydrationRunnerT', which performs the
273293-- DOM takeover and sets up the events, after which point this monad will
274294-- continue in the vein of 'ImmediateDomBuilderT'.
275−type HydrationDomBuilderT t m a = HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m a
276−
277−newtype HydrationDomBuilderT' env state t m a = HydrationDomBuilderT { unHydrationDomBuilderT :: ReaderT env (StateT state (RequesterT t JSM Identity (TriggerEventT t m))) a }
295+newtype HydrationDomBuilderT t m a = HydrationDomBuilderT { unHydrationDomBuilderT :: ReaderT HydrationDomBuilderEnv (StateT (HydrationDomBuilderState t m) (DomRenderHookT t m)) a }
278296 deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException
279297#if MIN_VERSION_base(4,9,1)
280298 , MonadAsyncException
281299#endif
282300 )
283301
284−instance PrimMonad m => PrimMonad (HydrationDomBuilderT' env state x m) where
285− type PrimState (HydrationDomBuilderT' env state x m) = PrimState m
302+instance PrimMonad m => PrimMonad (HydrationDomBuilderT x m) where
303+ type PrimState (HydrationDomBuilderT x m) = PrimState m
286304 primitive = lift . primitive
287305
288−instance MonadTrans (HydrationDomBuilderT' env state t) where
289− lift = HydrationDomBuilderT . lift . lift . lift . lift
306+instance MonadTrans (HydrationDomBuilderT t) where
307+ lift = HydrationDomBuilderT . lift . lift . lift
308+
309+-- | Shared behavior for HydrationDomBuilderT and HydrationRunnerT
310+newtype DomRenderHookT t m a = DomRenderHookT { unDomRenderHookT :: RequesterT t JSM Identity (TriggerEventT t m) a }
311+ deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException
312+#if MIN_VERSION_base(4,9,1)
313+ , MonadAsyncException
314+#endif
315+ )
316+
317+{-# INLINABLE runDomRenderHookT #-}
318+runDomRenderHookT
319+ :: (MonadFix m, PerformEvent t m, MonadReflexCreateTrigger t m, MonadJSM m, MonadJSM (Performable m), MonadRef m, Ref m ~ IORef)
320+ => DomRenderHookT t m a
321+ -> Chan [DSum (EventTriggerRef t) TriggerInvocation]
322+ -> m a
323+runDomRenderHookT (DomRenderHookT a) events = do
324+ flip runTriggerEventT events $ do
325+ rec (result, req) <- runRequesterT a rsp
326+ rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame f $
327+ traverseRequesterData (\r -> Identity <$> r) rm
328+ return result
329+ where
330+ runInAnimationFrame f x = void . DOM.inAnimationFrame' $ \_ -> do
331+ v <- synchronously x
332+ void . liftIO $ f v
333+
334+instance MonadTrans (DomRenderHookT t) where
335+ lift = DomRenderHookT . lift . lift
290336
291−instance (Reflex t, MonadFix m) => DomRenderHook t (HydrationDomBuilderT' env state t m) where
292− withRenderHook hook (HydrationDomBuilderT a) = do
293− e <- HydrationDomBuilderT ask
294− s <- HydrationDomBuilderT get
295− (a, s') <- HydrationDomBuilderT $ lift $ lift $ withRequesting $ \rsp -> do
296− (x, req) <- lift $ runRequesterT (runStateT (runReaderT a e) s) $ runIdentity <$> rsp
337+instance (Reflex t, MonadFix m) => DomRenderHook t (DomRenderHookT t m) where
338+ withRenderHook hook (DomRenderHookT a) = do
339+ DomRenderHookT $ withRequesting $ \rsp -> do
340+ (x, req) <- lift $ runRequesterT a $ runIdentity <$> rsp
297341 return (ffor req $ \rm -> hook $ traverseRequesterData (\r -> Identity <$> r) rm, x)
298− HydrationDomBuilderT $ put s'
299− pure a
300− requestDomAction = HydrationDomBuilderT . lift . lift . requestingIdentity
301− requestDomAction_ = HydrationDomBuilderT . lift . lift . requesting_
342+ requestDomAction = DomRenderHookT . requestingIdentity
343+ requestDomAction_ = DomRenderHookT . requesting_
344+
345+instance (Reflex t, MonadFix m) => DomRenderHook t (HydrationDomBuilderT t m) where
346+ withRenderHook hook = HydrationDomBuilderT . mapReaderT (mapStateT (withRenderHook hook)) . unHydrationDomBuilderT
347+ requestDomAction = HydrationDomBuilderT . lift . lift . requestDomAction
348+ requestDomAction_ = HydrationDomBuilderT . lift . lift . requestDomAction_
349+
350+instance (Reflex t, MonadFix m) => DomRenderHook t (HydrationRunnerT t m) where
351+ withRenderHook hook = HydrationRunnerT . mapStateT (mapReaderT (withRenderHook hook)) . unHydrationRunnerT
352+ requestDomAction = HydrationRunnerT . lift . lift . requestDomAction
353+ requestDomAction_ = HydrationRunnerT . lift . lift . requestDomAction_
302354
303355{-# INLINABLE runHydrationDomBuilderT #-}
304356runHydrationDomBuilderT
@@ -310,46 +362,28 @@ runHydrationDomBuilderT
310362 , MonadRef m
311363 , Ref m ~ IORef
312364 )
313− => HydrationDomBuilderT' env state t m a
314− -> env
315− -> state
365+ => HydrationDomBuilderT t m a
366+ -> HydrationDomBuilderEnv
367+ -> HydrationDomBuilderState t m
316368 -> Chan [DSum (EventTriggerRef t) TriggerInvocation]
317− -> m (a, state)
318−runHydrationDomBuilderT (HydrationDomBuilderT a) env st events = do
319− flip runTriggerEventT events $ do
320− rec (result, req) <- runRequesterT (runStateT (runReaderT a env) st) rsp
321− rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame f $
322− traverseRequesterData (\r -> Identity <$> r) rm
323− return result
324− where
325− runInAnimationFrame f x = void . DOM.inAnimationFrame' $ \_ -> do
326− v <- synchronously x
327− void . liftIO $ f v
369+ -> m (a, HydrationDomBuilderState t m)
370+runHydrationDomBuilderT (HydrationDomBuilderT a) env st events = runDomRenderHookT (runStateT (runReaderT a env) st) events
328371
329−instance Monad m => HasDocument (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) where
372+instance Monad m => HasDocument (HydrationDomBuilderT t m) where
330373 {-# INLINABLE askDocument #-}
331− askDocument = askDocumentEnv
332−
333−class HasDocEnv env where
334− askDocumentEnv :: Monad m => HydrationDomBuilderT' env state t m DOM.Document
335−
336−instance HasDocEnv (HydrationDomBuilderEnv t m) where
337− askDocumentEnv = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_document
338−
339−instance HasDocEnv HydrationRunnerEnv where
340− askDocumentEnv = HydrationDomBuilderT $ asks _hydrationRunnerEnv_document
374+ askDocument = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_document
341375
342376{-# INLINABLE localEnv #-}
343−localEnv :: Monad m => (s -> s) -> (e -> e) -> HydrationDomBuilderT' e s t m a -> HydrationDomBuilderT' e s t m a
377+localEnv :: Monad m => (HydrationDomBuilderState t m -> HydrationDomBuilderState t m) -> (HydrationDomBuilderEnv -> HydrationDomBuilderEnv) -> HydrationDomBuilderT t m a -> HydrationDomBuilderT t m a
344378localEnv f g (HydrationDomBuilderT m) = HydrationDomBuilderT $ do
345379 env <- ask
346380 hs <- get
347381 lift $ lift $ evalStateT (runReaderT m $ g env) (f hs)
348382
349383{-# INLINABLE append #-}
350−append :: (MonadJSM m, HasParent env) => DOM.Node -> HydrationDomBuilderT' env state t m ()
384+append :: MonadJSM m => DOM.Node -> HydrationDomBuilderT t m ()
351385append n = do
352− p <- askParent
386+ p <- getParent
353387 appendChild_ p n
354388 return ()
355389
@@ -358,60 +392,43 @@ data HydrationMode
358392 | HydrationMode_Immediate
359393 deriving (Eq, Ord, Show)
360394
361−class HasParent env where
362− askParent :: (Monad m, MonadIO m) => HydrationDomBuilderT' env state t m DOM.Node
363−
364−instance HasParent (HydrationDomBuilderEnv t m) where
365− {-# INLINABLE askParent #-}
366− askParent = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_parent)
367−
368−instance HasParent HydrationRunnerEnv where
369− {-# INLINABLE askParent #-}
370− askParent = HydrationDomBuilderT $ asks _hydrationRunnerEnv_parent
395+{-# INLINABLE askParent #-}
396+askParent :: Monad m => HydrationRunnerT t m DOM.Node
397+askParent = HydrationRunnerT ask
371398
372−class HasUnreadyChildren env where
373− askUnreadyChildren :: Monad m => HydrationDomBuilderT' env state t m (IORef Word)
374− askCommitAction :: Monad m => HydrationDomBuilderT' env state t m (JSM ())
399+{-# INLINABLE getPreviousNode #-}
400+getPreviousNode :: Monad m => HydrationRunnerT t m (Maybe DOM.Node)
401+getPreviousNode = HydrationRunnerT get
375402
376−instance HasUnreadyChildren (HydrationDomBuilderEnv t m) where
377− {-# INLINABLE askUnreadyChildren #-}
378− askUnreadyChildren = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_unreadyChildren
379− {-# INLINABLE askCommitAction #-}
380− askCommitAction = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_commitAction
403+{-# INLINABLE setPreviousNode #-}
404+setPreviousNode :: Monad m => Maybe DOM.Node -> HydrationRunnerT t m ()
405+setPreviousNode = HydrationRunnerT . put
381406
382−instance HasUnreadyChildren HydrationRunnerEnv where
383− {-# INLINABLE askUnreadyChildren #-}
384− askUnreadyChildren = HydrationDomBuilderT $ asks _hydrationRunnerEnv_unreadyChildren
385− {-# INLINABLE askCommitAction #-}
386− askCommitAction = HydrationDomBuilderT $ asks _hydrationRunnerEnv_commitAction
407+{-# INLINABLE getParent #-}
408+getParent :: MonadIO m => HydrationDomBuilderT t m DOM.Node
409+getParent = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_parent)
387410
411+{-# INLINABLE askUnreadyChildren #-}
412+askUnreadyChildren :: Monad m => HydrationDomBuilderT t m (IORef Word)
413+askUnreadyChildren = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_unreadyChildren
388414
389−class HasPreviousNode state where
390− getPreviousNode :: Monad m => HydrationDomBuilderT' env state t m (Maybe DOM.Node)
391− setPreviousNode :: Monad m => Maybe DOM.Node -> HydrationDomBuilderT' env state t m ()
415+{-# INLINABLE askCommitAction #-}
416+askCommitAction :: Monad m => HydrationDomBuilderT t m (JSM ())
417+askCommitAction = HydrationDomBuilderT $ asks _hydrationDomBuilderEnv_commitAction
392418
393−instance HasPreviousNode HydrationRunnerState where
394− {-# INLINABLE getPreviousNode #-}
395− getPreviousNode = HydrationDomBuilderT $ gets _hydrationRunnerState_previousNode
396− {-# INLINABLE setPreviousNode #-}
397− setPreviousNode n = HydrationDomBuilderT $ modify $ \hs -> hs { _hydrationRunnerState_previousNode = n }
398−
399−class HasHydrationMode env where
400− getHydrationMode :: MonadIO m => HydrationDomBuilderT' env state t m HydrationMode
401−
402−instance HasHydrationMode (HydrationDomBuilderEnv t m) where
403− {-# INLINABLE getHydrationMode #-}
404− getHydrationMode = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_hydrationMode)
419+{-# INLINABLE getHydrationMode #-}
420+getHydrationMode :: MonadIO m => HydrationDomBuilderT t m HydrationMode
421+getHydrationMode = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_hydrationMode)
405422
406423{-# INLINABLE askEvents #-}
407−askEvents :: Monad m => HydrationDomBuilderT' env state t m (Chan [DSum (EventTriggerRef t) TriggerInvocation])
408−askEvents = HydrationDomBuilderT . lift . lift . lift $ TriggerEventT.askEvents
424+askEvents :: Monad m => HydrationDomBuilderT t m (Chan [DSum (EventTriggerRef t) TriggerInvocation])
425+askEvents = HydrationDomBuilderT . lift . lift . DomRenderHookT . lift $ TriggerEventT.askEvents
409426
410427
411428{-# INLINABLE makeNodeInternal #-}
412429makeNodeInternal
413− :: forall node env state t m. (MonadJSM m, IsNode node, Typeable node, HasParent env)
414− => HydrationDomBuilderT' env state t m node -> HydrationDomBuilderT' env state t m node
430+ :: forall node t m. (MonadJSM m, IsNode node, Typeable node)
431+ => HydrationDomBuilderT t m node -> HydrationDomBuilderT t m node
415432makeNodeInternal mkNode = do
416433 liftIO $ putStr $ show (typeRep (Proxy :: Proxy node)) <> ": "
417434 liftIO $ putStrLn $ "Not in hydration mode, creating node"
@@ -424,8 +441,8 @@ makeNodeInternal mkNode = do
424441-- correct. It skips any nodes that are the wrong type, or that fail the
425442-- @check@. The previous node reference is also updated.
426443hydrateNode
427− :: (MonadJSM m, IsNode node, Typeable node, HasPreviousNode state, HasParent env)
428− => (node -> HydrationDomBuilderT' env state t m Bool) -> HydrationDomBuilderT' env state t m node -> (DOM.JSVal -> node) -> HydrationDomBuilderT' env state t m node
444+ :: (MonadJSM m, IsNode node, Typeable node)
445+ => (node -> HydrationRunnerT t m Bool) -> HydrationRunnerT t m node -> (DOM.JSVal -> node) -> HydrationRunnerT t m node
429446hydrateNode check mkNode constructor = do
430447 parent <- askParent
431448 liftIO $ putStr $ show (typeRep constructor) <> ": "
@@ -540,7 +557,7 @@ makeElement elementTag cfg child = do
540557 ctx <- askJSM
541558 events <- askEvents
542559
543− let buildElement :: HydrationDomBuilderT' env state t m DOM.Element
560+ let buildElement :: MonadJSM n => n DOM.Element
544561 buildElement = do
545562 e <- uncheckedCastTo DOM.Element <$> case cfg ^. namespace of
546563 Nothing -> createElement doc elementTag
@@ -550,7 +567,7 @@ makeElement elementTag cfg child = do
550567 Just ans -> setAttributeNS e (Just ans) n v
551568 pure e
552569 ssrAttr = "ssr" :: DOM.JSString
553− hasSSRAttribute :: DOM.Element -> HydrationDomBuilderT' env state t m Bool
570+ hasSSRAttribute :: DOM.Element -> HydrationRunnerT t m Bool
554571 hasSSRAttribute e = case cfg ^. namespace of
555572 Nothing -> hasAttribute e ssrAttr -- TODO: disabled for debugging <* removeAttribute e ssrAttr
556573 Just ns -> hasAttributeNS e (Just ns) ssrAttr -- TODO: disabled for debugging <* removeAttributeNS e (Just ns) ssrAttr
@@ -628,13 +645,14 @@ makeElement elementTag cfg child = do
628645textNodeInternal :: (MonadJSM m, MonadFix m, ToDOMString contents, Reflex t) => contents -> Maybe (Event t contents) -> HydrationDomBuilderT t m DOM.Text
629646textNodeInternal !t mSetContents = getHydrationMode >>= \case
630647 HydrationMode_Immediate -> do
631− n <- makeNodeInternal (askDocumentEnv >>= \doc -> createTextNode doc t)
648+ n <- makeNodeInternal (askDocument >>= \doc -> createTextNode doc t)
632649 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
633650 pure n
634651 HydrationMode_Hydrating -> do
652+ doc <- askDocument
635653 let activateText = do
636654 liftIO $ putStrLn $ "Action: Text: " <> show (DOM.toJSString t)
637− n <- hydrateNode (const $ pure True) (askDocumentEnv >>= \doc -> createTextNode doc t) DOM.Text
655+ n <- hydrateNode (const $ pure True) (createTextNode doc t) DOM.Text
638656 --case mSetContents of
639657 -- Nothing -> liftIO $ putStrLn "No update events for text"
640658 -- Just e -> requestDomAction_ $ setNodeValue n . Just <$> e
@@ -646,20 +664,21 @@ textNodeInternal !t mSetContents = getHydrationMode >>= \case
646664commentNodeInternal :: (MonadJSM m, MonadFix m, ToDOMString contents, Reflex t) => contents -> Maybe (Event t contents) -> HydrationDomBuilderT t m DOM.Comment
647665commentNodeInternal !t mSetContents = getHydrationMode >>= \case
648666 HydrationMode_Immediate -> do
649− n <- makeNodeInternal (askDocumentEnv >>= \doc -> createComment doc t)
667+ n <- makeNodeInternal (askDocument >>= \doc -> createComment doc t)
650668 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
651669 pure n
652670 HydrationMode_Hydrating -> do
671+ doc <- askDocument
653672 let activateComment = do
654673 liftIO $ putStrLn $ "Action: Comment: " <> show (DOM.toJSString t)
655− n <- hydrateNode (const $ pure True) (askDocumentEnv >>= \doc -> createComment doc t) DOM.Comment
674+ n <- hydrateNode (const $ pure True) (createComment doc t) DOM.Comment
656675 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
657676 addAction $ DOM_Node activateComment
658677 pure $ error "commentNodeInternal: DOM.Comment"
659678
660679-- | We leave markers in the static builder as comments, and rip these comments
661680-- out at hydration time, replacing them with empty text nodes.
662−skipToAndReplaceComment :: (MonadJSM m, Reflex t, MonadFix m) => Text -> IORef Text -> HydrationDomBuilderT t m (IORef DOM.Text, IORef Text)
681+skipToAndReplaceComment :: (MonadJSM m, Reflex t, MonadFix m) => Text -> IORef Text -> HydrationDomBuilderT t m (HydrationRunnerT t m (), IORef DOM.Text, IORef Text)
663682skipToAndReplaceComment prefix key0Ref = getHydrationMode >>= \case
664683 HydrationMode_Immediate -> do
665684 -- If we're in immediate mode, we don't try to replace an existing comment,
@@ -668,7 +687,7 @@ skipToAndReplaceComment prefix key0Ref = getHydrationMode >>= \case
668687 append $ toNode t
669688 textNodeRef <- liftIO $ newIORef t
670689 keyRef <- liftIO $ newIORef ""
671− pure (textNodeRef, keyRef)
690+ pure (pure (), textNodeRef, keyRef)
672691 HydrationMode_Hydrating -> do
673692 doc <- askDocument
674693 textNodeRef <- liftIO $ newIORef $ error "textNodeRef not yet initialized"
@@ -703,17 +722,17 @@ skipToAndReplaceComment prefix key0Ref = getHydrationMode >>= \case
703722 liftIO $ do
704723 writeIORef textNodeRef textNode
705724 writeIORef keyRef key
706− addAction $ DOM_Node switchComment
707− pure (textNodeRef, keyRef)
725+-- addAction $ DOM_Node switchComment
726+ pure (switchComment, textNodeRef, keyRef)
708727
709728
710−skipToReplaceStart :: (MonadJSM m, Reflex t, MonadFix m) => HydrationDomBuilderT t m (IORef DOM.Text, IORef Text)
729+skipToReplaceStart :: (MonadJSM m, Reflex t, MonadFix m) => HydrationDomBuilderT t m (HydrationRunnerT t m (), IORef DOM.Text, IORef Text)
711730skipToReplaceStart = skipToAndReplaceComment "replace-start" =<< liftIO (newIORef "")
712731
713−skipToReplaceEnd :: (MonadJSM m, Reflex t, MonadFix m) => IORef Text -> HydrationDomBuilderT t m (IORef DOM.Text)
714−skipToReplaceEnd key = fmap fst $ skipToAndReplaceComment "replace-end" key
732+skipToReplaceEnd :: (MonadJSM m, Reflex t, MonadFix m) => IORef Text -> HydrationDomBuilderT t m (HydrationRunnerT t m (), IORef DOM.Text)
733+skipToReplaceEnd key = fmap (\(m,e,_) -> (m,e)) $ skipToAndReplaceComment "replace-end" key
715734
716−instance (HasUnreadyChildren env, SupportsHydrationDomBuilder t m) => NotReady t (HydrationDomBuilderT' env state t m) where
735+instance SupportsHydrationDomBuilder t m => NotReady t (HydrationDomBuilderT t m) where
717736 notReadyUntil e = do
718737 eOnce <- headE e
719738 unreadyChildren <- askUnreadyChildren
@@ -730,8 +749,8 @@ instance (HasUnreadyChildren env, SupportsHydrationDomBuilder t m) => NotReady t
730749 unreadyChildren <- askUnreadyChildren
731750 liftIO $ modifyIORef' unreadyChildren succ
732751
733−instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) where
734− type DomBuilderSpace (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) = HydrationDomSpace
752+instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT t m) where
753+ type DomBuilderSpace (HydrationDomBuilderT t m) = HydrationDomSpace
735754 {-# INLINABLE textNode #-}
736755 textNode (TextNodeConfig initialContents mSetContents) = do
737756 liftIO $ putStrLn $ "Text: " <> T.unpack initialContents
@@ -870,8 +889,8 @@ extractFragment fragment = do
870889 extractBetweenExclusive (_hydrationDomFragment_document fragment) before after
871890 liftIO $ writeIORef (_hydrationDomFragment_state fragment) FragmentState_Unmounted
872891
873−instance SupportsHydrationDomBuilder t m => MountableDomBuilder t (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) where
874− type DomFragment (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) = HydrationDomFragment
892+instance SupportsHydrationDomBuilder t m => MountableDomBuilder t (HydrationDomBuilderT t m) where
893+ type DomFragment (HydrationDomBuilderT t m) = HydrationDomFragment
875894 buildDomFragment w = do
876895 df <- createDocumentFragment =<< askDocument
877896 p <- liftIO $ newIORef $ toNode df
@@ -879,7 +898,7 @@ instance SupportsHydrationDomBuilder t m => MountableDomBuilder t (HydrationDomB
879898 state <- liftIO $ newIORef FragmentState_Unmounted
880899 return (HydrationDomFragment df state, result)
881900 mountDomFragment fragment setFragment = do
882− parent <- askParent
901+ parent <- getParent
883902 extractFragment fragment
884903 before <- textNodeInternal ("" :: Text) Nothing
885904 appendChild_ parent $ _hydrationDomFragment_document fragment
@@ -892,14 +911,20 @@ instance SupportsHydrationDomBuilder t m => MountableDomBuilder t (HydrationDomB
892911 liftIO $ writeIORef (_hydrationDomFragment_state childFragment) $ FragmentState_Mounted (before, after)
893912 liftIO $ writeIORef (_hydrationDomFragment_state fragment) $ FragmentState_Mounted (before, after)
894913
895−instance (Reflex t, Adjustable t m, MonadJSM m, MonadHold t m, MonadFix m, PrimMonad m, Ref m ~ IORef, PerformEvent t m, MonadReflexCreateTrigger t m, MonadJSM (Performable m), MonadRef m) => Adjustable t (HydrationDomBuilderT' (HydrationDomBuilderEnv t m) (HydrationDomBuilderState t m) t m) where
914+instance (Reflex t, Monad m, Adjustable t m, MonadHold t m, MonadFix m) => Adjustable t (DomRenderHookT t m) where
915+ runWithReplace a0 a' = DomRenderHookT $ runWithReplace (unDomRenderHookT a0) (fmapCheap unDomRenderHookT a')
916+ traverseIntMapWithKeyWithAdjust f m = DomRenderHookT . traverseIntMapWithKeyWithAdjust (\k -> unDomRenderHookT . f k) m
917+ traverseDMapWithKeyWithAdjust f m = DomRenderHookT . traverseDMapWithKeyWithAdjust (\k -> unDomRenderHookT . f k) m
918+ traverseDMapWithKeyWithAdjustWithMove f m = DomRenderHookT . traverseDMapWithKeyWithAdjustWithMove (\k -> unDomRenderHookT . f k) m
919+
920+instance (Reflex t, Adjustable t m, MonadJSM m, MonadHold t m, MonadFix m, PrimMonad m, Ref m ~ IORef, PerformEvent t m, MonadReflexCreateTrigger t m, MonadJSM (Performable m), MonadRef m) => Adjustable t (HydrationDomBuilderT t m) where
896921 {-# INLINABLE runWithReplace #-}
897922 runWithReplace a0 a' = do
898923 liftIO $ putStrLn "In runWithReplace"
899924 initialEnv <- HydrationDomBuilderT ask
900925 let hydrating = _hydrationDomBuilderEnv_hydrationMode initialEnv
901926 initialHydrationMode <- liftIO $ readIORef hydrating
902− (before, beforeKey) <- skipToReplaceStart
927+ (hydrateStart, before, beforeKey) <- skipToReplaceStart
903928 let parentUnreadyChildren = _hydrationDomBuilderEnv_unreadyChildren initialEnv
904929 haveEverBeenReady <- liftIO $ newIORef False
905930 currentCohort <- liftIO $ newIORef (-1 :: Int) -- Equal to the cohort currently in the DOM
@@ -914,10 +939,8 @@ instance (Reflex t, Adjustable t m, MonadJSM m, MonadHold t m, MonadFix m, PrimM
914939 when (new == 0) $ _hydrationDomBuilderEnv_commitAction initialEnv
915940 -- We draw 'after' in this roundabout way to avoid using MonadFix
916941 doc <- askDocument
917− parent <- askParent
918− after <- skipToReplaceEnd beforeKey
919− -- TODO improve skipToReplace nonsense
920− addAction $ DOM_Node $ setPreviousNode . Just . toNode =<< liftIO (readIORef before)
942+ parent <- getParent
943+ (hydrateEnd, after) <- skipToReplaceEnd beforeKey
921944 let drawInitialChild = do
922945 liftIO $ putStrLn "drawInitialChild"
923946 p <- liftIO (readIORef hydrating) >>= \case
@@ -969,7 +992,7 @@ instance (Reflex t, Adjustable t m, MonadJSM m, MonadHold t m, MonadFix m, PrimM
969992 return (actions, result)
970993 let (hydrationAction, commitAction) = fanEither $ fmap fst evt
971994 base :: Behavior t [DOM t m] <- hold (fst result0) hydrationAction
972− addAction $ DOM_Replace base
995+ addAction $ DOM_Replace hydrateStart hydrateEnd base
973996 requestDomAction_ $ fmapMaybe id commitAction
974997 return (snd result0, fmap snd evt)
975998
@@ -1062,7 +1085,12 @@ traverseDMapWithKeyWithAdjust' = do
10621085 liftIO $ writeIORef placeholders $! fromMaybe phs $ apply (weakenPatchDMapWith (\(Compose (_, ph, _, _)) -> ph) $ PatchDMap p) phs
10631086
10641087{-# INLINABLE traverseIntMapWithKeyWithAdjust' #-}
1065−traverseIntMapWithKeyWithAdjust' :: forall t m v v'. (Adjustable t m, MonadHold t m, MonadFix m, MonadIO m, MonadJSM m, PrimMonad m) => (IntMap.Key -> v -> HydrationDomBuilderT t m v') -> IntMap v -> Event t (PatchIntMap v) -> HydrationDomBuilderT t m (IntMap v', Event t (PatchIntMap v'))
1088+traverseIntMapWithKeyWithAdjust'
1089+ :: forall t m v v'. (Adjustable t m, MonadHold t m, MonadFix m, MonadIO m, MonadJSM m, PrimMonad m)
1090+ => (IntMap.Key -> v -> HydrationDomBuilderT t m v')
1091+ -> IntMap v
1092+ -> Event t (PatchIntMap v)
1093+ -> HydrationDomBuilderT t m (IntMap v', Event t (PatchIntMap v'))
10661094traverseIntMapWithKeyWithAdjust' = do
10671095 let updateChildUnreadiness (p@(PatchIntMap pInner) :: PatchIntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')) old = do
10681096 let new :: IntMap.Key -> Maybe (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v') -> IO (Maybe (IORef ChildReadyStateInt))
@@ -1099,10 +1127,10 @@ hoistTraverseIntMapWithKeyWithAdjust :: forall v v' t m p.
10991127 , Monoid (p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'))
11001128 , Functor p
11011129 )
1102− => ( (IntMap.Key -> v -> RequesterT t JSM Identity (TriggerEventT t m) (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'))
1130+ => ( (IntMap.Key -> v -> DomRenderHookT t m (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'))
11031131 -> IntMap v
11041132 -> Event t (p v)
1105− -> RequesterT t JSM Identity (TriggerEventT t m) (IntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'), Event t (p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')))
1133+ -> DomRenderHookT t m (IntMap (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v'), Event t (p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')))
11061134 ) -- ^ The base monad's traversal
11071135 -> (p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v') -> IntMap (IORef ChildReadyStateInt) -> IO (IntMap (IORef ChildReadyStateInt))) -- ^ Given a patch for the children DOM elements, produce a patch for the childrens' unreadiness state
11081136 -> (IORef (IntMap DOM.Text) -> IORef DOM.Text -> p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v') -> JSM ()) -- ^ Apply a patch to the DOM
@@ -1111,7 +1139,7 @@ hoistTraverseIntMapWithKeyWithAdjust :: forall v v' t m p.
11111139 -> Event t (p v)
11121140 -> HydrationDomBuilderT t m (IntMap v', Event t (p v'))
11131141hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_ f dm0 dm' = do
1114− (_, key) <- skipToReplaceStart
1142+ (hydrateStart, _, key) <- skipToReplaceStart
11151143 initialEnv <- HydrationDomBuilderT ask
11161144 let parentUnreadyChildren = _hydrationDomBuilderEnv_unreadyChildren initialEnv
11171145 pendingChange :: IORef (IntMap (IORef ChildReadyStateInt), p (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')) <- liftIO $ newIORef mempty
@@ -1168,7 +1196,7 @@ hoistTraverseIntMapWithKeyWithAdjust base updateChildUnreadiness applyDomUpdate_
11681196 getHydrationMode >>= \case
11691197 HydrationMode_Immediate -> void $ IntMap.traverseWithKey (\_ (df, _, _, _) -> void $ append $ toNode df) children0
11701198 _ -> pure ()
1171− lastPlaceholderRef <- skipToReplaceEnd key
1199+ (hydrateEnd, lastPlaceholderRef) <- skipToReplaceEnd key
11721200 requestDomAction_ $ ffor children' $ \p -> do
11731201 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
11741202 newUnready <- liftIO $ updateChildUnreadiness p oldUnready
@@ -1193,10 +1221,10 @@ hoistTraverseWithKeyWithAdjust :: forall (k :: * -> *) v v' t m p.
11931221 , Patch (p k (Constant Int))
11941222 )
11951223 => (forall vv vv'.
1196− (forall a. k a -> vv a -> RequesterT t JSM Identity (TriggerEventT t m) (vv' a))
1224+ (forall a. k a -> vv a -> DomRenderHookT t m (vv' a))
11971225 -> DMap k vv
11981226 -> Event t (p k vv)
1199− -> RequesterT t JSM Identity (TriggerEventT t m) (DMap k vv', Event t (p k vv'))
1227+ -> DomRenderHookT t m (DMap k vv', Event t (p k vv'))
12001228 ) -- ^ The base monad's traversal
12011229 -> (forall vv vv'. (forall a. vv a -> vv' a) -> p k vv -> p k vv') -- ^ A way of mapping over the patch type
12021230 -> (p k (Compose ((,,,) DOM.DocumentFragment DOM.Text (IORef (ChildReadyState k))) v') -> DMap k (Constant (IORef (ChildReadyState k))) -> IO (DMap k (Constant (IORef (ChildReadyState k))))) -- ^ Given a patch for the children DOM elements, produce a patch for the childrens' unreadiness state
@@ -1206,7 +1234,7 @@ hoistTraverseWithKeyWithAdjust :: forall (k :: * -> *) v v' t m p.
12061234 -> Event t (p k v)
12071235 -> HydrationDomBuilderT t m (DMap k v', Event t (p k v'))
12081236hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpdate_ (f :: forall a. k a -> v a -> HydrationDomBuilderT t m (v' a)) (dm0 :: DMap k v) dm' = do
1209− (_, key) <- skipToReplaceStart
1237+ (hydrateStart, _, key) <- skipToReplaceStart
12101238 initialEnv <- HydrationDomBuilderT ask
12111239 let parentUnreadyChildren = _hydrationDomBuilderEnv_unreadyChildren initialEnv
12121240 pendingChange :: IORef (DMap k (Constant (IORef (ChildReadyState k))), p k (Compose ((,,,) DOM.DocumentFragment DOM.Text (IORef (ChildReadyState k))) v')) <- liftIO $ newIORef mempty
@@ -1263,7 +1291,7 @@ hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpda
12631291 getHydrationMode >>= \case
12641292 HydrationMode_Immediate -> void $ DMap.traverseWithKey (\_ (Compose (df, _, _, _)) -> Constant () <$ append (toNode df)) children0
12651293 _ -> pure ()
1266− lastPlaceholderRef <- skipToReplaceEnd key
1294+ (hydrateEnd, lastPlaceholderRef) <- skipToReplaceEnd key
12671295 requestDomAction_ $ ffor children' $ \p -> do
12681296 (oldUnready, oldP) <- liftIO $ readIORef pendingChange
12691297 newUnready <- liftIO $ updateChildUnreadiness p oldUnready
@@ -1276,10 +1304,10 @@ hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpda
12761304{-# INLINABLE drawChildUpdate #-}
12771305drawChildUpdate :: (MonadIO m, MonadJSM m)
12781306 => IORef (HydrationDomBuilderState t m)
1279− -> HydrationDomBuilderEnv t m
1307+ -> HydrationDomBuilderEnv
12801308 -> (IORef (ChildReadyState k) -> JSM ()) -- This will NOT be called if the child is ready at initialization time; instead, the ChildReadyState return value will be ChildReadyState_Ready
12811309 -> HydrationDomBuilderT t m (v' a)
1282− -> RequesterT t JSM Identity (TriggerEventT t m) (Compose ((,,,) DOM.DocumentFragment DOM.Text (IORef (ChildReadyState k))) v' a)
1310+ -> DomRenderHookT t m (Compose ((,,,) DOM.DocumentFragment DOM.Text (IORef (ChildReadyState k))) v' a)
12831311drawChildUpdate stateRef initialEnv markReady child = do
12841312 childReadyState <- liftIO $ newIORef $ ChildReadyState_Unready Nothing
12851313 let doc = _hydrationDomBuilderEnv_document initialEnv
@@ -1314,10 +1342,10 @@ drawChildUpdate stateRef initialEnv markReady child = do
13141342{-# INLINABLE drawChildUpdateInt #-}
13151343drawChildUpdateInt :: (MonadIO m, MonadJSM m)
13161344 => IORef (HydrationDomBuilderState t m)
1317− -> HydrationDomBuilderEnv t m
1345+ -> HydrationDomBuilderEnv
13181346 -> (IORef ChildReadyStateInt -> JSM ()) -- This will NOT be called if the child is ready at initialization time; instead, the ChildReadyState return value will be ChildReadyState_Ready
13191347 -> HydrationDomBuilderT t m v'
1320− -> RequesterT t JSM Identity (TriggerEventT t m) (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')
1348+ -> DomRenderHookT t m (DOM.DocumentFragment, DOM.Text, IORef ChildReadyStateInt, v')
13211349drawChildUpdateInt stateRef initialEnv markReady child = do
13221350 childReadyState <- liftIO $ newIORef $ ChildReadyStateInt_Unready Nothing
13231351 let doc = _hydrationDomBuilderEnv_document initialEnv
@@ -1370,24 +1398,30 @@ insertBefore new existing = do
13701398 liftIO $ putStrLn "insertBefore2"
13711399 DOM.insertBefore_ p new (Just existing) -- If there's no parent, that means we've been removed from the DOM; this should not happen if the we're removing ourselves from the performEvent properly
13721400
1373−instance PerformEvent t m => PerformEvent t (HydrationDomBuilderT' env state t m) where
1374− type Performable (HydrationDomBuilderT' env state t m) = Performable m
1401+instance PerformEvent t m => PerformEvent t (HydrationDomBuilderT t m) where
1402+ type Performable (HydrationDomBuilderT t m) = Performable m
13751403 {-# INLINABLE performEvent_ #-}
13761404 performEvent_ e = lift $ performEvent_ e
13771405 {-# INLINABLE performEvent #-}
13781406 performEvent e = lift $ performEvent e
13791407
1380−instance PostBuild t m => PostBuild t (HydrationDomBuilderT' env state t m) where
1408+instance PostBuild t m => PostBuild t (HydrationDomBuilderT t m) where
13811409 {-# INLINABLE getPostBuild #-}
13821410 getPostBuild = lift getPostBuild
13831411
1384−instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (HydrationDomBuilderT' env state t m) where
1412+instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (HydrationDomBuilderT t m) where
13851413 {-# INLINABLE newEventWithTrigger #-}
13861414 newEventWithTrigger = lift . newEventWithTrigger
13871415 {-# INLINABLE newFanEventWithTrigger #-}
13881416 newFanEventWithTrigger f = lift $ newFanEventWithTrigger f
13891417
1390−instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) => TriggerEvent t (HydrationDomBuilderT' env state t m) where
1418+instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (HydrationRunnerT t m) where
1419+ {-# INLINABLE newEventWithTrigger #-}
1420+ newEventWithTrigger = lift . newEventWithTrigger
1421+ {-# INLINABLE newFanEventWithTrigger #-}
1422+ newFanEventWithTrigger f = lift $ newFanEventWithTrigger f
1423+
1424+instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) => TriggerEvent t (HydrationDomBuilderT t m) where
13911425 {-# INLINABLE newTriggerEvent #-}
13921426 newTriggerEvent = HydrationDomBuilderT . lift . lift $ newTriggerEvent
13931427 {-# INLINABLE newTriggerEventWithOnComplete #-}
@@ -1395,12 +1429,20 @@ instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) =>
13951429 {-# INLINABLE newEventWithLazyTriggerWithOnComplete #-}
13961430 newEventWithLazyTriggerWithOnComplete f = HydrationDomBuilderT . lift . lift $ newEventWithLazyTriggerWithOnComplete f
13971431
1398−instance HasJSContext m => HasJSContext (HydrationDomBuilderT' env state t m) where
1399− type JSContextPhantom (HydrationDomBuilderT' env state t m) = JSContextPhantom m
1432+instance (Monad m, MonadRef m, Ref m ~ Ref IO, MonadReflexCreateTrigger t m) => TriggerEvent t (DomRenderHookT t m) where
1433+ {-# INLINABLE newTriggerEvent #-}
1434+ newTriggerEvent = DomRenderHookT . lift $ newTriggerEvent
1435+ {-# INLINABLE newTriggerEventWithOnComplete #-}
1436+ newTriggerEventWithOnComplete = DomRenderHookT . lift $ newTriggerEventWithOnComplete
1437+ {-# INLINABLE newEventWithLazyTriggerWithOnComplete #-}
1438+ newEventWithLazyTriggerWithOnComplete f = DomRenderHookT . lift $ newEventWithLazyTriggerWithOnComplete f
1439+
1440+instance HasJSContext m => HasJSContext (HydrationDomBuilderT t m) where
1441+ type JSContextPhantom (HydrationDomBuilderT t m) = JSContextPhantom m
14001442 askJSContext = lift askJSContext
14011443
1402−instance MonadRef m => MonadRef (HydrationDomBuilderT' env state t m) where
1403− type Ref (HydrationDomBuilderT' env state t m) = Ref m
1444+instance MonadRef m => MonadRef (HydrationDomBuilderT t m) where
1445+ type Ref (HydrationDomBuilderT t m) = Ref m
14041446 {-# INLINABLE newRef #-}
14051447 newRef = lift . newRef
14061448 {-# INLINABLE readRef #-}
@@ -1408,12 +1450,12 @@ instance MonadRef m => MonadRef (HydrationDomBuilderT' env state t m) where
14081450 {-# INLINABLE writeRef #-}
14091451 writeRef r = lift . writeRef r
14101452
1411−instance MonadAtomicRef m => MonadAtomicRef (HydrationDomBuilderT' env state t m) where
1453+instance MonadAtomicRef m => MonadAtomicRef (HydrationDomBuilderT t m) where
14121454 {-# INLINABLE atomicModifyRef #-}
14131455 atomicModifyRef r = lift . atomicModifyRef r
14141456
1415−instance (HasJS x m, ReflexHost t) => HasJS x (HydrationDomBuilderT' env state t m) where
1416− type JSX (HydrationDomBuilderT' env state t m) = JSX m
1457+instance (HasJS x m, ReflexHost t) => HasJS x (HydrationDomBuilderT t m) where
1458+ type JSX (HydrationDomBuilderT t m) = JSX m
14171459 liftJS = lift . liftJS
14181460
14191461{-# INLINABLE wrapDomEvent #-}
@@ -1433,11 +1475,11 @@ subscribeDomEvent elementOnevent getValue eventChan et = elementOnevent $ do
14331475 etr <- newIORef $ Just et
14341476 writeChan eventChan [EventTriggerRef etr :=> TriggerInvocation v (return ())]
14351477
1436−instance MonadSample t m => MonadSample t (HydrationDomBuilderT' env state t m) where
1478+instance MonadSample t m => MonadSample t (HydrationDomBuilderT t m) where
14371479 {-# INLINABLE sample #-}
14381480 sample = lift . sample
14391481
1440−instance MonadHold t m => MonadHold t (HydrationDomBuilderT' env state t m) where
1482+instance MonadHold t m => MonadHold t (HydrationDomBuilderT t m) where
14411483 {-# INLINABLE hold #-}
14421484 hold v0 v' = lift $ hold v0 v'
14431485 {-# INLINABLE holdDyn #-}