A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: deep diff signals

+33 -10
+2 -2
deno.jsonc
··· 1 1 { 2 2 "imports": { 3 + "@fry69/deep-diff": "jsr:@fry69/deep-diff@^0.1.10", 3 4 "@mys/m-rpc": "jsr:@mys/m-rpc@^0.12.2", 4 5 "@mys/worker-fn": "jsr:@mys/worker-fn@^3.2.1", 5 6 "@okikio/transferables": "jsr:@okikio/transferables@^1.0.2", 6 7 "@std/fs": "jsr:@std/fs@^1.0.15", 7 - "alien-deepsignals": "npm:alien-deepsignals@^0.2.7", 8 8 "alien-signals": "npm:alien-signals@^3.0.0", 9 9 "lume/": "https://deno.land/x/lume@v3.0.11/", 10 10 "lume/jsx-runtime": "https://deno.land/x/ssx@v0.1.12/jsx-runtime.ts", 11 11 "morphdom": "npm:morphdom@^2.7.7", 12 + "xxh32": "npm:xxh32@^2.0.5", 12 13 13 14 // Source 14 15 "@common/": "./src/common/", 15 16 "@component/": "./src/component/", 16 - "xxh32": "npm:xxh32@^2.0.5", 17 17 }, 18 18 "tasks": { 19 19 "build": "deno task lume",
+5 -8
deno.lock
··· 2 2 "version": "5", 3 3 "specifiers": { 4 4 "jsr:@deno/loader@0.3.6": "0.3.6", 5 + "jsr:@fry69/deep-diff@~0.1.10": "0.1.10", 5 6 "jsr:@mys/m-rpc@~0.12.2": "0.12.2", 6 7 "jsr:@mys/worker-fn@^3.2.1": "3.2.1", 7 8 "jsr:@okikio/transferables@^1.0.2": "1.0.2", ··· 36 37 "jsr:@std/yaml@1.0.9": "1.0.9", 37 38 "jsr:@std/yaml@^1.0.5": "1.0.9", 38 39 "npm:@types/node@*": "24.2.0", 39 - "npm:alien-deepsignals@~0.2.7": "0.2.7_alien-signals@3.0.0", 40 40 "npm:alien-signals@3": "3.0.0", 41 41 "npm:autoprefixer@10.4.21": "10.4.21_postcss@8.5.6", 42 42 "npm:lightningcss-wasm@1.30.1": "1.30.1", ··· 52 52 "jsr": { 53 53 "@deno/loader@0.3.6": { 54 54 "integrity": "98f08d837c18ece5ba15122264fb29580967407c34e6552e152b8f453a60c2be" 55 + }, 56 + "@fry69/deep-diff@0.1.10": { 57 + "integrity": "cdd88fefaef1ac896a038a5f3c0895038d8c725e61bac50489c455156e0275f5" 55 58 }, 56 59 "@mys/m-rpc@0.12.2": { 57 60 "integrity": "36599d3d4708db9f5c0f7da35a17b7e7da1fafddb69de6cfcdc6afe94cd4f084", ··· 258 261 "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", 259 262 "dependencies": [ 260 263 "undici-types" 261 - ] 262 - }, 263 - "alien-deepsignals@0.2.7_alien-signals@3.0.0": { 264 - "integrity": "sha512-fERozTuMRWzO5fv9xBNk1Zm0ZxUllRPiMckoyQcEcCBZ4mpEiZhVnmmSqn26i5KwYnDcZxjS2LAo/o6QjzoEOQ==", 265 - "dependencies": [ 266 - "alien-signals" 267 264 ] 268 265 }, 269 266 "alien-signals@3.0.0": { ··· 777 774 }, 778 775 "workspace": { 779 776 "dependencies": [ 777 + "jsr:@fry69/deep-diff@~0.1.10", 780 778 "jsr:@mys/m-rpc@~0.12.2", 781 779 "jsr:@mys/worker-fn@^3.2.1", 782 780 "jsr:@okikio/transferables@^1.0.2", 783 781 "jsr:@std/fs@^1.0.15", 784 - "npm:alien-deepsignals@~0.2.7", 785 782 "npm:alien-signals@3", 786 783 "npm:morphdom@^2.7.7", 787 784 "npm:xxh32@^2.0.5"
+26
src/common/signal.js
··· 1 + import deepDiff from "@fry69/deep-diff"; 2 + import { signal as alienSignal } from "alien-signals"; 3 + 1 4 export * from "alien-signals"; 5 + 6 + /** 7 + * @import {Signal} from "./signal.d.ts" 8 + */ 9 + 10 + /** 11 + * @template T 12 + * @param {T} initialValue 13 + * @returns {Signal<T>} 14 + */ 15 + export function signal(initialValue) { 16 + const s = alienSignal(initialValue); 17 + const isPrimitive = Object(initialValue) !== initialValue; 18 + if (isPrimitive) return s; 19 + 20 + return /** @type {Signal<T>} */ ((b) => { 21 + const a = s(); 22 + if (b === undefined) return a; 23 + 24 + const diff = deepDiff(a, b); 25 + if (diff) s(b); 26 + }); 27 + }