@@ -9,6 +9,8 @@ module Halogen.VDom.DOM
9
9
, hydrateVDom
10
10
, hydrateText
11
11
, hydrateElem
12
+ , hydrateKeyed
13
+ , hydrateWidget
12
14
) where
13
15
14
16
import Prelude
@@ -31,7 +33,6 @@ import Halogen.VDom.Machine (Machine, Step, Step'(..), extract, halt, mkStep, st
31
33
import Halogen.VDom.Machine as Machine
32
34
import Halogen.VDom.Types (ElemName (..), Namespace (..), VDom (..), runGraft )
33
35
import Halogen.VDom.Util as Util
34
- import Unsafe.Coerce (unsafeCoerce )
35
36
import Web.DOM.Document (Document ) as DOM
36
37
import Web.DOM.Element (Element ) as DOM
37
38
import Web.DOM.Element as DOMElement
@@ -116,7 +117,7 @@ hydrateVDom hydrationSpec@(VDomHydrationSpec { vdomSpec }) = hydrate
116
117
Text s -> EFn .runEffectFn5 hydrateText currentNode hydrationSpec hydrate build s
117
118
Elem ns n a ch -> EFn .runEffectFn8 hydrateElem currentNode hydrationSpec hydrate build ns n a ch
118
119
Keyed ns n a ch -> EFn .runEffectFn8 hydrateKeyed currentNode hydrationSpec hydrate build ns n a ch
119
- Widget _ -> unsafeCoerce unit
120
+ Widget w -> EFn .runEffectFn5 hydrateWidget currentNode hydrationSpec hydrate build w
120
121
Grafted g -> EFn .runEffectFn1 (hydrate currentNode) (runGraft g)
121
122
122
123
type TextState a w =
@@ -447,6 +448,15 @@ buildWidget = EFn.mkEffectFn3 \(VDomSpec spec) build w → do
447
448
mkStep $ Step n { build, widget: res } patchWidget haltWidget
448
449
pure res'
449
450
451
+ hydrateWidget :: forall a w . VDomHydrator w a w
452
+ hydrateWidget = EFn .mkEffectFn5 \currentNode hydrationSpec@(VDomHydrationSpec { hydrateWidget: hydrateWidgetInternal }) _ build w -> do
453
+ res <- EFn .runEffectFn1 (hydrateWidgetInternal hydrationSpec currentNode) w
454
+ let
455
+ res' :: VDomStep a w
456
+ res' = res # unStep \(Step n _ _ _) ->
457
+ mkStep $ Step n { build, widget: res } patchWidget haltWidget
458
+ pure res'
459
+
450
460
patchWidget ∷ ∀ a w . EFn.EffectFn2 (WidgetState a w ) (VDom a w ) (VDomStep a w )
451
461
patchWidget = EFn .mkEffectFn2 \state vdom → do
452
462
let { build, widget } = state
0 commit comments