@@ -2,15 +2,14 @@ import { DEV } from 'esm-env';
2
2
import { source , set } from '../internal/client/reactivity/sources.js' ;
3
3
import { get } from '../internal/client/runtime.js' ;
4
4
import { UNINITIALIZED } from '../constants.js' ;
5
- import { map } from './utils.js' ;
6
5
7
6
/**
8
7
* @template K
9
8
* @template V
10
9
* @extends {Map<K, V> }
11
10
*/
12
11
export class ReactiveMap extends Map {
13
- /** @type {Map<K, import('#client').Source<V >> } */
12
+ /** @type {Map<K, import('#client').Source<symbol >> } */
14
13
#sources = new Map ( ) ;
15
14
#version = source ( 0 ) ;
16
15
#size = source ( 0 ) ;
@@ -25,13 +24,10 @@ export class ReactiveMap extends Map {
25
24
if ( DEV ) new Map ( value ) ;
26
25
27
26
if ( value ) {
28
- var sources = this . #sources;
29
-
30
27
for ( var [ key , v ] of value ) {
31
- sources . set ( key , source ( v ) ) ;
28
+ super . set ( key , v ) ;
32
29
}
33
-
34
- this . #size. v = sources . size ;
30
+ this . #size. v = super . size ;
35
31
}
36
32
}
37
33
@@ -41,14 +37,20 @@ export class ReactiveMap extends Map {
41
37
42
38
/** @param {K } key */
43
39
has ( key ) {
44
- var s = this . #sources. get ( key ) ;
40
+ var sources = this . #sources;
41
+ var s = sources . get ( key ) ;
45
42
46
43
if ( s === undefined ) {
47
- // We should always track the version in case
48
- // the Set ever gets this value in the future.
49
- get ( this . #version) ;
50
-
51
- return false ;
44
+ var ret = super . get ( key ) ;
45
+ if ( ret !== undefined ) {
46
+ s = source ( Symbol ( ) ) ;
47
+ sources . set ( key , s ) ;
48
+ } else {
49
+ // We should always track the version in case
50
+ // the Set ever gets this value in the future.
51
+ get ( this . #version) ;
52
+ return false ;
53
+ }
52
54
}
53
55
54
56
get ( s ) ;
@@ -62,23 +64,29 @@ export class ReactiveMap extends Map {
62
64
forEach ( callbackfn , this_arg ) {
63
65
get ( this . #version) ;
64
66
65
- var bound_callbackfn = callbackfn . bind ( this_arg ) ;
66
- this . #sources. forEach ( ( s , key ) => bound_callbackfn ( s . v , key , this ) ) ;
67
+ return super . forEach ( callbackfn , this_arg ) ;
67
68
}
68
69
69
70
/** @param {K } key */
70
71
get ( key ) {
71
- var s = this . #sources. get ( key ) ;
72
+ var sources = this . #sources;
73
+ var s = sources . get ( key ) ;
72
74
73
75
if ( s === undefined ) {
74
- // We should always track the version in case
75
- // the Set ever gets this value in the future.
76
- get ( this . #version) ;
77
-
78
- return undefined ;
76
+ var ret = super . get ( key ) ;
77
+ if ( ret !== undefined ) {
78
+ s = source ( Symbol ( ) ) ;
79
+ sources . set ( key , s ) ;
80
+ } else {
81
+ // We should always track the version in case
82
+ // the Set ever gets this value in the future.
83
+ get ( this . #version) ;
84
+ return undefined ;
85
+ }
79
86
}
80
87
81
- return get ( s ) ;
88
+ get ( s ) ;
89
+ return super . get ( key ) ;
82
90
}
83
91
84
92
/**
@@ -88,72 +96,71 @@ export class ReactiveMap extends Map {
88
96
set ( key , value ) {
89
97
var sources = this . #sources;
90
98
var s = sources . get ( key ) ;
99
+ var prev_res = super . get ( key ) ;
100
+ var res = super . set ( key , value ) ;
91
101
92
102
if ( s === undefined ) {
93
- sources . set ( key , source ( value ) ) ;
94
- set ( this . #size, sources . size ) ;
103
+ sources . set ( key , source ( Symbol ( ) ) ) ;
104
+ set ( this . #size, super . size ) ;
95
105
this . #increment_version( ) ;
96
- } else {
97
- set ( s , value ) ;
106
+ } else if ( prev_res !== value ) {
107
+ set ( s , Symbol ( ) ) ;
98
108
}
99
109
100
- return this ;
110
+ return res ;
101
111
}
102
112
103
113
/** @param {K } key */
104
114
delete ( key ) {
105
115
var sources = this . #sources;
106
116
var s = sources . get ( key ) ;
117
+ var res = super . delete ( key ) ;
107
118
108
119
if ( s !== undefined ) {
109
- var removed = sources . delete ( key ) ;
110
- set ( this . #size, sources . size ) ;
111
- set ( s , /** @type { V } */ ( UNINITIALIZED ) ) ;
120
+ sources . delete ( key ) ;
121
+ set ( this . #size, super . size ) ;
122
+ set ( s , UNINITIALIZED ) ;
112
123
this . #increment_version( ) ;
113
- return removed ;
114
124
}
115
125
116
- return false ;
126
+ return res ;
117
127
}
118
128
119
129
clear ( ) {
120
130
var sources = this . #sources;
121
131
122
- if ( sources . size !== 0 ) {
132
+ if ( super . size !== 0 ) {
123
133
set ( this . #size, 0 ) ;
124
134
for ( var s of sources . values ( ) ) {
125
- set ( s , /** @type { V } */ ( UNINITIALIZED ) ) ;
135
+ set ( s , UNINITIALIZED ) ;
126
136
}
127
137
this . #increment_version( ) ;
138
+ sources . clear ( ) ;
128
139
}
129
-
130
- sources . clear ( ) ;
140
+ super . clear ( ) ;
131
141
}
132
142
133
143
keys ( ) {
134
144
get ( this . #version) ;
135
- return this . #sources . keys ( ) ;
145
+ return super . keys ( ) ;
136
146
}
137
147
138
148
values ( ) {
139
149
get ( this . #version) ;
140
- return map ( this . #sources . values ( ) , get , 'Map Iterator' ) ;
150
+ return super . values ( ) ;
141
151
}
142
152
143
153
entries ( ) {
144
154
get ( this . #version) ;
145
- return map (
146
- this . #sources. entries ( ) ,
147
- ( [ key , source ] ) => /** @type {[K, V] } */ ( [ key , get ( source ) ] ) ,
148
- 'Map Iterator'
149
- ) ;
155
+ return super . entries ( ) ;
150
156
}
151
157
152
158
[ Symbol . iterator ] ( ) {
153
159
return this . entries ( ) ;
154
160
}
155
161
156
162
get size ( ) {
157
- return get ( this . #size) ;
163
+ get ( this . #size) ;
164
+ return super . size ;
158
165
}
159
166
}
0 commit comments