@@ -2,39 +2,37 @@ import { effect, release } from './reactivity'
2
2
3
3
export function entangle ( { get : outerGet , set : outerSet } , { get : innerGet , set : innerSet } ) {
4
4
let firstRun = true
5
- let outerHash , innerHash , outerHashLatest , innerHashLatest
5
+ let outerHash
6
6
7
7
let reference = effect ( ( ) => {
8
- let outer , inner
9
-
8
+ const outer = outerGet ( )
9
+ const inner = innerGet ( )
10
10
if ( firstRun ) {
11
- outer = outerGet ( )
12
- innerSet ( JSON . parse ( JSON . stringify ( outer ) ) ) // We need to break internal references using parse/stringify...
13
- inner = innerGet ( )
11
+ innerSet ( cloneIfObject ( outer ) )
14
12
firstRun = false
13
+ outerHash = JSON . stringify ( outer )
15
14
} else {
16
- outer = outerGet ( )
17
- inner = innerGet ( )
18
-
19
- outerHashLatest = JSON . stringify ( outer )
20
- innerHashLatest = JSON . stringify ( inner )
15
+ const outerHashLatest = JSON . stringify ( outer )
21
16
22
17
if ( outerHashLatest !== outerHash ) { // If outer changed...
23
- inner = innerGet ( )
24
- innerSet ( outer )
25
- inner = outer // Assign inner to outer so that it can be serialized for diffing...
18
+ innerSet ( cloneIfObject ( outer ) )
19
+ outerHash = outerHashLatest
26
20
} else { // If inner changed...
27
- outerSet ( JSON . parse ( innerHashLatest ?? null ) ) // We need to break internal references using parse/stringify...
28
- outer = inner // Assign outer to inner so that it can be serialized for diffing...
21
+ outerSet ( cloneIfObject ( inner ) )
22
+ outerHash = JSON . stringify ( inner )
29
23
}
30
24
}
31
-
32
- // Re serialize values...
33
- outerHash = JSON . stringify ( outer )
34
- innerHash = JSON . stringify ( inner )
25
+ JSON . stringify ( innerGet ( ) )
26
+ JSON . stringify ( outerGet ( ) )
35
27
} )
36
28
37
29
return ( ) => {
38
30
release ( reference )
39
31
}
40
32
}
33
+
34
+ function cloneIfObject ( value ) {
35
+ return typeof value === 'object'
36
+ ? JSON . parse ( JSON . stringify ( value ) )
37
+ : value
38
+ }
0 commit comments