MCPcopy
hub / github.com/mobxjs/mobx / replace

Method replace

packages/mobx/src/types/observablemap.ts:376–452  ·  view source on GitHub ↗
(values: IObservableMapInitialValues<K, V>)

Source from the content-addressed store, hash-verified

374 }
375
376 replace(values: IObservableMapInitialValues<K, V>): ObservableMap<K, V> {
377 // Implementation requirements:
378 // - respect ordering of replacement map
379 // - allow interceptors to run and potentially prevent individual operations
380 // - don't recreate observables that already exist in original map (so we don't destroy existing subscriptions)
381 // - don't _keysAtom.reportChanged if the keys of resulting map are indentical (order matters!)
382 // - note that result map may differ from replacement map due to the interceptors
383 transaction(() => {
384 // Convert to map so we can do quick key lookups
385 const replacementMap = convertToMap(values)
386 const orderedData = new Map()
387 // Used for optimization
388 let keysReportChangedCalled = false
389 // Delete keys that don't exist in replacement map
390 // if the key deletion is prevented by interceptor
391 // add entry at the beginning of the result map
392 for (const key of this.data_.keys()) {
393 // Concurrently iterating/deleting keys
394 // iterator should handle this correctly
395 if (!replacementMap.has(key)) {
396 const deleted = this.delete(key)
397 // Was the key removed?
398 if (deleted) {
399 // _keysAtom.reportChanged() was already called
400 keysReportChangedCalled = true
401 } else {
402 // Delete prevented by interceptor
403 const value = this.data_.get(key)
404 orderedData.set(key, value)
405 }
406 }
407 }
408 // Merge entries
409 for (const [key, value] of replacementMap.entries()) {
410 // We will want to know whether a new key is added
411 const keyExisted = this.data_.has(key)
412 // Add or update value
413 this.set(key, value)
414 // The addition could have been prevent by interceptor
415 if (this.data_.has(key)) {
416 // The update could have been prevented by interceptor
417 // and also we want to preserve existing values
418 // so use value from _data map (instead of replacement map)
419 const value = this.data_.get(key)
420 orderedData.set(key, value)
421 // Was a new key added?
422 if (!keyExisted) {
423 // _keysAtom.reportChanged() was already called
424 keysReportChangedCalled = true
425 }
426 }
427 }
428 // Check for possible key order change
429 if (!keysReportChangedCalled) {
430 if (this.data_.size !== orderedData.size) {
431 // If size differs, keys are definitely modified
432 this.keysAtom_.reportChanged()
433 } else {

Callers

nothing calls this directly

Calls 11

deleteMethod · 0.95
setMethod · 0.95
convertToMapFunction · 0.85
hasMethod · 0.65
getMethod · 0.65
setMethod · 0.65
reportChangedMethod · 0.65
transactionFunction · 0.50
keysMethod · 0.45
entriesMethod · 0.45
nextMethod · 0.45

Tested by

no test coverage detected