@esportsplus/reactivity 0.13.1 → 0.14.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.
@@ -2,6 +2,40 @@ import { Infer } from '../types.js';
2
2
  type API<T> = Infer<T[]> & {
3
3
  clear: () => void;
4
4
  dispose: () => void;
5
+ dispatch: <T, K extends keyof Events<T>, V>(event: K, value?: V) => void;
6
+ map: <T, R>(this: API<T>, fn: (this: API<T>, value: T, i: number) => R, i?: number, n?: number) => R[];
7
+ on: <T, K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
8
+ once: <T, K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
9
+ };
10
+ type Events<T> = {
11
+ clear: undefined;
12
+ pop: {
13
+ item: T;
14
+ };
15
+ push: {
16
+ items: T[];
17
+ };
18
+ reverse: undefined;
19
+ set: {
20
+ index: number;
21
+ item: T;
22
+ };
23
+ shift: {
24
+ item: T;
25
+ };
26
+ sort: undefined;
27
+ splice: {
28
+ deleteCount: number;
29
+ items: T[];
30
+ start: number;
31
+ };
32
+ unshift: {
33
+ items: T[];
34
+ };
35
+ };
36
+ type Listener<V> = {
37
+ once?: boolean;
38
+ (value: V): void;
5
39
  };
6
40
  declare const _default: <T>(data: T[]) => API<T>;
7
41
  export default _default;
@@ -1,21 +1,10 @@
1
1
  import { isNumber } from '@esportsplus/utilities';
2
2
  import { REACTIVE_ARRAY } from '../constants.js';
3
- import { dispose as d, isComputed, read } from '../system.js';
4
3
  import { isReactiveObject } from './object.js';
5
- function at(data, i) {
6
- let value = data[i];
7
- if (isComputed(value)) {
8
- return read(value);
9
- }
10
- return value;
11
- }
12
4
  function cleanup(item) {
13
5
  if (isReactiveObject(item)) {
14
6
  item.dispose();
15
7
  }
16
- else if (isComputed(item)) {
17
- d(item);
18
- }
19
8
  }
20
9
  function clear(data, listeners) {
21
10
  dispose(data);
@@ -58,8 +47,7 @@ function map(data, proxy, fn, i, n) {
58
47
  n = Math.min(n, data.length);
59
48
  let values = new Array(n - i);
60
49
  for (; i < n; i++) {
61
- let item = data[i];
62
- values[i] = fn.call(proxy, (isComputed(item) ? item.value : item), i);
50
+ values[i] = fn.call(proxy, data[i], i);
63
51
  }
64
52
  return values;
65
53
  }
@@ -112,7 +100,7 @@ function shift(data, listeners) {
112
100
  return item;
113
101
  }
114
102
  function sort(data, listeners, fn) {
115
- data.sort((a, b) => fn((isComputed(a) ? a.value : a), (isComputed(b) ? b.value : b)));
103
+ data.sort((a, b) => fn(a, b));
116
104
  dispatch(listeners, 'sort');
117
105
  }
118
106
  function splice(data, listeners, start, deleteCount = data.length, items = []) {
@@ -138,11 +126,7 @@ export default (data) => {
138
126
  let listeners = {}, proxy = new Proxy({}, {
139
127
  get(_, key) {
140
128
  if (isNumber(key)) {
141
- let value = data[key];
142
- if (isComputed(value)) {
143
- return read(value);
144
- }
145
- return value;
129
+ return data[key];
146
130
  }
147
131
  else if (key in wrapper) {
148
132
  return wrapper[key];
@@ -173,7 +157,7 @@ export default (data) => {
173
157
  }
174
158
  }), wrapper = {
175
159
  [REACTIVE_ARRAY]: true,
176
- at: (i) => at(data, i),
160
+ at: (i) => data[i],
177
161
  clear: () => {
178
162
  clear(data, listeners);
179
163
  return proxy;
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "private": false,
13
13
  "type": "module",
14
14
  "types": "build/index.d.ts",
15
- "version": "0.13.1",
15
+ "version": "0.14.0",
16
16
  "scripts": {
17
17
  "build": "tsc && tsc-alias",
18
18
  "-": "-"
@@ -1,6 +1,5 @@
1
1
  import { isNumber } from '@esportsplus/utilities';
2
2
  import { REACTIVE_ARRAY } from '~/constants';
3
- import { dispose as d, isComputed, read } from '~/system';
4
3
  import { Infer } from '~/types';
5
4
  import { isReactiveObject } from './object';
6
5
 
@@ -8,6 +7,10 @@ import { isReactiveObject } from './object';
8
7
  type API<T> = Infer<T[]> & {
9
8
  clear: () => void;
10
9
  dispose: () => void;
10
+ dispatch: <T, K extends keyof Events<T>, V>(event: K, value?: V) => void;
11
+ map: <T, R>(this: API<T>, fn: (this: API<T>, value: T, i: number) => R, i?: number, n?: number) => R[];
12
+ on: <T, K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
13
+ once: <T, K extends keyof Events<T>>(event: K, listener: Listener<Events<T>[K]>) => void;
11
14
  };
12
15
 
13
16
  type Events<T> = {
@@ -45,23 +48,10 @@ type Listener<V> = {
45
48
  type Listeners = Record<string, (Listener<any> | null)[]>;
46
49
 
47
50
 
48
- function at<T>(data: T[], i: number) {
49
- let value = data[i];
50
-
51
- if (isComputed(value)) {
52
- return read(value);
53
- }
54
-
55
- return value;
56
- }
57
-
58
51
  function cleanup<T>(item: T) {
59
52
  if (isReactiveObject(item)) {
60
53
  item.dispose();
61
54
  }
62
- else if (isComputed(item)) {
63
- d(item);
64
- }
65
55
  }
66
56
 
67
57
  function clear<T>(data: T[], listeners: Listeners) {
@@ -124,13 +114,7 @@ function map<T, R>(
124
114
  let values: R[] = new Array(n - i);
125
115
 
126
116
  for (; i < n; i++) {
127
- let item = data[i];
128
-
129
- values[i] = fn.call(
130
- proxy,
131
- (isComputed(item) ? item.value : item) as T,
132
- i
133
- );
117
+ values[i] = fn.call(proxy, data[i], i);
134
118
  }
135
119
 
136
120
  return values;
@@ -201,10 +185,7 @@ function shift<T>(data: T[], listeners: Listeners) {
201
185
  }
202
186
 
203
187
  function sort<T>(data: T[], listeners: Listeners, fn: (a: T, b: T) => number) {
204
- data.sort((a, b) => fn(
205
- (isComputed(a) ? a.value : a) as T,
206
- (isComputed(b) ? b.value : b) as T
207
- ));
188
+ data.sort((a, b) => fn(a, b));
208
189
  dispatch(listeners, 'sort');
209
190
  }
210
191
 
@@ -240,13 +221,7 @@ export default <T>(data: T[]) => {
240
221
  proxy = new Proxy({}, {
241
222
  get(_, key: any) {
242
223
  if (isNumber(key)) {
243
- let value = data[key];
244
-
245
- if (isComputed(value)) {
246
- return read(value);
247
- }
248
-
249
- return value;
224
+ return data[key];
250
225
  }
251
226
  else if (key in wrapper) {
252
227
  return wrapper[key as keyof typeof wrapper];
@@ -280,7 +255,7 @@ export default <T>(data: T[]) => {
280
255
  }) as API<T>,
281
256
  wrapper = {
282
257
  [REACTIVE_ARRAY]: true,
283
- at: (i: number) => at(data, i),
258
+ at: (i: number) => data[i],
284
259
  clear: () => {
285
260
  clear(data, listeners);
286
261
  return proxy;