flatsignals 0.2.2 → 0.2.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/react.d.ts CHANGED
@@ -2,10 +2,11 @@ import { n as FlatRoot, r as FlatSignal, t as FlatCompute } from "./index-BUz21f
2
2
 
3
3
  //#region src/react/index.d.ts
4
4
  declare function useFlatReader<T>(signal: FlatSignal<T> | FlatCompute<T>, isEqual?: (a: T, b: T) => boolean): T;
5
+ declare function useFlatSelector<T, R>(signal: FlatSignal<T> | FlatCompute<T>, selector: (value: T) => R, isEqual?: (a: R, b: R) => boolean): R;
5
6
  declare function useFlatWriter<T>(signal: FlatSignal<T>): (val: T | ((oldVal: T) => T)) => void;
6
7
  declare function useFlatSignal<T>(signal: FlatSignal<T>): readonly [T, (val: T | ((oldVal: T) => T)) => void];
7
8
  declare function useFlatEffect(fn: () => undefined | (() => void)): void;
8
9
  declare function useFlatScope<T>(callback: () => T, scope?: FlatRoot): T;
9
10
  //#endregion
10
- export { useFlatEffect, useFlatReader, useFlatScope, useFlatSignal, useFlatWriter };
11
+ export { useFlatEffect, useFlatReader, useFlatScope, useFlatSelector, useFlatSignal, useFlatWriter };
11
12
  //# sourceMappingURL=react.d.ts.map
package/dist/react.js CHANGED
@@ -12,6 +12,20 @@ function useFlatReader(signal, isEqual = Object.is) {
12
12
  }
13
13
  }), signal.root), [signal, isEqual]), () => signal.val, () => signal.peek);
14
14
  }
15
+ function useFlatSelector(signal, selector, isEqual = Object.is) {
16
+ const lastSelectedRef = useRef(selector(signal.peek));
17
+ return useSyncExternalStore(useCallback((onStoreChange) => scoped(() => effect(() => {
18
+ const newSelected = selector(signal.val);
19
+ if (!isEqual(lastSelectedRef.current, newSelected)) {
20
+ lastSelectedRef.current = newSelected;
21
+ onStoreChange();
22
+ }
23
+ }), signal.root), [
24
+ signal,
25
+ selector,
26
+ isEqual
27
+ ]), () => selector(signal.val), () => selector(signal.peek));
28
+ }
15
29
  function useFlatWriter(signal) {
16
30
  return useCallback((val) => {
17
31
  if (typeof val === "function") signal.val = val(signal.peek);
@@ -39,5 +53,5 @@ function useFlatScope(callback, scope) {
39
53
  }
40
54
 
41
55
  //#endregion
42
- export { useFlatEffect, useFlatReader, useFlatScope, useFlatSignal, useFlatWriter };
56
+ export { useFlatEffect, useFlatReader, useFlatScope, useFlatSelector, useFlatSignal, useFlatWriter };
43
57
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":["cleanup: undefined | (() => void)"],"sources":["../src/react/index.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport {\n effect,\n type FlatCompute,\n type FlatRoot,\n type FlatSignal,\n scoped,\n} from \"../index.js\";\n\nexport function useFlatReader<T>(\n signal: FlatSignal<T> | FlatCompute<T>,\n isEqual: (a: T, b: T) => boolean = Object.is\n): T {\n const lastValueRef = useRef<T>(signal.peek);\n\n return useSyncExternalStore(\n useCallback(\n (onStoreChange) =>\n scoped(\n () =>\n effect(() => {\n const newValue = signal.val;\n if (!isEqual(lastValueRef.current, newValue)) {\n lastValueRef.current = newValue;\n onStoreChange();\n }\n }),\n signal.root\n ),\n [signal, isEqual]\n ),\n () => signal.val,\n () => signal.peek\n );\n}\n\nexport function useFlatWriter<T>(\n signal: FlatSignal<T>\n): (val: T | ((oldVal: T) => T)) => void {\n return useCallback(\n (val) => {\n if (typeof val === \"function\") {\n signal.val = (val as (oldVal: T) => T)(signal.peek);\n } else {\n signal.val = val;\n }\n },\n [signal]\n );\n}\n\nexport function useFlatSignal<T>(signal: FlatSignal<T>) {\n const reader = useFlatReader(signal);\n const writer = useFlatWriter(signal);\n return [reader, writer] as const;\n}\n\nexport function useFlatEffect(fn: () => undefined | (() => void)): void {\n useEffect(() => {\n let cleanup: undefined | (() => void);\n const stop = effect(() => {\n if (cleanup) cleanup();\n cleanup = fn();\n });\n\n return () => {\n if (cleanup) cleanup();\n stop();\n };\n }, [fn]);\n}\n\nexport function useFlatScope<T>(callback: () => T, scope?: FlatRoot): T {\n return useMemo(() => scoped(callback, scope), [callback, scope]);\n}\n"],"mappings":";;;;AAeA,SAAgB,cACd,QACA,UAAmC,OAAO,IACvC;CACH,MAAM,eAAe,OAAU,OAAO,KAAK;AAE3C,QAAO,qBACL,aACG,kBACC,aAEI,aAAa;EACX,MAAM,WAAW,OAAO;AACxB,MAAI,CAAC,QAAQ,aAAa,SAAS,SAAS,EAAE;AAC5C,gBAAa,UAAU;AACvB,kBAAe;;GAEjB,EACJ,OAAO,KACR,EACH,CAAC,QAAQ,QAAQ,CAClB,QACK,OAAO,WACP,OAAO,KACd;;AAGH,SAAgB,cACd,QACuC;AACvC,QAAO,aACJ,QAAQ;AACP,MAAI,OAAO,QAAQ,WACjB,QAAO,MAAO,IAAyB,OAAO,KAAK;MAEnD,QAAO,MAAM;IAGjB,CAAC,OAAO,CACT;;AAGH,SAAgB,cAAiB,QAAuB;AAGtD,QAAO,CAFQ,cAAc,OAAO,EACrB,cAAc,OAAO,CACb;;AAGzB,SAAgB,cAAc,IAA0C;AACtE,iBAAgB;EACd,IAAIA;EACJ,MAAM,OAAO,aAAa;AACxB,OAAI,QAAS,UAAS;AACtB,aAAU,IAAI;IACd;AAEF,eAAa;AACX,OAAI,QAAS,UAAS;AACtB,SAAM;;IAEP,CAAC,GAAG,CAAC;;AAGV,SAAgB,aAAgB,UAAmB,OAAqB;AACtE,QAAO,cAAc,OAAO,UAAU,MAAM,EAAE,CAAC,UAAU,MAAM,CAAC"}
1
+ {"version":3,"file":"react.js","names":["cleanup: undefined | (() => void)"],"sources":["../src/react/index.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport {\n effect,\n type FlatCompute,\n type FlatRoot,\n type FlatSignal,\n scoped,\n} from \"../index.js\";\n\nexport function useFlatReader<T>(\n signal: FlatSignal<T> | FlatCompute<T>,\n isEqual: (a: T, b: T) => boolean = Object.is\n): T {\n const lastValueRef = useRef<T>(signal.peek);\n\n return useSyncExternalStore(\n useCallback(\n (onStoreChange) =>\n scoped(\n () =>\n effect(() => {\n const newValue = signal.val;\n if (!isEqual(lastValueRef.current, newValue)) {\n lastValueRef.current = newValue;\n onStoreChange();\n }\n }),\n signal.root\n ),\n [signal, isEqual]\n ),\n () => signal.val,\n () => signal.peek\n );\n}\n\nexport function useFlatSelector<T, R>(\n signal: FlatSignal<T> | FlatCompute<T>,\n selector: (value: T) => R,\n isEqual: (a: R, b: R) => boolean = Object.is\n): R {\n const lastSelectedRef = useRef<R>(selector(signal.peek));\n\n return useSyncExternalStore(\n useCallback(\n (onStoreChange) =>\n scoped(\n () =>\n effect(() => {\n const newSelected = selector(signal.val);\n if (!isEqual(lastSelectedRef.current, newSelected)) {\n lastSelectedRef.current = newSelected;\n onStoreChange();\n }\n }),\n signal.root\n ),\n [signal, selector, isEqual]\n ),\n () => selector(signal.val),\n () => selector(signal.peek)\n );\n}\n\nexport function useFlatWriter<T>(\n signal: FlatSignal<T>\n): (val: T | ((oldVal: T) => T)) => void {\n return useCallback(\n (val) => {\n if (typeof val === \"function\") {\n signal.val = (val as (oldVal: T) => T)(signal.peek);\n } else {\n signal.val = val;\n }\n },\n [signal]\n );\n}\n\nexport function useFlatSignal<T>(signal: FlatSignal<T>) {\n const reader = useFlatReader(signal);\n const writer = useFlatWriter(signal);\n return [reader, writer] as const;\n}\n\nexport function useFlatEffect(fn: () => undefined | (() => void)): void {\n useEffect(() => {\n let cleanup: undefined | (() => void);\n const stop = effect(() => {\n if (cleanup) cleanup();\n cleanup = fn();\n });\n\n return () => {\n if (cleanup) cleanup();\n stop();\n };\n }, [fn]);\n}\n\nexport function useFlatScope<T>(callback: () => T, scope?: FlatRoot): T {\n return useMemo(() => scoped(callback, scope), [callback, scope]);\n}\n"],"mappings":";;;;AAeA,SAAgB,cACd,QACA,UAAmC,OAAO,IACvC;CACH,MAAM,eAAe,OAAU,OAAO,KAAK;AAE3C,QAAO,qBACL,aACG,kBACC,aAEI,aAAa;EACX,MAAM,WAAW,OAAO;AACxB,MAAI,CAAC,QAAQ,aAAa,SAAS,SAAS,EAAE;AAC5C,gBAAa,UAAU;AACvB,kBAAe;;GAEjB,EACJ,OAAO,KACR,EACH,CAAC,QAAQ,QAAQ,CAClB,QACK,OAAO,WACP,OAAO,KACd;;AAGH,SAAgB,gBACd,QACA,UACA,UAAmC,OAAO,IACvC;CACH,MAAM,kBAAkB,OAAU,SAAS,OAAO,KAAK,CAAC;AAExD,QAAO,qBACL,aACG,kBACC,aAEI,aAAa;EACX,MAAM,cAAc,SAAS,OAAO,IAAI;AACxC,MAAI,CAAC,QAAQ,gBAAgB,SAAS,YAAY,EAAE;AAClD,mBAAgB,UAAU;AAC1B,kBAAe;;GAEjB,EACJ,OAAO,KACR,EACH;EAAC;EAAQ;EAAU;EAAQ,CAC5B,QACK,SAAS,OAAO,IAAI,QACpB,SAAS,OAAO,KAAK,CAC5B;;AAGH,SAAgB,cACd,QACuC;AACvC,QAAO,aACJ,QAAQ;AACP,MAAI,OAAO,QAAQ,WACjB,QAAO,MAAO,IAAyB,OAAO,KAAK;MAEnD,QAAO,MAAM;IAGjB,CAAC,OAAO,CACT;;AAGH,SAAgB,cAAiB,QAAuB;AAGtD,QAAO,CAFQ,cAAc,OAAO,EACrB,cAAc,OAAO,CACb;;AAGzB,SAAgB,cAAc,IAA0C;AACtE,iBAAgB;EACd,IAAIA;EACJ,MAAM,OAAO,aAAa;AACxB,OAAI,QAAS,UAAS;AACtB,aAAU,IAAI;IACd;AAEF,eAAa;AACX,OAAI,QAAS,UAAS;AACtB,SAAM;;IAEP,CAAC,GAAG,CAAC;;AAGV,SAAgB,aAAgB,UAAmB,OAAqB;AACtE,QAAO,cAAc,OAAO,UAAU,MAAM,EAAE,CAAC,UAAU,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "flatsignals",
3
- "version": "0.2.2",
4
- "description": "FlatSignals is an extremely fast reactivity library (~0.7kb)",
3
+ "version": "0.2.3",
4
+ "description": "FlatSignals is an extremely fast reactivity library (~0.5kb)",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",