Skip to content

Commit f214200

Browse files
purefunctorSerhii Khoma
andcommitted
Initial implementation of hydrateWidget
Co-Authored-By: Serhii Khoma <srghma@gmail.com>
1 parent 589a429 commit f214200

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/Halogen/VDom/DOM.purs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module Halogen.VDom.DOM
99
, hydrateVDom
1010
, hydrateText
1111
, hydrateElem
12+
, hydrateKeyed
13+
, hydrateWidget
1214
) where
1315

1416
import Prelude
@@ -31,7 +33,6 @@ import Halogen.VDom.Machine (Machine, Step, Step'(..), extract, halt, mkStep, st
3133
import Halogen.VDom.Machine as Machine
3234
import Halogen.VDom.Types (ElemName(..), Namespace(..), VDom(..), runGraft)
3335
import Halogen.VDom.Util as Util
34-
import Unsafe.Coerce (unsafeCoerce)
3536
import Web.DOM.Document (Document) as DOM
3637
import Web.DOM.Element (Element) as DOM
3738
import Web.DOM.Element as DOMElement
@@ -116,7 +117,7 @@ hydrateVDom hydrationSpec@(VDomHydrationSpec { vdomSpec }) = hydrate
116117
Text s -> EFn.runEffectFn5 hydrateText currentNode hydrationSpec hydrate build s
117118
Elem ns n a ch -> EFn.runEffectFn8 hydrateElem currentNode hydrationSpec hydrate build ns n a ch
118119
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
120121
Grafted g -> EFn.runEffectFn1 (hydrate currentNode) (runGraft g)
121122

122123
type TextState a w =
@@ -447,6 +448,15 @@ buildWidget = EFn.mkEffectFn3 \(VDomSpec spec) build w → do
447448
mkStep $ Step n { build, widget: res } patchWidget haltWidget
448449
pure res'
449450

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+
450460
patchWidget a w. EFn.EffectFn2 (WidgetState a w) (VDom a w) (VDomStep a w)
451461
patchWidget = EFn.mkEffectFn2 \state vdom → do
452462
let { build, widget } = state

0 commit comments

Comments
 (0)