tuplerone 4.0.0-next.1 → 4.0.0-next.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/Node.d.ts +1 -0
- package/dist/Tuple.d.ts +0 -9
- package/dist/graph.cjs +83 -0
- package/dist/graph.cjs.map +7 -0
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +62 -0
- package/dist/graph.js.map +7 -0
- package/dist/shallow.d.ts +11 -0
- package/dist/{tuplerone.mjs → tuplerone.cjs} +52 -32
- package/dist/tuplerone.cjs.map +7 -0
- package/dist/tuplerone.d.ts +4 -3
- package/dist/tuplerone.js +29 -51
- package/dist/tuplerone.js.map +4 -4
- package/package.json +24 -16
- package/dist/tuplerone.mjs.map +0 -7
package/dist/Node.d.ts
CHANGED
package/dist/Tuple.d.ts
CHANGED
package/dist/graph.cjs
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/graph.ts
|
|
22
|
+
var graph_exports = {};
|
|
23
|
+
__export(graph_exports, {
|
|
24
|
+
clear: () => clear,
|
|
25
|
+
getNode: () => getNode,
|
|
26
|
+
getSymbol: () => getSymbol,
|
|
27
|
+
prune: () => prune,
|
|
28
|
+
registry: () => registry
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(graph_exports);
|
|
31
|
+
|
|
32
|
+
// src/Node.ts
|
|
33
|
+
var Node = class extends Map {
|
|
34
|
+
tuple;
|
|
35
|
+
symbol;
|
|
36
|
+
object;
|
|
37
|
+
get(edge) {
|
|
38
|
+
if (!this.has(edge)) {
|
|
39
|
+
const value = new Node();
|
|
40
|
+
this.set(edge, value);
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return super.get(edge);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
__name(Node, "Node");
|
|
47
|
+
|
|
48
|
+
// src/graph.ts
|
|
49
|
+
var root = new Node();
|
|
50
|
+
var registry = new FinalizationRegistry((path) => void prune(path));
|
|
51
|
+
var getNode = /* @__PURE__ */ __name((path) => path.reduce((node, edge) => node.get(edge), root), "getNode");
|
|
52
|
+
var getSymbol = /* @__PURE__ */ __name((path) => {
|
|
53
|
+
const node = getNode(path);
|
|
54
|
+
const symbol = node.symbol?.deref();
|
|
55
|
+
if (!symbol) {
|
|
56
|
+
const symbol2 = Symbol();
|
|
57
|
+
node.symbol = new WeakRef(symbol2);
|
|
58
|
+
registry.register(symbol2, path);
|
|
59
|
+
return symbol2;
|
|
60
|
+
}
|
|
61
|
+
return symbol;
|
|
62
|
+
}, "getSymbol");
|
|
63
|
+
var prune = /* @__PURE__ */ __name((path) => {
|
|
64
|
+
let last = [root, null];
|
|
65
|
+
const nodes = [last];
|
|
66
|
+
for (const edge of path) {
|
|
67
|
+
last = [last[0].get(edge), edge];
|
|
68
|
+
nodes.push(last);
|
|
69
|
+
}
|
|
70
|
+
for (let i = nodes.length - 1; i > 0; i--) {
|
|
71
|
+
const [node, edge] = nodes[i];
|
|
72
|
+
const [parent] = nodes[i - 1];
|
|
73
|
+
if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
parent.delete(edge);
|
|
77
|
+
}
|
|
78
|
+
}, "prune");
|
|
79
|
+
var clear = /* @__PURE__ */ __name(() => {
|
|
80
|
+
root.clear();
|
|
81
|
+
}, "clear");
|
|
82
|
+
/*! For license information please see graph.cjs.LEGAL.txt */
|
|
83
|
+
//# sourceMappingURL=graph.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/graph.ts", "../src/Node.ts"],
|
|
4
|
+
"sourcesContent": ["import { Node } from './Node.ts';\n\nconst root = new Node();\n\n/* istanbul ignore next */\nexport const registry = new FinalizationRegistry((path: unknown[]) => void prune(path));\n\nexport const getNode = (path: unknown[]): Node =>\n path.reduce((node: Node, edge) => node.get(edge), root);\n\nexport const getSymbol = (path: unknown[]): symbol => {\n const node = getNode(path);\n const symbol = node.symbol?.deref();\n\n if (!symbol) {\n const symbol = Symbol();\n node.symbol = new WeakRef(symbol);\n registry.register(symbol, path);\n\n return symbol;\n }\n return symbol;\n};\n\nexport const prune = (path: unknown[]): void => {\n let last: [Node, unknown] = [root, null];\n const nodes = [last];\n for (const edge of path) {\n last = [last[0].get(edge), edge];\n nodes.push(last);\n }\n for (let i = nodes.length - 1; i > 0; i--) {\n const [node, edge] = nodes[i];\n const [parent] = nodes[i - 1];\n if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {\n break;\n }\n parent.delete(edge);\n }\n};\n\nexport const clear = () => {\n root.clear();\n};\n", "export class Node extends Map<unknown, Node> {\n tuple?: WeakRef<readonly unknown[]>;\n symbol?: WeakRef<symbol>;\n object?: WeakRef<Readonly<object>>;\n\n get(edge: unknown): Node {\n if (!this.has(edge)) {\n const value = new Node();\n this.set(edge, value);\n return value;\n }\n return super.get(edge) as Node;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,OAAN,cAAmB,IAAmB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,MAAqB;AACvB,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,YAAM,QAAQ,IAAI,KAAK;AACvB,WAAK,IAAI,MAAM,KAAK;AACpB,aAAO;AAAA,IACT;AACA,WAAO,MAAM,IAAI,IAAI;AAAA,EACvB;AACF;AAba;;;ADEb,IAAM,OAAO,IAAI,KAAK;AAGf,IAAM,WAAW,IAAI,qBAAqB,CAAC,SAAoB,KAAK,MAAM,IAAI,CAAC;AAE/E,IAAM,UAAU,wBAAC,SACtB,KAAK,OAAO,CAAC,MAAY,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,GADjC;AAGhB,IAAM,YAAY,wBAAC,SAA4B;AACpD,QAAM,OAAO,QAAQ,IAAI;AACzB,QAAM,SAAS,KAAK,QAAQ,MAAM;AAElC,MAAI,CAAC,QAAQ;AACX,UAAMA,UAAS,OAAO;AACtB,SAAK,SAAS,IAAI,QAAQA,OAAM;AAChC,aAAS,SAASA,SAAQ,IAAI;AAE9B,WAAOA;AAAA,EACT;AACA,SAAO;AACT,GAZyB;AAclB,IAAM,QAAQ,wBAAC,SAA0B;AAC9C,MAAI,OAAwB,CAAC,MAAM,IAAI;AACvC,QAAM,QAAQ,CAAC,IAAI;AACnB,aAAW,QAAQ,MAAM;AACvB,WAAO,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI;AAC/B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,UAAM,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC;AAC5B,UAAM,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC;AAC5B,QAAI,KAAK,QAAQ,KAAK,OAAO,MAAM,KAAK,KAAK,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,GAAG;AACpF;AAAA,IACF;AACA,WAAO,OAAO,IAAI;AAAA,EACpB;AACF,GAfqB;AAiBd,IAAM,QAAQ,6BAAM;AACzB,OAAK,MAAM;AACb,GAFqB;",
|
|
6
|
+
"names": ["symbol"]
|
|
7
|
+
}
|
package/dist/graph.d.ts
CHANGED
package/dist/graph.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/Node.ts
|
|
5
|
+
var Node = class extends Map {
|
|
6
|
+
tuple;
|
|
7
|
+
symbol;
|
|
8
|
+
object;
|
|
9
|
+
get(edge) {
|
|
10
|
+
if (!this.has(edge)) {
|
|
11
|
+
const value = new Node();
|
|
12
|
+
this.set(edge, value);
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
return super.get(edge);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
__name(Node, "Node");
|
|
19
|
+
|
|
20
|
+
// src/graph.ts
|
|
21
|
+
var root = new Node();
|
|
22
|
+
var registry = new FinalizationRegistry((path) => void prune(path));
|
|
23
|
+
var getNode = /* @__PURE__ */ __name((path) => path.reduce((node, edge) => node.get(edge), root), "getNode");
|
|
24
|
+
var getSymbol = /* @__PURE__ */ __name((path) => {
|
|
25
|
+
const node = getNode(path);
|
|
26
|
+
const symbol = node.symbol?.deref();
|
|
27
|
+
if (!symbol) {
|
|
28
|
+
const symbol2 = Symbol();
|
|
29
|
+
node.symbol = new WeakRef(symbol2);
|
|
30
|
+
registry.register(symbol2, path);
|
|
31
|
+
return symbol2;
|
|
32
|
+
}
|
|
33
|
+
return symbol;
|
|
34
|
+
}, "getSymbol");
|
|
35
|
+
var prune = /* @__PURE__ */ __name((path) => {
|
|
36
|
+
let last = [root, null];
|
|
37
|
+
const nodes = [last];
|
|
38
|
+
for (const edge of path) {
|
|
39
|
+
last = [last[0].get(edge), edge];
|
|
40
|
+
nodes.push(last);
|
|
41
|
+
}
|
|
42
|
+
for (let i = nodes.length - 1; i > 0; i--) {
|
|
43
|
+
const [node, edge] = nodes[i];
|
|
44
|
+
const [parent] = nodes[i - 1];
|
|
45
|
+
if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
parent.delete(edge);
|
|
49
|
+
}
|
|
50
|
+
}, "prune");
|
|
51
|
+
var clear = /* @__PURE__ */ __name(() => {
|
|
52
|
+
root.clear();
|
|
53
|
+
}, "clear");
|
|
54
|
+
export {
|
|
55
|
+
clear,
|
|
56
|
+
getNode,
|
|
57
|
+
getSymbol,
|
|
58
|
+
prune,
|
|
59
|
+
registry
|
|
60
|
+
};
|
|
61
|
+
/*! For license information please see graph.js.LEGAL.txt */
|
|
62
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Node.ts", "../src/graph.ts"],
|
|
4
|
+
"sourcesContent": ["export class Node extends Map<unknown, Node> {\n tuple?: WeakRef<readonly unknown[]>;\n symbol?: WeakRef<symbol>;\n object?: WeakRef<Readonly<object>>;\n\n get(edge: unknown): Node {\n if (!this.has(edge)) {\n const value = new Node();\n this.set(edge, value);\n return value;\n }\n return super.get(edge) as Node;\n }\n}\n", "import { Node } from './Node.ts';\n\nconst root = new Node();\n\n/* istanbul ignore next */\nexport const registry = new FinalizationRegistry((path: unknown[]) => void prune(path));\n\nexport const getNode = (path: unknown[]): Node =>\n path.reduce((node: Node, edge) => node.get(edge), root);\n\nexport const getSymbol = (path: unknown[]): symbol => {\n const node = getNode(path);\n const symbol = node.symbol?.deref();\n\n if (!symbol) {\n const symbol = Symbol();\n node.symbol = new WeakRef(symbol);\n registry.register(symbol, path);\n\n return symbol;\n }\n return symbol;\n};\n\nexport const prune = (path: unknown[]): void => {\n let last: [Node, unknown] = [root, null];\n const nodes = [last];\n for (const edge of path) {\n last = [last[0].get(edge), edge];\n nodes.push(last);\n }\n for (let i = nodes.length - 1; i > 0; i--) {\n const [node, edge] = nodes[i];\n const [parent] = nodes[i - 1];\n if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {\n break;\n }\n parent.delete(edge);\n }\n};\n\nexport const clear = () => {\n root.clear();\n};\n"],
|
|
5
|
+
"mappings": ";;;;AAAO,IAAM,OAAN,cAAmB,IAAmB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,MAAqB;AACvB,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,YAAM,QAAQ,IAAI,KAAK;AACvB,WAAK,IAAI,MAAM,KAAK;AACpB,aAAO;AAAA,IACT;AACA,WAAO,MAAM,IAAI,IAAI;AAAA,EACvB;AACF;AAba;;;ACEb,IAAM,OAAO,IAAI,KAAK;AAGf,IAAM,WAAW,IAAI,qBAAqB,CAAC,SAAoB,KAAK,MAAM,IAAI,CAAC;AAE/E,IAAM,UAAU,wBAAC,SACtB,KAAK,OAAO,CAAC,MAAY,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,GADjC;AAGhB,IAAM,YAAY,wBAAC,SAA4B;AACpD,QAAM,OAAO,QAAQ,IAAI;AACzB,QAAM,SAAS,KAAK,QAAQ,MAAM;AAElC,MAAI,CAAC,QAAQ;AACX,UAAMA,UAAS,OAAO;AACtB,SAAK,SAAS,IAAI,QAAQA,OAAM;AAChC,aAAS,SAASA,SAAQ,IAAI;AAE9B,WAAOA;AAAA,EACT;AACA,SAAO;AACT,GAZyB;AAclB,IAAM,QAAQ,wBAAC,SAA0B;AAC9C,MAAI,OAAwB,CAAC,MAAM,IAAI;AACvC,QAAM,QAAQ,CAAC,IAAI;AACnB,aAAW,QAAQ,MAAM;AACvB,WAAO,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI;AAC/B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,UAAM,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC;AAC5B,UAAM,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC;AAC5B,QAAI,KAAK,QAAQ,KAAK,OAAO,MAAM,KAAK,KAAK,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,GAAG;AACpF;AAAA,IACF;AACA,WAAO,OAAO,IAAI;AAAA,EACpB;AACF,GAfqB;AAiBd,IAAM,QAAQ,6BAAM;AACzB,OAAK,MAAM;AACb,GAFqB;",
|
|
6
|
+
"names": ["symbol"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const isRef: unique symbol;
|
|
2
|
+
interface Referable {
|
|
3
|
+
[isRef]?: boolean;
|
|
4
|
+
}
|
|
5
|
+
declare global {
|
|
6
|
+
interface Object extends Referable {
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare const shallow: <A extends object>(target: A) => A;
|
|
10
|
+
export declare const cache: WeakSet<object>;
|
|
11
|
+
export {};
|
|
@@ -1,10 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
2
6
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/tuplerone.ts
|
|
22
|
+
var tuplerone_exports = {};
|
|
23
|
+
__export(tuplerone_exports, {
|
|
24
|
+
Tuple: () => Tuple2,
|
|
25
|
+
getDeepSymbol: () => getDeepSymbol,
|
|
26
|
+
isRef: () => isRef,
|
|
27
|
+
memoize: () => memoize,
|
|
28
|
+
shallow: () => shallow
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(tuplerone_exports);
|
|
3
31
|
|
|
4
32
|
// src/Node.ts
|
|
5
33
|
var Node = class extends Map {
|
|
6
34
|
tuple;
|
|
7
35
|
symbol;
|
|
36
|
+
object;
|
|
8
37
|
get(edge) {
|
|
9
38
|
if (!this.has(edge)) {
|
|
10
39
|
const value = new Node();
|
|
@@ -41,7 +70,7 @@ var prune = /* @__PURE__ */ __name((path) => {
|
|
|
41
70
|
for (let i = nodes.length - 1; i > 0; i--) {
|
|
42
71
|
const [node, edge] = nodes[i];
|
|
43
72
|
const [parent] = nodes[i - 1];
|
|
44
|
-
if (node.size || node.tuple?.deref() || node.symbol?.deref()) {
|
|
73
|
+
if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {
|
|
45
74
|
break;
|
|
46
75
|
}
|
|
47
76
|
parent.delete(edge);
|
|
@@ -56,7 +85,6 @@ var TupleConstructor = /* @__PURE__ */ __name(class Tuple extends Array {
|
|
|
56
85
|
Object.freeze(this);
|
|
57
86
|
}
|
|
58
87
|
}, "Tuple");
|
|
59
|
-
var isRef = Symbol("isRef");
|
|
60
88
|
function Tuple2(...path) {
|
|
61
89
|
if (new.target) {
|
|
62
90
|
throw new TypeError("Tuple is not a constructor");
|
|
@@ -75,12 +103,10 @@ function Tuple2(...path) {
|
|
|
75
103
|
return tuple;
|
|
76
104
|
}
|
|
77
105
|
__name(Tuple2, "Tuple");
|
|
78
|
-
Object.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
configurable: false
|
|
83
|
-
}
|
|
106
|
+
Object.defineProperty(Tuple2, Symbol.hasInstance, {
|
|
107
|
+
value: (instance) => instance instanceof TupleConstructor,
|
|
108
|
+
writable: false,
|
|
109
|
+
configurable: false
|
|
84
110
|
});
|
|
85
111
|
var tuple0 = new TupleConstructor([]);
|
|
86
112
|
|
|
@@ -93,23 +119,15 @@ var getDeepSymbol = /* @__PURE__ */ __name((target) => {
|
|
|
93
119
|
return result;
|
|
94
120
|
}, "getDeepSymbol");
|
|
95
121
|
var _get = /* @__PURE__ */ __name((edge) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
case "function":
|
|
104
|
-
return edge;
|
|
105
|
-
default:
|
|
106
|
-
if (Array.isArray(edge)) {
|
|
107
|
-
return getSymbol(edge.map(_get));
|
|
108
|
-
}
|
|
109
|
-
return getSymbol(
|
|
110
|
-
Object.entries(edge).flat().map((value, i) => i % 2 ? _get(value) : value)
|
|
111
|
-
);
|
|
122
|
+
if (typeof edge === "object") {
|
|
123
|
+
if (Array.isArray(edge)) {
|
|
124
|
+
return getSymbol(edge.map(_get));
|
|
125
|
+
}
|
|
126
|
+
return getSymbol(
|
|
127
|
+
Object.entries(edge).flat().map((value, i) => i % 2 ? _get(value) : value)
|
|
128
|
+
);
|
|
112
129
|
}
|
|
130
|
+
return edge;
|
|
113
131
|
}, "_get");
|
|
114
132
|
|
|
115
133
|
// src/memoize.ts
|
|
@@ -127,11 +145,13 @@ var memoize = /* @__PURE__ */ __name((fn) => {
|
|
|
127
145
|
}
|
|
128
146
|
return memoized;
|
|
129
147
|
}, "memoize");
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
148
|
+
|
|
149
|
+
// src/shallow.ts
|
|
150
|
+
var isRef = Symbol("isRef");
|
|
151
|
+
var shallow = /* @__PURE__ */ __name((target) => {
|
|
152
|
+
cache2.add(target);
|
|
153
|
+
return target;
|
|
154
|
+
}, "shallow");
|
|
155
|
+
var cache2 = /* @__PURE__ */ new WeakSet();
|
|
156
|
+
/*! For license information please see tuplerone.cjs.LEGAL.txt */
|
|
157
|
+
//# sourceMappingURL=tuplerone.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tuplerone.ts", "../src/Node.ts", "../src/graph.ts", "../src/Tuple.ts", "../src/deep.ts", "../src/memoize.ts", "../src/shallow.ts"],
|
|
4
|
+
"sourcesContent": ["export { Tuple } from './Tuple.ts';\nexport { getDeepSymbol } from './deep.ts';\nexport { memoize } from './memoize.ts';\nexport { isRef, shallow } from './shallow.ts';\n", "export class Node extends Map<unknown, Node> {\n tuple?: WeakRef<readonly unknown[]>;\n symbol?: WeakRef<symbol>;\n object?: WeakRef<Readonly<object>>;\n\n get(edge: unknown): Node {\n if (!this.has(edge)) {\n const value = new Node();\n this.set(edge, value);\n return value;\n }\n return super.get(edge) as Node;\n }\n}\n", "import { Node } from './Node.ts';\n\nconst root = new Node();\n\n/* istanbul ignore next */\nexport const registry = new FinalizationRegistry((path: unknown[]) => void prune(path));\n\nexport const getNode = (path: unknown[]): Node =>\n path.reduce((node: Node, edge) => node.get(edge), root);\n\nexport const getSymbol = (path: unknown[]): symbol => {\n const node = getNode(path);\n const symbol = node.symbol?.deref();\n\n if (!symbol) {\n const symbol = Symbol();\n node.symbol = new WeakRef(symbol);\n registry.register(symbol, path);\n\n return symbol;\n }\n return symbol;\n};\n\nexport const prune = (path: unknown[]): void => {\n let last: [Node, unknown] = [root, null];\n const nodes = [last];\n for (const edge of path) {\n last = [last[0].get(edge), edge];\n nodes.push(last);\n }\n for (let i = nodes.length - 1; i > 0; i--) {\n const [node, edge] = nodes[i];\n const [parent] = nodes[i - 1];\n if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {\n break;\n }\n parent.delete(edge);\n }\n};\n\nexport const clear = () => {\n root.clear();\n};\n", "import { getNode, registry } from './graph.ts';\n\nconst TupleConstructor = class Tuple<A extends readonly unknown[]> extends Array {\n constructor(values: A) {\n super();\n this.push(...values);\n Object.freeze(this);\n }\n};\n\nexport function Tuple<A extends unknown[]>(...path: A): Readonly<A> {\n if (new.target) {\n throw new TypeError('Tuple is not a constructor');\n }\n\n if (path.length === 0) {\n // Shortcut for 0-tuples\n return tuple0 as any;\n }\n\n const node = getNode(path);\n const derefed = node.tuple?.deref();\n if (derefed) {\n return derefed as A;\n }\n const tuple = new TupleConstructor<A>(path);\n node.tuple = new WeakRef(tuple);\n registry.register(tuple, path);\n\n return tuple as A;\n}\n\n// Allow `instanceof` checks with the helper function as if it were a constructor\nObject.defineProperty(Tuple, Symbol.hasInstance, {\n value: (instance: unknown) => instance instanceof TupleConstructor,\n writable: false,\n configurable: false,\n});\n\n// 0-tuple singleton\nconst tuple0 = new TupleConstructor([]);\n", "import { getSymbol } from './graph.ts';\n\nexport const getDeepSymbol = (target: unknown): symbol => {\n const result = _get(target);\n if (typeof result !== 'symbol') {\n throw TypeError('Primitive values are not valid targets');\n }\n return result;\n};\n\nconst _get = <A>(edge: A): A | symbol => {\n if (typeof edge === 'object') {\n if (Array.isArray(edge)) {\n return getSymbol(edge.map(_get));\n }\n return getSymbol(\n Object.entries(edge as object)\n .flat()\n .map((value, i) => (i % 2 ? _get(value) : value)),\n );\n }\n return edge;\n};\n", "import { getNode } from './graph.ts';\n\nconst cache = new WeakMap();\n\nexport const memoize = <A extends (...args: unknown[]) => unknown>(fn: A): A => {\n const memoized = function (this: unknown, ...args: unknown[]) {\n const node = getNode([memoized, this, ...args]);\n if (!cache.has(node)) {\n cache.set(node, fn.apply(this, args));\n }\n return cache.get(node);\n };\n\n if (fn.name) {\n Object.defineProperty(memoized, 'name', { value: fn.name, writable: false });\n }\n return memoized as A;\n};\n", "export const isRef = Symbol('isRef');\n\ninterface Referable {\n [isRef]?: boolean;\n}\n\ndeclare global {\n interface Object extends Referable {}\n}\n\nexport const shallow = <A extends object>(target: A): A => {\n cache.add(target);\n return target;\n};\n\nexport const cache = new WeakSet<object>();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Tuple", "symbol", "Tuple", "cache"]
|
|
7
|
+
}
|
package/dist/tuplerone.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { Tuple
|
|
2
|
-
export { getDeepSymbol } from './deep';
|
|
3
|
-
export { memoize } from './memoize';
|
|
1
|
+
export { Tuple } from './Tuple.ts';
|
|
2
|
+
export { getDeepSymbol } from './deep.ts';
|
|
3
|
+
export { memoize } from './memoize.ts';
|
|
4
|
+
export { isRef, shallow } from './shallow.ts';
|
package/dist/tuplerone.js
CHANGED
|
@@ -1,37 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
|
|
21
|
-
// src/tuplerone.ts
|
|
22
|
-
var tuplerone_exports = {};
|
|
23
|
-
__export(tuplerone_exports, {
|
|
24
|
-
Tuple: () => Tuple2,
|
|
25
|
-
getDeepSymbol: () => getDeepSymbol,
|
|
26
|
-
isRef: () => isRef,
|
|
27
|
-
memoize: () => memoize
|
|
28
|
-
});
|
|
29
|
-
module.exports = __toCommonJS(tuplerone_exports);
|
|
30
3
|
|
|
31
4
|
// src/Node.ts
|
|
32
5
|
var Node = class extends Map {
|
|
33
6
|
tuple;
|
|
34
7
|
symbol;
|
|
8
|
+
object;
|
|
35
9
|
get(edge) {
|
|
36
10
|
if (!this.has(edge)) {
|
|
37
11
|
const value = new Node();
|
|
@@ -68,7 +42,7 @@ var prune = /* @__PURE__ */ __name((path) => {
|
|
|
68
42
|
for (let i = nodes.length - 1; i > 0; i--) {
|
|
69
43
|
const [node, edge] = nodes[i];
|
|
70
44
|
const [parent] = nodes[i - 1];
|
|
71
|
-
if (node.size || node.tuple?.deref() || node.symbol?.deref()) {
|
|
45
|
+
if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {
|
|
72
46
|
break;
|
|
73
47
|
}
|
|
74
48
|
parent.delete(edge);
|
|
@@ -83,7 +57,6 @@ var TupleConstructor = /* @__PURE__ */ __name(class Tuple extends Array {
|
|
|
83
57
|
Object.freeze(this);
|
|
84
58
|
}
|
|
85
59
|
}, "Tuple");
|
|
86
|
-
var isRef = Symbol("isRef");
|
|
87
60
|
function Tuple2(...path) {
|
|
88
61
|
if (new.target) {
|
|
89
62
|
throw new TypeError("Tuple is not a constructor");
|
|
@@ -102,12 +75,10 @@ function Tuple2(...path) {
|
|
|
102
75
|
return tuple;
|
|
103
76
|
}
|
|
104
77
|
__name(Tuple2, "Tuple");
|
|
105
|
-
Object.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
configurable: false
|
|
110
|
-
}
|
|
78
|
+
Object.defineProperty(Tuple2, Symbol.hasInstance, {
|
|
79
|
+
value: (instance) => instance instanceof TupleConstructor,
|
|
80
|
+
writable: false,
|
|
81
|
+
configurable: false
|
|
111
82
|
});
|
|
112
83
|
var tuple0 = new TupleConstructor([]);
|
|
113
84
|
|
|
@@ -120,23 +91,15 @@ var getDeepSymbol = /* @__PURE__ */ __name((target) => {
|
|
|
120
91
|
return result;
|
|
121
92
|
}, "getDeepSymbol");
|
|
122
93
|
var _get = /* @__PURE__ */ __name((edge) => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
case "function":
|
|
131
|
-
return edge;
|
|
132
|
-
default:
|
|
133
|
-
if (Array.isArray(edge)) {
|
|
134
|
-
return getSymbol(edge.map(_get));
|
|
135
|
-
}
|
|
136
|
-
return getSymbol(
|
|
137
|
-
Object.entries(edge).flat().map((value, i) => i % 2 ? _get(value) : value)
|
|
138
|
-
);
|
|
94
|
+
if (typeof edge === "object") {
|
|
95
|
+
if (Array.isArray(edge)) {
|
|
96
|
+
return getSymbol(edge.map(_get));
|
|
97
|
+
}
|
|
98
|
+
return getSymbol(
|
|
99
|
+
Object.entries(edge).flat().map((value, i) => i % 2 ? _get(value) : value)
|
|
100
|
+
);
|
|
139
101
|
}
|
|
102
|
+
return edge;
|
|
140
103
|
}, "_get");
|
|
141
104
|
|
|
142
105
|
// src/memoize.ts
|
|
@@ -154,5 +117,20 @@ var memoize = /* @__PURE__ */ __name((fn) => {
|
|
|
154
117
|
}
|
|
155
118
|
return memoized;
|
|
156
119
|
}, "memoize");
|
|
120
|
+
|
|
121
|
+
// src/shallow.ts
|
|
122
|
+
var isRef = Symbol("isRef");
|
|
123
|
+
var shallow = /* @__PURE__ */ __name((target) => {
|
|
124
|
+
cache2.add(target);
|
|
125
|
+
return target;
|
|
126
|
+
}, "shallow");
|
|
127
|
+
var cache2 = /* @__PURE__ */ new WeakSet();
|
|
128
|
+
export {
|
|
129
|
+
Tuple2 as Tuple,
|
|
130
|
+
getDeepSymbol,
|
|
131
|
+
isRef,
|
|
132
|
+
memoize,
|
|
133
|
+
shallow
|
|
134
|
+
};
|
|
157
135
|
/*! For license information please see tuplerone.js.LEGAL.txt */
|
|
158
136
|
//# sourceMappingURL=tuplerone.js.map
|
package/dist/tuplerone.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/
|
|
4
|
-
"sourcesContent": ["export
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../src/Node.ts", "../src/graph.ts", "../src/Tuple.ts", "../src/deep.ts", "../src/memoize.ts", "../src/shallow.ts"],
|
|
4
|
+
"sourcesContent": ["export class Node extends Map<unknown, Node> {\n tuple?: WeakRef<readonly unknown[]>;\n symbol?: WeakRef<symbol>;\n object?: WeakRef<Readonly<object>>;\n\n get(edge: unknown): Node {\n if (!this.has(edge)) {\n const value = new Node();\n this.set(edge, value);\n return value;\n }\n return super.get(edge) as Node;\n }\n}\n", "import { Node } from './Node.ts';\n\nconst root = new Node();\n\n/* istanbul ignore next */\nexport const registry = new FinalizationRegistry((path: unknown[]) => void prune(path));\n\nexport const getNode = (path: unknown[]): Node =>\n path.reduce((node: Node, edge) => node.get(edge), root);\n\nexport const getSymbol = (path: unknown[]): symbol => {\n const node = getNode(path);\n const symbol = node.symbol?.deref();\n\n if (!symbol) {\n const symbol = Symbol();\n node.symbol = new WeakRef(symbol);\n registry.register(symbol, path);\n\n return symbol;\n }\n return symbol;\n};\n\nexport const prune = (path: unknown[]): void => {\n let last: [Node, unknown] = [root, null];\n const nodes = [last];\n for (const edge of path) {\n last = [last[0].get(edge), edge];\n nodes.push(last);\n }\n for (let i = nodes.length - 1; i > 0; i--) {\n const [node, edge] = nodes[i];\n const [parent] = nodes[i - 1];\n if (node.size || node.tuple?.deref() || node.symbol?.deref() || node.object?.deref()) {\n break;\n }\n parent.delete(edge);\n }\n};\n\nexport const clear = () => {\n root.clear();\n};\n", "import { getNode, registry } from './graph.ts';\n\nconst TupleConstructor = class Tuple<A extends readonly unknown[]> extends Array {\n constructor(values: A) {\n super();\n this.push(...values);\n Object.freeze(this);\n }\n};\n\nexport function Tuple<A extends unknown[]>(...path: A): Readonly<A> {\n if (new.target) {\n throw new TypeError('Tuple is not a constructor');\n }\n\n if (path.length === 0) {\n // Shortcut for 0-tuples\n return tuple0 as any;\n }\n\n const node = getNode(path);\n const derefed = node.tuple?.deref();\n if (derefed) {\n return derefed as A;\n }\n const tuple = new TupleConstructor<A>(path);\n node.tuple = new WeakRef(tuple);\n registry.register(tuple, path);\n\n return tuple as A;\n}\n\n// Allow `instanceof` checks with the helper function as if it were a constructor\nObject.defineProperty(Tuple, Symbol.hasInstance, {\n value: (instance: unknown) => instance instanceof TupleConstructor,\n writable: false,\n configurable: false,\n});\n\n// 0-tuple singleton\nconst tuple0 = new TupleConstructor([]);\n", "import { getSymbol } from './graph.ts';\n\nexport const getDeepSymbol = (target: unknown): symbol => {\n const result = _get(target);\n if (typeof result !== 'symbol') {\n throw TypeError('Primitive values are not valid targets');\n }\n return result;\n};\n\nconst _get = <A>(edge: A): A | symbol => {\n if (typeof edge === 'object') {\n if (Array.isArray(edge)) {\n return getSymbol(edge.map(_get));\n }\n return getSymbol(\n Object.entries(edge as object)\n .flat()\n .map((value, i) => (i % 2 ? _get(value) : value)),\n );\n }\n return edge;\n};\n", "import { getNode } from './graph.ts';\n\nconst cache = new WeakMap();\n\nexport const memoize = <A extends (...args: unknown[]) => unknown>(fn: A): A => {\n const memoized = function (this: unknown, ...args: unknown[]) {\n const node = getNode([memoized, this, ...args]);\n if (!cache.has(node)) {\n cache.set(node, fn.apply(this, args));\n }\n return cache.get(node);\n };\n\n if (fn.name) {\n Object.defineProperty(memoized, 'name', { value: fn.name, writable: false });\n }\n return memoized as A;\n};\n", "export const isRef = Symbol('isRef');\n\ninterface Referable {\n [isRef]?: boolean;\n}\n\ndeclare global {\n interface Object extends Referable {}\n}\n\nexport const shallow = <A extends object>(target: A): A => {\n cache.add(target);\n return target;\n};\n\nexport const cache = new WeakSet<object>();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["symbol", "Tuple", "cache"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -13,14 +13,21 @@
|
|
|
13
13
|
"hashing",
|
|
14
14
|
"value objects"
|
|
15
15
|
],
|
|
16
|
+
"type": "module",
|
|
16
17
|
"exports": {
|
|
17
18
|
".": {
|
|
18
19
|
"types": "./dist/tuplerone.d.ts",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
20
|
+
"import": "./dist/tuplerone.js",
|
|
21
|
+
"require": "./dist/tuplerone.cjs"
|
|
21
22
|
},
|
|
22
|
-
"./
|
|
23
|
+
"./graph": {
|
|
24
|
+
"types": "./dist/graph.d.ts",
|
|
25
|
+
"import": "./dist/graph.js",
|
|
26
|
+
"require": "./dist/graph.cjs"
|
|
27
|
+
}
|
|
23
28
|
},
|
|
29
|
+
"types": "./dist/tuplerone.d.ts",
|
|
30
|
+
"main": "./dist/tuplerone.cjs",
|
|
24
31
|
"files": [
|
|
25
32
|
"dist"
|
|
26
33
|
],
|
|
@@ -34,15 +41,18 @@
|
|
|
34
41
|
"lint:eslint": "eslint .",
|
|
35
42
|
"lint:prettier": "prettier --check .",
|
|
36
43
|
"test": "jest",
|
|
37
|
-
"_postinstall": "husky install",
|
|
44
|
+
"_postinstall": "is-ci || husky install",
|
|
38
45
|
"prepack": "pinst --disable",
|
|
39
46
|
"postpack": "pinst --enable",
|
|
40
|
-
"build": "nanobundle build"
|
|
47
|
+
"build": "nanobundle build",
|
|
48
|
+
"demo": "yarn workspace demo",
|
|
49
|
+
"docs": "typedoc"
|
|
41
50
|
},
|
|
42
51
|
"lint-staged": {
|
|
52
|
+
"*": "prettier --ignore-unknown --write",
|
|
43
53
|
"src/**/*.ts": [
|
|
44
|
-
"
|
|
45
|
-
"
|
|
54
|
+
"eslint --fix",
|
|
55
|
+
"tsc-files"
|
|
46
56
|
]
|
|
47
57
|
},
|
|
48
58
|
"jest": {
|
|
@@ -71,9 +81,12 @@
|
|
|
71
81
|
"@babel/core": "^7.22.9",
|
|
72
82
|
"@babel/preset-env": "^7.22.9",
|
|
73
83
|
"@babel/preset-typescript": "^7.22.5",
|
|
84
|
+
"@commitlint/cli": "^17.6.7",
|
|
85
|
+
"@commitlint/config-conventional": "^17.6.7",
|
|
74
86
|
"@types/babel__core": "^7.20.1",
|
|
75
87
|
"@types/babel__preset-env": "^7.9.2",
|
|
76
88
|
"@types/eslint": "^8.44.1",
|
|
89
|
+
"@types/is-ci": "^3",
|
|
77
90
|
"@types/jest": "^29.5.3",
|
|
78
91
|
"@types/node": "^20.4.5",
|
|
79
92
|
"@typescript-eslint/eslint-plugin": "^6.2.0",
|
|
@@ -86,25 +99,20 @@
|
|
|
86
99
|
"eslint-plugin-jest": "^27.2.3",
|
|
87
100
|
"eslint-plugin-tsdoc": "^0.2.17",
|
|
88
101
|
"husky": "^8.0.3",
|
|
102
|
+
"is-ci": "^3.0.1",
|
|
89
103
|
"jest": "^29.6.2",
|
|
90
104
|
"lint-staged": "^13.2.3",
|
|
91
105
|
"lodash.camelcase": "^4.3.0",
|
|
92
106
|
"microbundle": "^0.15.1",
|
|
93
107
|
"nanobundle": "^1.6.0",
|
|
94
108
|
"pinst": "^3.0.0",
|
|
95
|
-
"prettier": "
|
|
109
|
+
"prettier": "2.8.8",
|
|
96
110
|
"semantic-release": "^21.0.7",
|
|
111
|
+
"tsc-files": "^1.1.4",
|
|
97
112
|
"typedoc": "^0.24.8",
|
|
98
113
|
"typescript": "5.2.0-beta"
|
|
99
114
|
},
|
|
100
115
|
"bugs": "https://github.com/slikts/tuplerone/issues",
|
|
101
|
-
"husky": {
|
|
102
|
-
"husky": {
|
|
103
|
-
"hooks": {
|
|
104
|
-
"pre-commit": "lint-staged"
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
116
|
"packageManager": "yarn@4.0.0-rc.48",
|
|
109
|
-
"version": "4.0.0-next.
|
|
117
|
+
"version": "4.0.0-next.3"
|
|
110
118
|
}
|
package/dist/tuplerone.mjs.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/Node.ts", "../src/graph.ts", "../src/Tuple.ts", "../src/deep.ts", "../src/memoize.ts"],
|
|
4
|
-
"sourcesContent": ["export class Node extends Map<unknown, Node> {\n tuple?: WeakRef<readonly unknown[]>;\n symbol?: WeakRef<symbol>;\n\n get(edge: unknown): Node {\n if (!this.has(edge)) {\n const value = new Node();\n this.set(edge, value);\n return value;\n }\n return super.get(edge) as Node;\n }\n}\n", "// import { Tuple } from './Tuple'\nimport { Node } from './Node';\n\nconst root = new Node();\n\nexport const registry = new FinalizationRegistry((path: unknown[]) => void prune(path));\n\nexport const getNode = (path: unknown[]): Node =>\n path.reduce((node: Node, edge) => node.get(edge), root);\n\nexport const getSymbol = (path: unknown[]): symbol => {\n const node = getNode(path);\n const symbol = node.symbol?.deref();\n\n if (!symbol) {\n const symbol = Symbol();\n node.symbol = new WeakRef(symbol);\n registry.register(symbol, path);\n\n return symbol;\n }\n return symbol;\n};\n\nexport const prune = (path: unknown[]): void => {\n let last: [Node, unknown] = [root, null];\n const nodes = [last];\n for (const edge of path) {\n last = [last[0].get(edge), edge];\n nodes.push(last);\n }\n for (let i = nodes.length - 1; i > 0; i--) {\n const [node, edge] = nodes[i];\n const [parent] = nodes[i - 1];\n if (node.size || node.tuple?.deref() || node.symbol?.deref()) {\n break;\n }\n parent.delete(edge);\n }\n};\n\nexport const clear = () => {\n root.clear();\n};\n", "import { getNode, registry } from './graph';\n\nconst TupleConstructor = class Tuple<A extends readonly unknown[]> extends Array {\n constructor(values: A) {\n super();\n this.push(...values);\n Object.freeze(this);\n }\n};\n\n// TODO: add isRef checks\nexport const isRef = Symbol('isRef');\n\ninterface Referable {\n [isRef]: boolean;\n}\n\ndeclare global {\n interface Object extends Referable {}\n}\n\nexport function Tuple<A extends unknown[]>(...path: A): Readonly<A> {\n if (new.target) {\n throw new TypeError('Tuple is not a constructor');\n }\n\n if (path.length === 0) {\n // Shortcut for 0-tuples\n return tuple0 as any;\n }\n\n const node = getNode(path);\n const derefed = node.tuple?.deref();\n if (derefed) {\n return derefed as A;\n }\n const tuple = new TupleConstructor<A>(path);\n node.tuple = new WeakRef(tuple);\n registry.register(tuple, path);\n\n return tuple as A;\n}\n\n// Allow `instanceof` checks with the helper function as if it were a constructor\nObject.defineProperties(Tuple, {\n [Symbol.hasInstance]: {\n value: (instance: unknown) => instance instanceof TupleConstructor,\n writable: false,\n configurable: false,\n },\n});\n\n// 0-tuple singleton\nconst tuple0 = new TupleConstructor([]);\n", "import { getSymbol } from './graph';\n\nexport const getDeepSymbol = (target: unknown): symbol => {\n const result = _get(target);\n if (typeof result !== 'symbol') {\n throw TypeError('Primitive values are not valid targets');\n }\n return result;\n};\n\nconst _get = <A>(edge: A): A | symbol => {\n switch (typeof edge) {\n case 'string':\n case 'symbol':\n case 'number':\n case 'boolean':\n case 'bigint':\n case 'undefined':\n case 'function':\n return edge;\n default:\n if (Array.isArray(edge)) {\n return getSymbol(edge.map(_get));\n }\n return getSymbol(\n Object.entries(edge as object)\n .flat()\n .map((value, i) => (i % 2 ? _get(value) : value)),\n );\n }\n};\n", "import { getNode } from './graph';\n\nconst cache = new WeakMap();\n\nexport const memoize = <A extends (...args: unknown[]) => unknown>(fn: A): A => {\n const memoized = function (this: unknown, ...args: unknown[]) {\n const node = getNode([memoized, this, ...args]);\n if (!cache.has(node)) {\n cache.set(node, fn.apply(this, args));\n }\n return cache.get(node);\n };\n\n if (fn.name) {\n Object.defineProperty(memoized, 'name', { value: fn.name, writable: false });\n }\n return memoized as A;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["symbol", "Tuple"]
|
|
7
|
-
}
|