Skip to content

Commit da16e8d

Browse files
committed
Refactor forEachObject
1 parent 320009e commit da16e8d

File tree

5 files changed

+502
-533
lines changed

5 files changed

+502
-533
lines changed

src/api/applyPatchFactory.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default function applyPatchFactory(patchers) {
1212

1313
forEachObject(
1414
patch_root,
15+
target_root,
1516
({ origin, destiny, prop, path }) => {
1617
const origin_value = origin[prop]
1718
const destiny_value = destiny[prop]
@@ -24,7 +25,7 @@ export default function applyPatchFactory(patchers) {
2425
isPlainObject(destiny_value)
2526
))
2627
) {
27-
let oldValue = destiny[prop]
28+
let oldValue = destiny_value
2829

2930
destiny[prop] = isPlainObject(origin_value) // immutable
3031
? applyPatch({}, origin_value).result
@@ -44,6 +45,7 @@ export default function applyPatchFactory(patchers) {
4445
}),
4546
oldValue
4647
)
48+
4749
setDeep(unpatch_root, path.slice(0), oldValue)
4850
mutations.push({
4951
oldValue,
@@ -54,8 +56,7 @@ export default function applyPatchFactory(patchers) {
5456

5557
return false // we dont go deeper
5658
}
57-
},
58-
target_root
59+
}
5960
)
6061

6162
return {

src/util/converter.js

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,24 @@ import { isArray } from '../util/is'
44

55
export default function converter(origin, converters) {
66
const destiny = isArray(origin) ? [] : {}
7-
forEachObject(
8-
origin,
9-
({ origin, prop, destiny, path }) => {
10-
const value = converters.reduce(
11-
(value, converter) =>
12-
converter({
13-
value,
14-
origin,
15-
destiny,
16-
prop,
17-
path
18-
}),
19-
origin[prop]
20-
)
21-
if (origin[prop] !== value) {
22-
destiny[prop] = value
23-
return false // we don't go deeper
24-
} else {
25-
return mergeMutator({ origin, destiny, prop })
26-
}
27-
},
28-
destiny
29-
)
7+
forEachObject(origin, destiny, ({ origin, prop, destiny, path }) => {
8+
const value = converters.reduce(
9+
(value, converter) =>
10+
converter({
11+
value,
12+
origin,
13+
destiny,
14+
prop,
15+
path
16+
}),
17+
origin[prop]
18+
)
19+
if (origin[prop] !== value) {
20+
destiny[prop] = value
21+
return false // we don't go deeper
22+
} else {
23+
return mergeMutator({ origin, destiny, prop })
24+
}
25+
})
3026
return destiny
3127
}

src/util/forEachObject.js

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,17 @@ import forEach from './forEach'
33

44
// https://jsperf.com/dop-foreachobject
55
// https://2ality.com/2019/10/shared-mutable-state.html
6-
export default function forEachObject(origin, callback, destiny) {
7-
const circular = new Set()
8-
const path = []
9-
const has_destiny = isObject(destiny)
10-
forEachObjectLoop(origin, destiny, callback, path, has_destiny, circular)
6+
export default function forEachObject(origin, destiny, mutator) {
7+
forEachObjectLoop(origin, destiny, mutator, [])
118
}
129

13-
function forEachObjectLoop(
14-
origin,
15-
destiny,
16-
callback,
17-
path,
18-
has_destiny,
19-
circular
20-
) {
10+
function forEachObjectLoop(origin, destiny, mutator, path) {
2111
forEach(origin, (value_origin, prop) => {
2212
path.push(prop)
23-
24-
const go_deep = callback({ origin, destiny, prop, path })
25-
26-
if (
27-
isObject(value_origin) &&
28-
go_deep !== false &&
29-
value_origin !== origin &&
30-
// (!has_destiny ||
31-
// (has_destiny && destiny[prop] !== undefined)) &&
32-
!circular.has(value_origin)
33-
) {
34-
circular.add(value_origin)
35-
forEachObjectLoop(
36-
value_origin,
37-
has_destiny ? destiny[prop] : undefined,
38-
callback,
39-
path,
40-
has_destiny,
41-
circular
42-
)
13+
const shallWeGoDown = mutator({ origin, destiny, prop, path })
14+
if (shallWeGoDown !== false && isObject(value_origin)) {
15+
forEachObjectLoop(value_origin, destiny[prop], mutator, path)
4316
}
44-
4517
path.pop()
4618
})
4719
}

src/util/merge.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default function merge(destiny, origin) {
1717
} else if (origin === destiny) {
1818
return destiny
1919
} else {
20-
forEachObject(origin, mergeMutator, destiny)
20+
forEachObject(origin, destiny, mergeMutator)
2121
return destiny
2222
}
2323
}

0 commit comments

Comments
 (0)