reactish-state 0.5.1 → 0.5.3

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/dist/cjs/index.js CHANGED
@@ -29,6 +29,13 @@ var state = function state(initialValue, actionCreator) {
29
29
  actions: actionCreator && actionCreator(set, get)
30
30
  };
31
31
  };
32
+
33
+ var isEqual = function isEqual(args1, args2) {
34
+ for (var i = 0; i < args1.length; i++) {
35
+ if (!Object.is(args1[i], args2[i])) return false;
36
+ }
37
+ return true;
38
+ };
32
39
  var selector = function selector() {
33
40
  for (var _len = arguments.length, items = new Array(_len), _key = 0; _key < _len; _key++) {
34
41
  items[_key] = arguments[_key];
@@ -36,11 +43,19 @@ var selector = function selector() {
36
43
  var lastIndex = items.length - 1;
37
44
  var selectorFunc = items[lastIndex];
38
45
  items.length = lastIndex;
46
+ var cache;
39
47
  return {
40
48
  get: function get() {
41
- return selectorFunc.apply(void 0, items.map(function (item) {
49
+ var args = items.map(function (item) {
42
50
  return item.get();
43
- }));
51
+ });
52
+ if (cache && isEqual(args, cache.args)) return cache.ret;
53
+ var ret = selectorFunc.apply(void 0, args);
54
+ cache = {
55
+ args: args,
56
+ ret: ret
57
+ };
58
+ return ret;
44
59
  },
45
60
  subscribe: function subscribe(listener) {
46
61
  var unsubscribers = items.map(function (item) {
@@ -56,8 +71,7 @@ var selector = function selector() {
56
71
  };
57
72
 
58
73
  var useSnapshot = function useSnapshot(state) {
59
- var value = shim.useSyncExternalStore(state.subscribe, state.get, state.get);
60
- return value;
74
+ return shim.useSyncExternalStore(state.subscribe, state.get, state.get);
61
75
  };
62
76
 
63
77
  exports.selector = selector;
package/dist/es/index.js CHANGED
@@ -1,2 +1,3 @@
1
- export { selector, state } from './vanilla.js';
2
- export { useSnapshot } from './react.js';
1
+ export { state } from './vanilla/state.js';
2
+ export { selector } from './vanilla/selector.js';
3
+ export { useSnapshot } from './react/useSnapshot.js';
@@ -1,8 +1,7 @@
1
1
  import { useSyncExternalStore } from 'use-sync-external-store/shim';
2
2
 
3
3
  var useSnapshot = function useSnapshot(state) {
4
- var value = useSyncExternalStore(state.subscribe, state.get, state.get);
5
- return value;
4
+ return useSyncExternalStore(state.subscribe, state.get, state.get);
6
5
  };
7
6
 
8
7
  export { useSnapshot };
@@ -0,0 +1,41 @@
1
+ var isEqual = function isEqual(args1, args2) {
2
+ for (var i = 0; i < args1.length; i++) {
3
+ if (!Object.is(args1[i], args2[i])) return false;
4
+ }
5
+ return true;
6
+ };
7
+ var selector = function selector() {
8
+ for (var _len = arguments.length, items = new Array(_len), _key = 0; _key < _len; _key++) {
9
+ items[_key] = arguments[_key];
10
+ }
11
+ var lastIndex = items.length - 1;
12
+ var selectorFunc = items[lastIndex];
13
+ items.length = lastIndex;
14
+ var cache;
15
+ return {
16
+ get: function get() {
17
+ var args = items.map(function (item) {
18
+ return item.get();
19
+ });
20
+ if (cache && isEqual(args, cache.args)) return cache.ret;
21
+ var ret = selectorFunc.apply(void 0, args);
22
+ cache = {
23
+ args: args,
24
+ ret: ret
25
+ };
26
+ return ret;
27
+ },
28
+ subscribe: function subscribe(listener) {
29
+ var unsubscribers = items.map(function (item) {
30
+ return item.subscribe(listener);
31
+ });
32
+ return function () {
33
+ return unsubscribers.forEach(function (unsubscribe) {
34
+ return unsubscribe();
35
+ });
36
+ };
37
+ }
38
+ };
39
+ };
40
+
41
+ export { selector };
@@ -0,0 +1,29 @@
1
+ var state = function state(initialValue, actionCreator) {
2
+ var value = initialValue;
3
+ var listeners = new Set();
4
+ function get() {
5
+ return value;
6
+ }
7
+ function set(newValue) {
8
+ var nextValue = typeof newValue === 'function' ? newValue(value) : newValue;
9
+ if (!Object.is(value, nextValue)) {
10
+ value = nextValue;
11
+ listeners.forEach(function (listener) {
12
+ listener();
13
+ });
14
+ }
15
+ }
16
+ return {
17
+ get: get,
18
+ set: set,
19
+ subscribe: function subscribe(listener) {
20
+ listeners.add(listener);
21
+ return function () {
22
+ listeners["delete"](listener);
23
+ };
24
+ },
25
+ actions: actionCreator && actionCreator(set, get)
26
+ };
27
+ };
28
+
29
+ export { state };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reactish-state",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "",
5
5
  "author": "Zheng Song",
6
6
  "license": "MIT",
package/types/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { state, selector } from './vanilla';
2
- export { useSnapshot } from './react';
1
+ export { state } from './vanilla/state';
2
+ export { selector } from './vanilla/selector';
3
+ export { useSnapshot } from './react/useSnapshot';
@@ -1,3 +1,3 @@
1
- import { Reactish } from './vanilla';
1
+ import type { Reactish } from '../vanilla/common';
2
2
  declare const useSnapshot: <T>(state: Reactish<T>) => T;
3
3
  export { useSnapshot };
@@ -0,0 +1,5 @@
1
+ export declare type Listener = () => void;
2
+ export interface Reactish<T> {
3
+ get: () => T;
4
+ subscribe: (listener: Listener) => () => void;
5
+ }
@@ -0,0 +1,11 @@
1
+ import type { Reactish, Listener } from './common';
2
+ declare type ReactishArray = Reactish<unknown>[];
3
+ declare type ReactishValueArray<R extends ReactishArray> = {
4
+ [index in keyof R]: ReturnType<R[index]['get']>;
5
+ };
6
+ declare type SelectorFunc<R extends ReactishArray, T> = (...args: ReactishValueArray<R>) => T;
7
+ declare const selector: <R extends ReactishArray, T>(...items: [...R, SelectorFunc<R, T>]) => {
8
+ get: () => T;
9
+ subscribe: (listener: Listener) => () => void;
10
+ };
11
+ export { selector };
@@ -0,0 +1,9 @@
1
+ import type { Reactish } from './common';
2
+ declare type Setter<T> = (newValue: T | ((value: T) => T)) => void;
3
+ declare type ActionCreator<T, A> = ((set: Setter<T>, get: () => T) => A) | undefined;
4
+ interface State<T, A = unknown, C extends ActionCreator<T, A> = undefined> extends Reactish<T> {
5
+ set: Setter<T>;
6
+ actions: C extends undefined ? never : A;
7
+ }
8
+ declare const state: <T, A>(initialValue: T, actionCreator?: ActionCreator<T, A>) => State<T, A, ActionCreator<T, A>>;
9
+ export { state };
@@ -1,54 +0,0 @@
1
- var state = function state(initialValue, actionCreator) {
2
- var value = initialValue;
3
- var listeners = new Set();
4
- function get() {
5
- return value;
6
- }
7
- function set(newValue) {
8
- var nextValue = typeof newValue === 'function' ? newValue(value) : newValue;
9
- if (!Object.is(value, nextValue)) {
10
- value = nextValue;
11
- listeners.forEach(function (listener) {
12
- listener();
13
- });
14
- }
15
- }
16
- return {
17
- get: get,
18
- set: set,
19
- subscribe: function subscribe(listener) {
20
- listeners.add(listener);
21
- return function () {
22
- listeners["delete"](listener);
23
- };
24
- },
25
- actions: actionCreator && actionCreator(set, get)
26
- };
27
- };
28
- var selector = function selector() {
29
- for (var _len = arguments.length, items = new Array(_len), _key = 0; _key < _len; _key++) {
30
- items[_key] = arguments[_key];
31
- }
32
- var lastIndex = items.length - 1;
33
- var selectorFunc = items[lastIndex];
34
- items.length = lastIndex;
35
- return {
36
- get: function get() {
37
- return selectorFunc.apply(void 0, items.map(function (item) {
38
- return item.get();
39
- }));
40
- },
41
- subscribe: function subscribe(listener) {
42
- var unsubscribers = items.map(function (item) {
43
- return item.subscribe(listener);
44
- });
45
- return function () {
46
- return unsubscribers.forEach(function (unsubscribe) {
47
- return unsubscribe();
48
- });
49
- };
50
- }
51
- };
52
- };
53
-
54
- export { selector, state };
@@ -1,22 +0,0 @@
1
- declare type Listener = () => void;
2
- declare type Setter<T> = (newValue: T | ((value: T) => T)) => void;
3
- declare type ActionCreator<T, A> = ((set: Setter<T>, get: () => T) => A) | undefined;
4
- interface Reactish<T> {
5
- get: () => T;
6
- subscribe: (listener: Listener) => () => void;
7
- }
8
- interface State<T, A = unknown, C extends ActionCreator<T, A> = undefined> extends Reactish<T> {
9
- set: Setter<T>;
10
- actions: C extends undefined ? never : A;
11
- }
12
- declare const state: <T, A>(initialValue: T, actionCreator?: ActionCreator<T, A>) => State<T, A, ActionCreator<T, A>>;
13
- declare type ReactishArray = Reactish<unknown>[];
14
- declare type ReactishValueArray<R extends ReactishArray> = {
15
- [index in keyof R]: ReturnType<R[index]['get']>;
16
- };
17
- declare type SelectorFunc<R extends ReactishArray, T> = (...args: ReactishValueArray<R>) => T;
18
- declare const selector: <R extends ReactishArray, T>(...items: [...R, SelectorFunc<R, T>]) => {
19
- get: () => T;
20
- subscribe: (listener: Listener) => () => void;
21
- };
22
- export { Reactish, state, selector };