@@ -56,10 +56,10 @@ initialState ∷ State
5656initialState = []
5757
5858elem ∷ ∀ a w . String → a → Array (V.VDom a w ) → V.VDom a w
59- elem n a = V.Elem ( V.ElemSpec Nothing (V.ElemName n) a)
59+ elem n a = V.Elem Nothing (V.ElemName n) a
6060
6161keyed ∷ ∀ a w . String → a → Array (Tuple String (V.VDom a w )) → V.VDom a w
62- keyed n a = V.Keyed ( V.ElemSpec Nothing (V.ElemName n) a)
62+ keyed n a = V.Keyed Nothing (V.ElemName n) a
6363
6464text ∷ ∀ a w . String → V.VDom a w
6565text = V.Text
@@ -108,24 +108,35 @@ renderData st =
108108 ]
109109 ]
110110
111+ type WidgetState a w =
112+ { t :: Exists Thunk
113+ , step :: V.Step a w
114+ }
115+
111116buildWidget
112117 ∷ V.VDomSpec (Array (Prop Void )) (Exists Thunk )
113118 → V.Machine (Exists Thunk ) DOM.Node
114119buildWidget spec = render
115120 where
116121 render = EFn .mkEffectFn1 \t → case unsafeCoerce t of
117122 Thunk a render' → do
118- V.Step node m h ← EFn .runEffectFn1 (V .buildVDom spec) (render' a)
119- pure (V.Step node (Fn .runFn4 patch (unsafeCoerce a) node m h) h)
120-
121- patch = Fn .mkFn4 \a node step halt →
122- EFn .mkEffectFn1 \t → case unsafeCoerce t of
123- Thunk b render' →
124- if Fn .runFn2 refEq a b
125- then pure (V.Step node (Fn .runFn4 patch a node step halt) halt)
123+ step ← EFn .runEffectFn1 (V .buildVDom spec) (render' a)
124+ let state = { t, step }
125+ pure (V .mkStep (V.Step (V .extract step) state patch done))
126+
127+ patch = EFn .mkEffectFn2 \state t →
128+ case unsafeCoerce state.t, unsafeCoerce t of
129+ Thunk a render1, Thunk b render2 →
130+ if Fn .runFn2 refEq a b && Fn .runFn2 refEq render1 render2
131+ then
132+ pure (V .mkStep (V.Step (V .extract state.step) state patch done))
126133 else do
127- V.Step node' m h ← EFn .runEffectFn1 step (render' b)
128- pure (V.Step node' (Fn .runFn4 patch (unsafeCoerce b) node' m h) h)
134+ step ← EFn .runEffectFn2 V .step state.step (render2 b)
135+ let nextState = { t, step }
136+ pure (V .mkStep (V.Step (V .extract step) nextState patch done))
137+
138+ done = EFn .mkEffectFn1 \state → do
139+ EFn .runEffectFn1 V .halt state.step
129140
130141mkSpec
131142 ∷ DOM.Document
@@ -162,7 +173,7 @@ mkRenderQueue spec parent render initialValue = do
162173 when (isNothing v) $ requestAnimationFrame do
163174 machine ← Ref .read ref
164175 Ref .read val >>= traverse_ \v' → do
165- res ← EFn .runEffectFn1 ( V .step machine) (render v')
176+ res ← EFn .runEffectFn2 V .step machine (render v')
166177 Ref .write res ref
167178 Ref .write Nothing val
168179
@@ -179,7 +190,7 @@ mkRenderQueue' spec parent render initialValue = do
179190 ref ← Ref .new initMachine
180191 pure \v → do
181192 machine ← Ref .read ref
182- res ← EFn .runEffectFn1 ( V .step machine) (render v)
193+ res ← EFn .runEffectFn2 V .step machine (render v)
183194 Ref .write res ref
184195
185196main ∷ Effect Unit
0 commit comments