ripple 0.2.52 → 0.2.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/compiler/phases/2-analyze/index.js +1 -32
- package/src/compiler/phases/3-transform/index.js +13 -84
- package/src/compiler/phases/3-transform/stylesheet.js +16 -3
- package/src/compiler/utils.js +0 -20
- package/src/runtime/array.js +158 -610
- package/src/runtime/index.js +3 -3
- package/src/runtime/internal/client/constants.js +1 -1
- package/src/runtime/internal/client/for.js +5 -5
- package/src/runtime/internal/client/index.js +1 -11
- package/src/runtime/internal/client/operations.js +0 -3
- package/src/runtime/internal/client/portal.js +5 -6
- package/src/runtime/internal/client/runtime.js +54 -316
- package/src/runtime/internal/client/utils.js +0 -10
- package/src/runtime/map.js +28 -15
- package/src/runtime/set.js +47 -21
- package/tests/array.test.ripple +75 -187
- package/tests/basic.test.ripple +33 -9
- package/tests/compiler.test.ripple +5 -5
- package/tests/composite.test.ripple +253 -3
- package/tests/for.test.ripple +3 -3
- package/tests/map.test.ripple +10 -10
- package/tests/ref.test.ripple +3 -3
- package/tests/set.test.ripple +7 -7
- package/types/index.d.ts +18 -31
package/src/runtime/map.js
CHANGED
|
@@ -1,17 +1,30 @@
|
|
|
1
|
+
/** @import { Block, Tracked } from '#client' */
|
|
1
2
|
import { get, increment, safe_scope, set, tracked } from './internal/client/runtime.js';
|
|
2
3
|
|
|
3
4
|
const introspect_methods = ['entries', 'forEach', 'values', Symbol.iterator];
|
|
4
5
|
|
|
5
6
|
let init = false;
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @template K, V
|
|
10
|
+
* @extends {Map<K, V>}
|
|
11
|
+
* @returns {TrackedMap<K, V>}
|
|
12
|
+
*/
|
|
13
|
+
export class TrackedMap extends Map {
|
|
14
|
+
/** @type {Tracked} */
|
|
8
15
|
#tracked_size;
|
|
16
|
+
/** @type {Map<K, Tracked>} */
|
|
9
17
|
#tracked_items = new Map();
|
|
18
|
+
/** @type {Block} */
|
|
19
|
+
#block;
|
|
10
20
|
|
|
21
|
+
/**
|
|
22
|
+
* @param {Iterable<readonly [K, V]>} [iterable]
|
|
23
|
+
*/
|
|
11
24
|
constructor(iterable) {
|
|
12
25
|
super();
|
|
13
26
|
|
|
14
|
-
var block = safe_scope();
|
|
27
|
+
var block = this.#block = safe_scope();
|
|
15
28
|
|
|
16
29
|
if (iterable) {
|
|
17
30
|
for (var [key, value] of iterable) {
|
|
@@ -20,7 +33,7 @@ export class RippleMap extends Map {
|
|
|
20
33
|
}
|
|
21
34
|
}
|
|
22
35
|
|
|
23
|
-
this.#tracked_size = tracked(
|
|
36
|
+
this.#tracked_size = tracked(super.size, block);
|
|
24
37
|
|
|
25
38
|
if (!init) {
|
|
26
39
|
init = true;
|
|
@@ -29,12 +42,12 @@ export class RippleMap extends Map {
|
|
|
29
42
|
}
|
|
30
43
|
|
|
31
44
|
#init() {
|
|
32
|
-
var proto =
|
|
45
|
+
var proto = TrackedMap.prototype;
|
|
33
46
|
var map_proto = Map.prototype;
|
|
34
47
|
|
|
35
48
|
for (const method of introspect_methods) {
|
|
36
49
|
proto[method] = function (...v) {
|
|
37
|
-
this
|
|
50
|
+
this.size;
|
|
38
51
|
this.#read_all();
|
|
39
52
|
|
|
40
53
|
return map_proto[method].apply(this, v);
|
|
@@ -48,7 +61,7 @@ export class RippleMap extends Map {
|
|
|
48
61
|
|
|
49
62
|
if (t === undefined) {
|
|
50
63
|
// same logic as has
|
|
51
|
-
this
|
|
64
|
+
this.size;
|
|
52
65
|
} else {
|
|
53
66
|
get(t);
|
|
54
67
|
}
|
|
@@ -66,7 +79,7 @@ export class RippleMap extends Map {
|
|
|
66
79
|
// It's not possible to have a disconnect, we tract each key
|
|
67
80
|
// If the key doesn't exist, track the size in case it's added later
|
|
68
81
|
// but don't create tracked entries willy-nilly to track all possible keys
|
|
69
|
-
this
|
|
82
|
+
this.size;
|
|
70
83
|
} else {
|
|
71
84
|
get(t);
|
|
72
85
|
}
|
|
@@ -75,7 +88,7 @@ export class RippleMap extends Map {
|
|
|
75
88
|
}
|
|
76
89
|
|
|
77
90
|
set(key, value) {
|
|
78
|
-
var block =
|
|
91
|
+
var block = this.#block;
|
|
79
92
|
var tracked_items = this.#tracked_items;
|
|
80
93
|
var t = tracked_items.get(key);
|
|
81
94
|
var prev_res = super.get(key);
|
|
@@ -84,7 +97,7 @@ export class RippleMap extends Map {
|
|
|
84
97
|
|
|
85
98
|
if (!t) {
|
|
86
99
|
tracked_items.set(key, tracked(0, block));
|
|
87
|
-
set(this.#tracked_size,
|
|
100
|
+
set(this.#tracked_size, super.size, block);
|
|
88
101
|
} else if (prev_res !== value) {
|
|
89
102
|
increment(t, block);
|
|
90
103
|
}
|
|
@@ -93,7 +106,7 @@ export class RippleMap extends Map {
|
|
|
93
106
|
}
|
|
94
107
|
|
|
95
108
|
delete(key) {
|
|
96
|
-
var block =
|
|
109
|
+
var block = this.#block;
|
|
97
110
|
var tracked_items = this.#tracked_items;
|
|
98
111
|
var t = tracked_items.get(key);
|
|
99
112
|
var result = super.delete(key);
|
|
@@ -101,14 +114,14 @@ export class RippleMap extends Map {
|
|
|
101
114
|
if (t) {
|
|
102
115
|
increment(t, block);
|
|
103
116
|
tracked_items.delete(key);
|
|
104
|
-
set(this.#tracked_size,
|
|
117
|
+
set(this.#tracked_size, super.size, block);
|
|
105
118
|
}
|
|
106
119
|
|
|
107
120
|
return result;
|
|
108
121
|
}
|
|
109
122
|
|
|
110
123
|
clear() {
|
|
111
|
-
var block =
|
|
124
|
+
var block = this.#block;
|
|
112
125
|
|
|
113
126
|
if (super.size === 0) {
|
|
114
127
|
return;
|
|
@@ -124,7 +137,7 @@ export class RippleMap extends Map {
|
|
|
124
137
|
}
|
|
125
138
|
|
|
126
139
|
keys() {
|
|
127
|
-
this
|
|
140
|
+
this.size;
|
|
128
141
|
return super.keys();
|
|
129
142
|
}
|
|
130
143
|
|
|
@@ -134,12 +147,12 @@ export class RippleMap extends Map {
|
|
|
134
147
|
}
|
|
135
148
|
}
|
|
136
149
|
|
|
137
|
-
get
|
|
150
|
+
get size() {
|
|
138
151
|
return get(this.#tracked_size);
|
|
139
152
|
}
|
|
140
153
|
|
|
141
154
|
toJSON() {
|
|
142
|
-
this
|
|
155
|
+
this.size;
|
|
143
156
|
this.#read_all();
|
|
144
157
|
|
|
145
158
|
return [...this];
|
package/src/runtime/set.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @import { Block, Tracked } from '#client' */
|
|
1
2
|
import { get, increment, safe_scope, set, tracked } from './internal/client/runtime.js';
|
|
2
3
|
|
|
3
4
|
const introspect_methods = ['entries', 'forEach', 'keys', 'values', Symbol.iterator];
|
|
@@ -8,14 +9,26 @@ const new_other_methods = ['difference', 'intersection', 'symmetricDifference',
|
|
|
8
9
|
|
|
9
10
|
let init = false;
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* @template T
|
|
14
|
+
* @extends {Set<T>}
|
|
15
|
+
* @returns {TrackedSet<T>}
|
|
16
|
+
*/
|
|
17
|
+
export class TrackedSet extends Set {
|
|
18
|
+
/** @type {Tracked} */
|
|
12
19
|
#tracked_size;
|
|
20
|
+
/** @type {Map<T, Tracked>} */
|
|
13
21
|
#tracked_items = new Map();
|
|
22
|
+
/** @type {Block} */
|
|
23
|
+
#block;
|
|
14
24
|
|
|
25
|
+
/**
|
|
26
|
+
* @param {Iterable<T>} iterable
|
|
27
|
+
*/
|
|
15
28
|
constructor(iterable) {
|
|
16
29
|
super();
|
|
17
30
|
|
|
18
|
-
var block = safe_scope();
|
|
31
|
+
var block = this.#block = safe_scope();
|
|
19
32
|
|
|
20
33
|
if (iterable) {
|
|
21
34
|
for (var item of iterable) {
|
|
@@ -24,7 +37,7 @@ export class RippleSet extends Set {
|
|
|
24
37
|
}
|
|
25
38
|
}
|
|
26
39
|
|
|
27
|
-
this.#tracked_size = tracked(
|
|
40
|
+
this.#tracked_size = tracked(super.size, block);
|
|
28
41
|
|
|
29
42
|
if (!init) {
|
|
30
43
|
init = true;
|
|
@@ -33,7 +46,7 @@ export class RippleSet extends Set {
|
|
|
33
46
|
}
|
|
34
47
|
|
|
35
48
|
#init() {
|
|
36
|
-
var proto =
|
|
49
|
+
var proto = TrackedSet.prototype;
|
|
37
50
|
var set_proto = Set.prototype;
|
|
38
51
|
|
|
39
52
|
for (const method of introspect_methods) {
|
|
@@ -41,8 +54,9 @@ export class RippleSet extends Set {
|
|
|
41
54
|
continue;
|
|
42
55
|
}
|
|
43
56
|
|
|
57
|
+
/** @param {...any} v */
|
|
44
58
|
proto[method] = function (...v) {
|
|
45
|
-
this
|
|
59
|
+
this.size;
|
|
46
60
|
|
|
47
61
|
return set_proto[method].apply(this, v);
|
|
48
62
|
};
|
|
@@ -54,10 +68,10 @@ export class RippleSet extends Set {
|
|
|
54
68
|
}
|
|
55
69
|
|
|
56
70
|
proto[method] = function (other, ...v) {
|
|
57
|
-
this
|
|
71
|
+
this.size;
|
|
58
72
|
|
|
59
|
-
if (other instanceof
|
|
60
|
-
other
|
|
73
|
+
if (other instanceof TrackedSet) {
|
|
74
|
+
other.size;
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
return set_proto[method].apply(this, [other, ...v]);
|
|
@@ -70,31 +84,39 @@ export class RippleSet extends Set {
|
|
|
70
84
|
}
|
|
71
85
|
|
|
72
86
|
proto[method] = function (other, ...v) {
|
|
73
|
-
this
|
|
87
|
+
this.size;
|
|
74
88
|
|
|
75
|
-
if (other instanceof
|
|
76
|
-
other
|
|
89
|
+
if (other instanceof TrackedSet) {
|
|
90
|
+
other.size;
|
|
77
91
|
}
|
|
78
92
|
|
|
79
|
-
return new
|
|
93
|
+
return new TrackedSet(set_proto[method].apply(this, [other, ...v]));
|
|
80
94
|
};
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
97
|
|
|
98
|
+
/**
|
|
99
|
+
* @param {T} value
|
|
100
|
+
* @returns {this}
|
|
101
|
+
*/
|
|
84
102
|
add(value) {
|
|
85
|
-
var block =
|
|
103
|
+
var block = this.#block;
|
|
86
104
|
|
|
87
105
|
if (!super.has(value)) {
|
|
88
106
|
super.add(value);
|
|
89
107
|
this.#tracked_items.set(value, tracked(0, block));
|
|
90
|
-
set(this.#tracked_size,
|
|
108
|
+
set(this.#tracked_size, super.size, block);
|
|
91
109
|
}
|
|
92
110
|
|
|
93
111
|
return this;
|
|
94
112
|
}
|
|
95
113
|
|
|
114
|
+
/**
|
|
115
|
+
* @param {T} value
|
|
116
|
+
* @returns {boolean}
|
|
117
|
+
*/
|
|
96
118
|
delete(value) {
|
|
97
|
-
var block =
|
|
119
|
+
var block = this.#block;
|
|
98
120
|
|
|
99
121
|
if (!super.delete(value)) {
|
|
100
122
|
return false;
|
|
@@ -104,13 +126,17 @@ export class RippleSet extends Set {
|
|
|
104
126
|
|
|
105
127
|
increment(t, block);
|
|
106
128
|
this.#tracked_items.delete(value);
|
|
107
|
-
set(this.#tracked_size,
|
|
129
|
+
set(this.#tracked_size, super.size, block);
|
|
108
130
|
|
|
109
131
|
return true;
|
|
110
132
|
}
|
|
111
133
|
|
|
134
|
+
/**
|
|
135
|
+
* @param {T} value
|
|
136
|
+
* @return {boolean}
|
|
137
|
+
*/
|
|
112
138
|
has(value) {
|
|
113
|
-
|
|
139
|
+
|
|
114
140
|
var has = super.has(value);
|
|
115
141
|
var tracked_items = this.#tracked_items;
|
|
116
142
|
var t = tracked_items.get(value);
|
|
@@ -120,7 +146,7 @@ export class RippleSet extends Set {
|
|
|
120
146
|
// It's not possible to have a disconnect, we track each value
|
|
121
147
|
// If the value doesn't exist, track the size in case it's added later
|
|
122
148
|
// but don't create tracked entries willy-nilly to track all possible values
|
|
123
|
-
this
|
|
149
|
+
this.size;
|
|
124
150
|
} else {
|
|
125
151
|
get(t);
|
|
126
152
|
}
|
|
@@ -129,7 +155,7 @@ export class RippleSet extends Set {
|
|
|
129
155
|
}
|
|
130
156
|
|
|
131
157
|
clear() {
|
|
132
|
-
var block =
|
|
158
|
+
var block = this.#block;
|
|
133
159
|
|
|
134
160
|
if (super.size === 0) {
|
|
135
161
|
return;
|
|
@@ -144,12 +170,12 @@ export class RippleSet extends Set {
|
|
|
144
170
|
set(this.#tracked_size, 0, block);
|
|
145
171
|
}
|
|
146
172
|
|
|
147
|
-
get
|
|
173
|
+
get size() {
|
|
148
174
|
return get(this.#tracked_size);
|
|
149
175
|
}
|
|
150
176
|
|
|
151
177
|
toJSON() {
|
|
152
|
-
this
|
|
178
|
+
this.size;
|
|
153
179
|
|
|
154
180
|
return [...this];
|
|
155
181
|
}
|