@@ -88,84 +88,69 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
8888 var keys : [ IndexPathElement ] = [ " root " ]
8989 var index : Int = - 1
9090 var edits : [ ( key: IndexPathElement , node: Node ) ] = [ ]
91+ var node : NodeResult ? = . node( root)
92+ var key : IndexPathElement ?
9193 var parent : NodeResult ?
9294 var path : [ IndexPathElement ] = [ ]
9395 var ancestors : [ NodeResult ] = [ ]
94- var newRoot = root
9596
9697 repeat {
9798 index += 1
9899 let isLeaving = index == keys. count
99- var key : IndexPathElement ?
100- var node : NodeResult ?
101100 let isEdited = isLeaving && !edits. isEmpty
102101
103- if !isLeaving {
104- key = parent != nil ? inArray ? index : keys [ index] : nil
105-
106- if let parent = parent {
107- switch parent {
108- case let . node( parent) :
109- node = parent. get ( key: key!. keyValue!)
110- case let . array( parent) :
111- node = . node( parent [ key!. indexValue!] )
112- }
113- } else {
114- node = . node( newRoot)
115- }
116-
117- if node == nil {
118- continue
119- }
120-
121- if parent != nil {
122- path. append ( key!)
123- }
124- } else {
102+ if isLeaving {
125103 key = ancestors. isEmpty ? nil : path. popLast ( )
126104 node = parent
127105 parent = ancestors. popLast ( )
128106
129107 if isEdited {
130- // if inArray {
131- // node = node.slice()
132- // } else {
133- // let clone = node
134- // node = clone
135- // }
136- //
137- // var editOffset = 0
138- //
139- // for ii in 0..<edits.count {
140- // var editKey = edits[ii].key
141- // let editValue = edits[ii].node
142- //
143- // if inArray {
144- // editKey -= editOffset
145- // }
146- //
147- // if inArray && editValue == nil {
148- // node.splice(editKey, 1)
149- // editOffset += 1
150- // } else {
151- //
152- // if let node = node, case .node(let n) = node {
153- // n.set(value: editValue, key: editKey.keyValue!)
154- // }
155- // }
156- // }
108+ if inArray {
109+ var editOffset = 0
110+ for (editKey, editValue) in edits {
111+ let editKey = editKey. indexValue!
112+ let arrayKey = editKey - editOffset
113+
114+ if case . array( var n) = node {
115+ n. remove ( at: arrayKey)
116+ node = . array( n)
117+ editOffset += 1
118+ }
119+ }
120+ } else {
121+ let clone = node
122+ node = clone
123+ for (editKey, editValue) in edits {
124+ if case . node( let node) = node {
125+ node. set ( value: editValue, key: editKey. keyValue!)
126+ }
127+ }
128+ }
157129 }
158130
159131 index = stack!. index
160132 keys = stack!. keys
161133 edits = stack!. edits
162134 inArray = stack!. inArray
163135 stack = stack!. prev
164- }
136+ } else if let parent = parent {
137+ key = inArray ? index : keys [ index]
138+
139+ switch parent {
140+ case let . node( parent) :
141+ node = parent. get ( key: key!. keyValue!)
142+ case let . array( parent) :
143+ node = . node( parent [ key!. indexValue!] )
144+ }
165145
166- var result : VisitResult
146+ if node == nil {
147+ continue
148+ }
149+ path. append ( key!)
150+ }
167151
168- if case let . node( n) = node! {
152+ var result : VisitResult = . break // placeholder
153+ if case let . node( n) = node {
169154 if !isLeaving {
170155 result = visitor. enter (
171156 node: n,
@@ -188,15 +173,16 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
188173 break
189174 }
190175
191- if case . skip = result, !isLeaving {
192- _ = path. popLast ( )
193- continue
194- } else if case let . node( n) = result {
195- edits. append ( ( key!, n!) )
196-
176+ if case . skip = result {
197177 if !isLeaving {
198- if let n = n {
199- node = . node( n)
178+ _ = path. popLast ( )
179+ continue
180+ }
181+ } else if case let . node( resultNode) = result {
182+ edits. append ( ( key!, resultNode!) )
183+ if !isLeaving {
184+ if let resultNode = resultNode {
185+ node = . node( resultNode)
200186 } else {
201187 _ = path. popLast ( )
202188 continue
@@ -205,38 +191,36 @@ func visit(root: Node, visitor: Visitor, keyMap: [Kind: [String]] = [:]) -> Node
205191 }
206192 }
207193
208- // if case .continue = result, isEdited {
209- // edits.append((key!, node! ))
210- // }
194+ if case . continue = result, isEdited, case let . node ( node ) = node! {
195+ edits. append ( ( key!, node) )
196+ }
211197
212- if !isLeaving {
198+ if isLeaving {
199+ _ = path. popLast ( )
200+ } else {
213201 stack = Stack ( index: index, keys: keys, edits: edits, inArray: inArray, prev: stack)
214202 inArray = node!. isArray
215-
216203 switch node! {
217204 case let . node( node) :
218205 keys = visitorKeys [ node. kind] ?? [ ]
219206 case let . array( array) :
220207 keys = array. map { _ in " root " }
221208 }
222-
223209 index = - 1
224210 edits = [ ]
225-
226211 if let parent = parent {
227212 ancestors. append ( parent)
228213 }
229-
230214 parent = node
231215 }
232216 } while
233217 stack != nil
234218
235219 if !edits. isEmpty {
236- newRoot = edits [ edits. count - 1 ] . node
220+ return edits [ edits. count - 1 ] . node
237221 }
238222
239- return newRoot
223+ return root
240224}
241225
242226final class Stack {
0 commit comments