1
1
import { deprecate } from '@ember/debug' ;
2
2
3
+ import { DEBUG_RELATIONSHIP_NOTIFICATIONS } from '@warp-drive/build-config/debugging' ;
3
4
import {
4
5
DEPRECATE_NON_UNIQUE_PAYLOADS ,
5
6
DEPRECATE_RELATIONSHIP_REMOTE_UPDATE_CLEARING_LOCAL_STATE ,
@@ -163,17 +164,29 @@ function _compare<T>(
163
164
const finalLength = finalState . length ;
164
165
const prevLength = prevState . length ;
165
166
const iterationLength = Math . max ( finalLength , prevLength ) ;
166
- const equalLength = finalLength === prevLength ;
167
+ const equalLength = priorLocalState ? finalLength === priorLocalState . length : finalLength === prevLength ;
167
168
let remoteOrderChanged = finalSet . size !== prevSet . size ;
168
169
let changed : boolean = priorLocalState ? finalSet . size !== priorLocalState . length : remoteOrderChanged ;
169
170
const added = new Set < T > ( ) ;
170
171
const removed = new Set < T > ( ) ;
171
172
const priorLocalLength = priorLocalState ?. length ?? 0 ;
172
173
173
- changed &&
174
- console . log (
175
- `changed because ${ priorLocalState ? 'finalSet.size !== priorLocalState.length' : 'finalSet.size !== prevSet.size' } `
176
- ) ;
174
+ if ( DEBUG_RELATIONSHIP_NOTIFICATIONS ) {
175
+ if ( changed ) {
176
+ // console.log({
177
+ // priorState: priorLocalState?.slice(),
178
+ // finalState: finalState.slice(),
179
+ // prevState: prevState.slice(),
180
+ // });
181
+ }
182
+
183
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
184
+ changed &&
185
+ // eslint-disable-next-line no-console
186
+ console . log (
187
+ `changed because ${ priorLocalState ? 'finalSet.size !== priorLocalState.length' : 'finalSet.size !== prevSet.size' } `
188
+ ) ;
189
+ }
177
190
178
191
for ( let i = 0 ; i < iterationLength ; i ++ ) {
179
192
let member : T | undefined ;
@@ -186,7 +199,21 @@ function _compare<T>(
186
199
if ( i < priorLocalLength ) {
187
200
const priorLocalMember = priorLocalState ! [ i ] ;
188
201
if ( priorLocalMember !== member ) {
189
- ! changed && console . log ( `changed because priorLocalMember !== member && !prevSet.has(member)` ) ;
202
+ if ( DEBUG_RELATIONSHIP_NOTIFICATIONS ) {
203
+ if ( ! changed ) {
204
+ // console.log({
205
+ // priorLocalMember,
206
+ // member,
207
+ // i,
208
+ // priorState: priorLocalState?.slice(),
209
+ // finalState: finalState.slice(),
210
+ // prevState: prevState.slice(),
211
+ // });
212
+ }
213
+
214
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
215
+ ! changed && console . log ( `changed because priorLocalMember !== member && !prevSet.has(member)` ) ;
216
+ }
190
217
changed = true ;
191
218
}
192
219
}
@@ -220,11 +247,19 @@ function _compare<T>(
220
247
if ( i < priorLocalLength ) {
221
248
const priorLocalMember = priorLocalState ! [ i ] ;
222
249
if ( priorLocalMember !== member ) {
223
- ! changed && console . log ( `changed because priorLocalMember !== member && member !== prevMember` ) ;
250
+ if ( DEBUG_RELATIONSHIP_NOTIFICATIONS ) {
251
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
252
+ ! changed && console . log ( `changed because priorLocalMember !== member && member !== prevMember` ) ;
253
+ }
224
254
changed = true ;
225
255
}
226
- } else {
227
- ! changed && console . log ( `changed because priorLocalMember !== member && index >= priorLocalLength` ) ;
256
+ } else if ( i < finalLength ) {
257
+ // if we have exceeded the length of priorLocalState and we are within the range
258
+ // of the finalState then we must have changed
259
+ if ( DEBUG_RELATIONSHIP_NOTIFICATIONS ) {
260
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
261
+ ! changed && console . log ( `changed because priorMember !== member && index >= priorLocalLength` ) ;
262
+ }
228
263
changed = true ;
229
264
}
230
265
}
@@ -244,8 +279,53 @@ function _compare<T>(
244
279
}
245
280
246
281
if ( ! finalSet . has ( prevMember ) ) {
247
- ! changed && console . log ( `changed because !finalSet.has(prevMember)` ) ;
248
- changed = true ;
282
+ // if we are within finalLength, we can only be "changed" if we've already exceeded
283
+ // the index range of priorLocalState, as otherwise the previous member may still
284
+ // be removed.
285
+ //
286
+ // prior local: [1, 2, 3, 4]
287
+ // final state: [1, 2, 3]
288
+ // prev remote state: [1, 2, 5, 3, 4]
289
+ // i === 2
290
+ // prevMember === 5
291
+ // !finalSet.has(prevMember) === true
292
+ //
293
+ // because we will become changed at i===3,
294
+ // we do not need to worry about becoming changed at i===2
295
+ // as the arrays until now are still the same
296
+ //
297
+ // prior local: [1, 2, 3]
298
+ // final state: [1, 2, 3, 4]
299
+ // prev remote state: [1, 2, 5, 3, 4]
300
+ // i === 2
301
+ // prevMember === 5
302
+ // !finalSet.has(prevMember) === true
303
+ //
304
+ // because we will become changed at i===3
305
+ // we do not need to worry about becoming changed at i===2
306
+ //
307
+ // prior local: [1, 2, 3]
308
+ // final state: [1, 2, 3]
309
+ // prev remote state: [1, 2, 5, 3, 4]
310
+ // i === 2
311
+ // prevMember === 5
312
+ // !finalSet.has(prevMember) === true
313
+ //
314
+ // because we have same length and same membership order
315
+ // we do not need to worry about becoming changed at i===2
316
+ //
317
+ // if you do not have a priorLocalState you can't be changed
318
+ // ergo, we never need to set changed in this branch.
319
+ // this log can still be useful for debugging.
320
+ if ( DEBUG_RELATIONSHIP_NOTIFICATIONS ) {
321
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
322
+ ! changed &&
323
+ // eslint-disable-next-line no-console
324
+ console . log ( `changed because i >= priorLocalLength && i < finalLength && !finalSet.has(prevMember)` ) ;
325
+ }
326
+ //
327
+ // we do still set remoteOrderChanged as it has
328
+ remoteOrderChanged = true ;
249
329
removed . add ( prevMember ) ;
250
330
onDel ( prevMember ) ;
251
331
}
0 commit comments