@esportsplus/reactivity 0.18.0 → 0.19.0

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.
@@ -33,10 +33,7 @@ type Listeners = Record<string, (Listener<any> | null)[]>;
33
33
  declare class ReactiveArray<T> extends Array<T> {
34
34
  [REACTIVE_ARRAY]: boolean;
35
35
  listeners: Listeners;
36
- trigger: import("../system.js").Signal<boolean>;
37
36
  constructor(...items: T[]);
38
- get length(): number;
39
- set length(n: number);
40
37
  clear(): void;
41
38
  dispatch<K extends keyof Events<T>, V>(event: K, value?: V): void;
42
39
  dispose(): void;
@@ -1,25 +1,14 @@
1
1
  import { REACTIVE_ARRAY } from '../constants.js';
2
- import { read, set, signal } from '../system.js';
3
2
  import { isReactiveObject } from './object.js';
4
3
  class ReactiveArray extends Array {
5
4
  [REACTIVE_ARRAY] = true;
6
5
  listeners = {};
7
- trigger = signal(false);
8
6
  constructor(...items) {
9
7
  super(...items);
10
8
  }
11
- get length() {
12
- read(this.trigger);
13
- return super.length;
14
- }
15
- set length(n) {
16
- super.length = n;
17
- set(this.trigger, !this.trigger.value);
18
- }
19
9
  clear() {
20
10
  this.dispose();
21
11
  this.dispatch('clear');
22
- set(this.trigger, !this.trigger.value);
23
12
  }
24
13
  dispatch(event, value) {
25
14
  let listeners = this.listeners[event];
@@ -80,20 +69,17 @@ class ReactiveArray extends Array {
80
69
  item.dispose();
81
70
  }
82
71
  this.dispatch('pop', { item });
83
- set(this.trigger, !this.trigger.value);
84
72
  }
85
73
  return item;
86
74
  }
87
75
  push(...items) {
88
76
  let length = super.push(...items);
89
77
  this.dispatch('push', { items });
90
- set(this.trigger, !this.trigger.value);
91
78
  return length;
92
79
  }
93
80
  reverse() {
94
81
  super.reverse();
95
82
  this.dispatch('reverse');
96
- set(this.trigger, !this.trigger.value);
97
83
  return this;
98
84
  }
99
85
  shift() {
@@ -103,14 +89,12 @@ class ReactiveArray extends Array {
103
89
  item.dispose();
104
90
  }
105
91
  this.dispatch('shift', { item });
106
- set(this.trigger, !this.trigger.value);
107
92
  }
108
93
  return item;
109
94
  }
110
95
  sort(fn) {
111
96
  super.sort(fn);
112
97
  this.dispatch('sort');
113
- set(this.trigger, !this.trigger.value);
114
98
  return this;
115
99
  }
116
100
  splice(start, deleteCount = this.length, ...items) {
@@ -123,14 +107,12 @@ class ReactiveArray extends Array {
123
107
  }
124
108
  }
125
109
  this.dispatch('splice', { deleteCount, items, start });
126
- set(this.trigger, !this.trigger.value);
127
110
  }
128
111
  return removed;
129
112
  }
130
113
  unshift(...items) {
131
114
  let length = super.unshift(...items);
132
115
  this.dispatch('unshift', { items });
133
- set(this.trigger, !this.trigger.value);
134
116
  return length;
135
117
  }
136
118
  }
package/build/system.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { isObject } from '@esportsplus/utilities';
2
2
  import { COMPUTED, SIGNAL, STABILIZER_IDLE, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_NOTIFY_MASK, STATE_RECOMPUTING } from './constants.js';
3
- let depth = 0, heap = new Array(64), heap_i = 0, heap_n = 0, microtask = queueMicrotask, notified = false, observer = null, scope = null, stabilizer = STABILIZER_IDLE, version = 0;
3
+ let depth = 0, heap = new Array(64), heap_i = 0, heap_n = 0, linkPool = [], linkPoolMax = 1000, microtask = queueMicrotask, notified = false, observer = null, scope = null, stabilizer = STABILIZER_IDLE, version = 0;
4
4
  function cleanup(computed) {
5
5
  if (!computed.cleanup) {
6
6
  return;
@@ -82,15 +82,23 @@ function link(dep, sub) {
82
82
  prevSub.sub === sub) {
83
83
  return;
84
84
  }
85
- let newLink = sub.depsTail =
86
- dep.subsTail = {
87
- dep,
88
- sub,
89
- nextDep,
90
- prevSub,
91
- nextSub: null,
92
- version
93
- };
85
+ let pooled = linkPool.pop(), newLink = sub.depsTail =
86
+ dep.subsTail = pooled
87
+ ? (pooled.dep = dep,
88
+ pooled.sub = sub,
89
+ pooled.nextDep = nextDep,
90
+ pooled.prevSub = prevSub,
91
+ pooled.nextSub = null,
92
+ pooled.version = version,
93
+ pooled)
94
+ : {
95
+ dep,
96
+ sub,
97
+ nextDep,
98
+ prevSub,
99
+ nextSub: null,
100
+ version
101
+ };
94
102
  if (prevDep) {
95
103
  prevDep.nextDep = newLink;
96
104
  }
@@ -214,6 +222,11 @@ function unlink(link) {
214
222
  else if ((dep.subs = nextSub) === null && 'fn' in dep) {
215
223
  dispose(dep);
216
224
  }
225
+ if (linkPool.length < linkPoolMax) {
226
+ link.dep = link.sub = null;
227
+ link.nextDep = link.nextSub = link.prevSub = null;
228
+ linkPool.push(link);
229
+ }
217
230
  return nextDep;
218
231
  }
219
232
  function update(computed) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "author": "ICJR",
3
3
  "dependencies": {
4
4
  "@esportsplus/custom-function": "^0.0.13",
5
- "@esportsplus/utilities": "^0.22.2"
5
+ "@esportsplus/utilities": "^0.25.0"
6
6
  },
7
7
  "devDependencies": {
8
8
  "@esportsplus/typescript": "^0.9.2"
@@ -12,7 +12,7 @@
12
12
  "private": false,
13
13
  "type": "module",
14
14
  "types": "build/index.d.ts",
15
- "version": "0.18.0",
15
+ "version": "0.19.0",
16
16
  "scripts": {
17
17
  "build": "tsc && tsc-alias",
18
18
  "-": "-"
@@ -1,5 +1,4 @@
1
1
  import { REACTIVE_ARRAY } from '~/constants';
2
- import { read, set, signal } from '~/system';
3
2
  import { isReactiveObject } from './object';
4
3
 
5
4
 
@@ -41,7 +40,6 @@ type Listeners = Record<string, (Listener<any> | null)[]>;
41
40
  class ReactiveArray<T> extends Array<T> {
42
41
  [REACTIVE_ARRAY] = true;
43
42
  listeners: Listeners = {};
44
- trigger = signal(false);
45
43
 
46
44
 
47
45
  constructor(...items: T[]) {
@@ -49,22 +47,9 @@ class ReactiveArray<T> extends Array<T> {
49
47
  }
50
48
 
51
49
 
52
- get length() {
53
- read(this.trigger);
54
-
55
- return super.length;
56
- }
57
-
58
- set length(n: number) {
59
- super.length = n;
60
- set(this.trigger, !this.trigger.value);
61
- }
62
-
63
-
64
50
  clear() {
65
51
  this.dispose();
66
52
  this.dispatch('clear');
67
- set(this.trigger, !this.trigger.value);
68
53
  }
69
54
 
70
55
  dispatch<K extends keyof Events<T>, V>(event: K, value?: V) {
@@ -141,7 +126,6 @@ class ReactiveArray<T> extends Array<T> {
141
126
  item.dispose();
142
127
  }
143
128
  this.dispatch('pop', { item });
144
- set(this.trigger, !this.trigger.value);
145
129
  }
146
130
 
147
131
  return item;
@@ -151,7 +135,6 @@ class ReactiveArray<T> extends Array<T> {
151
135
  let length = super.push(...items);
152
136
 
153
137
  this.dispatch('push', { items });
154
- set(this.trigger, !this.trigger.value);
155
138
 
156
139
  return length;
157
140
  }
@@ -159,7 +142,6 @@ class ReactiveArray<T> extends Array<T> {
159
142
  reverse() {
160
143
  super.reverse();
161
144
  this.dispatch('reverse');
162
- set(this.trigger, !this.trigger.value);
163
145
 
164
146
  return this;
165
147
  }
@@ -172,7 +154,6 @@ class ReactiveArray<T> extends Array<T> {
172
154
  item.dispose();
173
155
  }
174
156
  this.dispatch('shift', { item });
175
- set(this.trigger, !this.trigger.value);
176
157
  }
177
158
 
178
159
  return item;
@@ -181,7 +162,6 @@ class ReactiveArray<T> extends Array<T> {
181
162
  sort(fn: (a: T, b: T) => number) {
182
163
  super.sort(fn);
183
164
  this.dispatch('sort');
184
- set(this.trigger, !this.trigger.value);
185
165
 
186
166
  return this;
187
167
  }
@@ -199,7 +179,6 @@ class ReactiveArray<T> extends Array<T> {
199
179
  }
200
180
 
201
181
  this.dispatch('splice', { deleteCount, items, start });
202
- set(this.trigger, !this.trigger.value);
203
182
  }
204
183
 
205
184
  return removed;
@@ -209,7 +188,6 @@ class ReactiveArray<T> extends Array<T> {
209
188
  let length = super.unshift(...items);
210
189
 
211
190
  this.dispatch('unshift', { items });
212
- set(this.trigger, !this.trigger.value);
213
191
 
214
192
  return length;
215
193
  }
package/src/system.ts CHANGED
@@ -11,6 +11,8 @@ let depth = 0,
11
11
  heap: (Computed<unknown> | undefined)[] = new Array(64),
12
12
  heap_i = 0,
13
13
  heap_n = 0,
14
+ linkPool: Link[] = [],
15
+ linkPoolMax = 1000,
14
16
  microtask = queueMicrotask,
15
17
  notified = false,
16
18
  observer: Computed<unknown> | null = null,
@@ -135,16 +137,25 @@ function link<T>(dep: Signal<T> | Computed<T>, sub: Computed<T>) {
135
137
  return;
136
138
  }
137
139
 
138
- let newLink =
140
+ let pooled = linkPool.pop(),
141
+ newLink =
139
142
  sub.depsTail =
140
- dep.subsTail = {
141
- dep,
142
- sub,
143
- nextDep,
144
- prevSub,
145
- nextSub: null,
146
- version
147
- };
143
+ dep.subsTail = pooled
144
+ ? (pooled.dep = dep,
145
+ pooled.sub = sub,
146
+ pooled.nextDep = nextDep,
147
+ pooled.prevSub = prevSub,
148
+ pooled.nextSub = null,
149
+ pooled.version = version,
150
+ pooled)
151
+ : {
152
+ dep,
153
+ sub,
154
+ nextDep,
155
+ prevSub,
156
+ nextSub: null,
157
+ version
158
+ };
148
159
 
149
160
  if (prevDep) {
150
161
  prevDep.nextDep = newLink;
@@ -314,6 +325,13 @@ function unlink(link: Link): Link | null {
314
325
  dispose(dep);
315
326
  }
316
327
 
328
+ // Release link back to pool
329
+ if (linkPool.length < linkPoolMax) {
330
+ link.dep = link.sub = null as any;
331
+ link.nextDep = link.nextSub = link.prevSub = null;
332
+ linkPool.push(link);
333
+ }
334
+
317
335
  return nextDep;
318
336
  }
319
337