@@ -13,6 +13,7 @@ module Halogen.VDom.DOM
1313import Prelude
1414import Control.Monad.Eff (Eff , foreachE )
1515
16+ import Data.Array as Array
1617import Data.Function.Uncurried as Fn
1718import Data.Maybe (Maybe (..))
1819import Data.Tuple (Tuple (..), fst )
@@ -23,7 +24,7 @@ import DOM.Node.Types (Element, Node, Document, elementToNode) as DOM
2324import Halogen.VDom.Machine (Step (..), Machine )
2425import Halogen.VDom.Machine as Machine
2526import Halogen.VDom.Types (VDom (..), ElemSpec (..), ElemName , Namespace (..), runGraft )
26- import Halogen.VDom.Util (forE , forInE , diffWithIxE , diffWithKeyAndIxE , strMapWithIxE , refEq )
27+ import Halogen.VDom.Util (forE , forInE , replicateE , diffWithIxE , diffWithKeyAndIxE , strMapWithIxE , refEq )
2728
2829data Quaple a b c d = Quaple a b c d
2930
@@ -91,7 +92,7 @@ buildElem (VDomSpec spec) = render
9192 node = DOM .elementToNode el
9293 onChild = Fn .mkFn2 \ix child → do
9394 res@Step n m h ← buildVDom (VDomSpec spec) child
94- Fn .runFn2 appendChild n node
95+ Fn .runFn3 insertChildIx ix n node
9596 pure res
9697 steps ← Fn .runFn2 forE ch1 onChild
9798 attrs ← spec.buildAttributes el as1
@@ -112,16 +113,17 @@ buildElem (VDomSpec spec) = render
112113 true → pure res
113114 _ → do
114115 halt
115- Fn .runFn3 replaceChild n' n node
116+ Fn .runFn3 insertChildIx ix n' node
116117 pure res
117118 onThis = Fn .mkFn2 \ix (Step _ _ halt) → do
118119 halt
119- removeLastChild node
120120 onThat = Fn .mkFn2 \ix vdom → do
121121 res@Step n m h ← buildVDom (VDomSpec spec) vdom
122- Fn .runFn2 appendChild n node
122+ Fn .runFn3 insertChildIx ix n node
123123 pure res
124124 steps ← Fn .runFn5 diffWithIxE ch1 ch2 onThese onThis onThat
125+ len ← nodeLength node
126+ Fn .runFn2 replicateE (len - Array .length ch2) (removeLastChild node)
125127 attrs' ← Machine .step attrs as2
126128 pure
127129 (Step node
@@ -144,14 +146,14 @@ buildKeyed (VDomSpec spec) = render
144146 where
145147 render es1@(ElemSpec ns1 name1 as1) ch1 = do
146148 el ← Fn .runFn3 createElem ns1 name1 spec.document
147- attrs ← spec.buildAttributes el as1
148149 let
149150 node = DOM .elementToNode el
150151 onChild = Fn .mkFn3 \k ix (Tuple _ vdom) → do
151152 Step n m h ← buildVDom (VDomSpec spec) vdom
152- Fn .runFn2 appendChild n node
153+ Fn .runFn3 insertChildIx ix n node
153154 pure (Quaple k ix m h)
154155 steps ← Fn .runFn3 strMapWithIxE ch1 fst onChild
156+ attrs ← spec.buildAttributes el as1
155157 pure
156158 (Step node
157159 (Fn .runFn4 patch node attrs es1 steps)
@@ -161,7 +163,6 @@ buildKeyed (VDomSpec spec) = render
161163 Grafted g →
162164 Fn .runFn4 patch node attrs es1 ch1 (runGraft g)
163165 Keyed es2@(ElemSpec ns2 name2 as2) ch2 | Fn .runFn2 eqElemSpec es1 es2 → do
164- attrs' ← Machine .step attrs as2
165166 let
166167 onThese = Fn .mkFn4 \k ix (Quaple _ ix' step halt) (Tuple _ vdom) →
167168 if ix == ix'
@@ -174,20 +175,22 @@ buildKeyed (VDomSpec spec) = render
174175 true → pure res
175176 _ → do
176177 halt
177- Fn .runFn3 replaceChild n' n node
178+ Fn .runFn3 insertChildIx ix n' node
178179 pure res
179180 else do
180181 Step n' m' h' ← step vdom
181- Fn .runFn3 unsafeInsertChildIx ix n' node
182+ Fn .runFn3 insertChildIx ix n' node
182183 pure (Quaple k ix m' h')
183184 onThis = Fn .mkFn2 \k (Quaple _ _ _ halt) → do
184185 halt
185- removeLastChild node
186186 onThat = Fn .mkFn3 \k ix (Tuple _ vdom) → do
187187 Step n' m' h' ← buildVDom (VDomSpec spec) vdom
188- Fn .runFn3 unsafeInsertChildIx ix n' node
188+ Fn .runFn3 insertChildIx ix n' node
189189 pure (Quaple k ix m' h')
190190 steps ← Fn .runFn6 diffWithKeyAndIxE ch1 ch2 fst onThese onThis onThat
191+ len ← nodeLength node
192+ Fn .runFn2 replicateE (len - Array .length ch2) (removeLastChild node)
193+ attrs' ← Machine .step attrs as2
191194 pure
192195 (Step node
193196 (Fn .runFn4 patch node attrs' es2 steps)
@@ -258,22 +261,18 @@ foreign import createElementNS
258261 ∷ ∀ eff
259262 . Fn.Fn3 Namespace ElemName DOM.Document (Eff (dom ∷ DOM | eff ) DOM.Element )
260263
261- foreign import replaceChild
262- ∷ ∀ eff
263- . Fn.Fn3 DOM.Node DOM.Node DOM.Node (Eff (dom ∷ DOM | eff ) Unit )
264-
265264foreign import removeLastChild
266265 ∷ ∀ eff
267266 . DOM.Node → (Eff (dom ∷ DOM | eff ) Unit )
268267
269- foreign import appendChild
270- ∷ ∀ eff
271- . Fn.Fn2 DOM.Node DOM.Node (Eff (dom ∷ DOM | eff ) Unit )
272-
273- foreign import unsafeInsertChildIx
268+ foreign import insertChildIx
274269 ∷ ∀ eff
275270 . Fn.Fn3 Int DOM.Node DOM.Node (Eff (dom ∷ DOM | eff ) Unit )
276271
277272foreign import unsafeChildIx
278273 ∷ ∀ eff
279274 . Fn.Fn2 Int DOM.Node (Eff (dom ∷ DOM | eff ) DOM.Node )
275+
276+ foreign import nodeLength
277+ ∷ ∀ eff
278+ . DOM.Node → (Eff (dom ∷ DOM | eff ) Int )
0 commit comments