@rimbu/deep 0.7.5 → 0.8.2
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/README.md +3 -16
- package/dist/main/literal.js.map +1 -1
- package/dist/main/match.js +4 -2
- package/dist/main/match.js.map +1 -1
- package/dist/main/patch.js +2 -2
- package/dist/main/patch.js.map +1 -1
- package/dist/module/literal.js.map +1 -1
- package/dist/module/match.js +4 -2
- package/dist/module/match.js.map +1 -1
- package/dist/module/patch.js +2 -2
- package/dist/module/patch.js.map +1 -1
- package/dist/types/literal.d.ts +5 -5
- package/dist/types/match.d.ts +6 -4
- package/dist/types/patch.d.ts +6 -4
- package/package.json +6 -6
- package/src/literal.ts +5 -3
- package/src/match.ts +21 -17
- package/src/patch.ts +26 -16
package/README.md
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
# @rimbu/deep
|
|
6
6
|
|
|
7
|
-
Offers tools to use handle plain JS objects as immutable objects.
|
|
7
|
+
Offers tools to use handle plain JS objects as immutable objects. The [`Patch` object](https://rimbu.org/docs/deep/patch) allows convenient immutable modification of simple objects. The [`Match` object](https://rimbu.org/docs/deep/match) allows easy matching on plain objects. The [`Path` object](https://rimbu.org/docs/deep/path) allows easy querying of nested values. The [`Immutable` type](https://rimbu.org/docs/deep/immutable) makes it easy to create plain objects that that have compile-time protection against mutation. The [`Tuple` type](https://rimbu.org/docs/deep/tuple) is a utility to have similar functionality as `as const` but less strict.
|
|
8
8
|
|
|
9
|
-
For complete documentation please visit the _[Rimbu Docs](
|
|
9
|
+
For complete documentation please visit the [Immutable Objects overview](https://rimbu.org/docs/deep/overview) in the _[Rimbu Docs](https://rimbu.org)_.
|
|
10
10
|
|
|
11
|
-
Or [Try
|
|
11
|
+
Or [Try Out Rimbu](https://codesandbox.io/s/github/vitoke/rimbu-sandbox/tree/main?previewwindow=console&view=split&editorsize=65&moduleview=1&module=/src/index.ts) in CodeSandBox.
|
|
12
12
|
|
|
13
13
|
## Installation
|
|
14
14
|
|
|
@@ -50,19 +50,6 @@ Running your script then becomes:
|
|
|
50
50
|
|
|
51
51
|
> `deno run --no-check --config tsconfig.json <your-script>.ts`
|
|
52
52
|
|
|
53
|
-
## Recommended `tsconfig.json` settings
|
|
54
|
-
|
|
55
|
-
Rimbu uses advanced and recursive typing, potentially making the TS compiler quite slow. It is recommended to set the following values in the `tsconfig.json` file of your project:
|
|
56
|
-
|
|
57
|
-
```json
|
|
58
|
-
{
|
|
59
|
-
"compilerOptions": {
|
|
60
|
-
"skipLibCheck": true,
|
|
61
|
-
"noStrictGenericChecks": true
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
53
|
## Usage
|
|
67
54
|
|
|
68
55
|
```ts
|
package/dist/main/literal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/literal.ts"],"names":[],"mappings":";;;AAAA,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAUlC,IAAiB,OAAO,
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/literal.ts"],"names":[],"mappings":";;;AAAA,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAUlC,IAAiB,OAAO,CA2DvB;AA3DD,WAAiB,OAAO;IACtB;;;OAGG;IACH,SAAgB,EAAE,CAAI,KAAQ;;QAC5B,gBAAS,GAAC,OAAO,IAAG,KAAK,KAAG;IAC9B,CAAC;IAFe,UAAE,KAEjB,CAAA;IA6BD;;;OAGG;IACH,SAAgB,SAAS,CAAI,GAAQ;QACnC,OAAO,OAAO,IAAI,GAAG,CAAC;IACxB,CAAC;IAFe,iBAAS,YAExB,CAAA;IAED;;;OAGG;IACH,SAAgB,QAAQ,CAAI,GAAe;QACzC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAFe,gBAAQ,WAEvB,CAAA;IAED;;;OAGG;IACH,SAAgB,aAAa,CAAC,GAAQ;QACpC,OAAO,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;IACjE,CAAC;IAFe,qBAAa,gBAE5B,CAAA;AACH,CAAC,EA3DgB,OAAO,GAAP,eAAO,KAAP,eAAO,QA2DvB"}
|
package/dist/main/match.js
CHANGED
|
@@ -134,10 +134,12 @@ function matchSingle(value, matcher, parent, root) {
|
|
|
134
134
|
return matcher(value, parent, root);
|
|
135
135
|
}
|
|
136
136
|
if (null === value || undefined === value || typeof value !== 'object') {
|
|
137
|
-
if (typeof matcher !== 'object' || null === matcher)
|
|
137
|
+
if (typeof matcher !== 'object' || null === matcher) {
|
|
138
138
|
return matcher === value;
|
|
139
|
-
|
|
139
|
+
}
|
|
140
|
+
if (internal_1.Literal.isLiteral(matcher)) {
|
|
140
141
|
return internal_1.Literal.getValue(matcher) === value;
|
|
142
|
+
}
|
|
141
143
|
return matcher === value;
|
|
142
144
|
}
|
|
143
145
|
if (Array.isArray(matcher)) {
|
package/dist/main/match.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":";;;;AAAA,oCAAyC;AAEzC,uCAAgD;
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":"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"}
|
package/dist/main/patch.js
CHANGED
|
@@ -112,10 +112,10 @@ function patchSingle(value, patcher, parent, root) {
|
|
|
112
112
|
var clone = valueIsArray ? (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(value), false) : (0, tslib_1.__assign)({}, value);
|
|
113
113
|
var changed = false;
|
|
114
114
|
for (var key in patcher) {
|
|
115
|
-
|
|
115
|
+
var patchKey = patcher[key];
|
|
116
|
+
if (!(key in clone) && typeof patchKey === 'function')
|
|
116
117
|
continue;
|
|
117
118
|
var oldValue = clone[key];
|
|
118
|
-
var patchKey = patcher[key];
|
|
119
119
|
if (undefined === patchKey) {
|
|
120
120
|
base_1.RimbuError.throwInvalidUsageError('Do not use undefined directly in patch objects, but use Literal.of(undefined) instead due to type limitations.');
|
|
121
121
|
}
|
package/dist/main/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":";;;;AAAA,oCAAyC;AAEzC,uCAAqC;
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/literal.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAUlC,MAAM,KAAW,OAAO,
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/literal.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAUlC,MAAM,KAAW,OAAO,CA2DvB;AA3DD,WAAiB,OAAO;IACtB;;;OAGG;IACH,SAAgB,EAAE,CAAI,KAAQ;QAC5B,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAFe,UAAE,KAEjB,CAAA;IA6BD;;;OAGG;IACH,SAAgB,SAAS,CAAI,GAAQ;QACnC,OAAO,OAAO,IAAI,GAAG,CAAC;IACxB,CAAC;IAFe,iBAAS,YAExB,CAAA;IAED;;;OAGG;IACH,SAAgB,QAAQ,CAAI,GAAe;QACzC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAFe,gBAAQ,WAEvB,CAAA;IAED;;;OAGG;IACH,SAAgB,aAAa,CAAC,GAAQ;QACpC,OAAO,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;IACjE,CAAC;IAFe,qBAAa,gBAE5B,CAAA;AACH,CAAC,EA3DgB,OAAO,KAAP,OAAO,QA2DvB"}
|
package/dist/module/match.js
CHANGED
|
@@ -92,10 +92,12 @@ function matchSingle(value, matcher, parent, root) {
|
|
|
92
92
|
return matcher(value, parent, root);
|
|
93
93
|
}
|
|
94
94
|
if (null === value || undefined === value || typeof value !== 'object') {
|
|
95
|
-
if (typeof matcher !== 'object' || null === matcher)
|
|
95
|
+
if (typeof matcher !== 'object' || null === matcher) {
|
|
96
96
|
return matcher === value;
|
|
97
|
-
|
|
97
|
+
}
|
|
98
|
+
if (Literal.isLiteral(matcher)) {
|
|
98
99
|
return Literal.getValue(matcher) === value;
|
|
100
|
+
}
|
|
99
101
|
return matcher === value;
|
|
100
102
|
}
|
|
101
103
|
if (Array.isArray(matcher)) {
|
package/dist/module/match.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAa,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/match.ts"],"names":[],"mappings":"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"}
|
package/dist/module/patch.js
CHANGED
|
@@ -86,10 +86,10 @@ function patchSingle(value, patcher, parent, root) {
|
|
|
86
86
|
const clone = valueIsArray ? [...value] : Object.assign({}, value);
|
|
87
87
|
let changed = false;
|
|
88
88
|
for (const key in patcher) {
|
|
89
|
-
|
|
89
|
+
const patchKey = patcher[key];
|
|
90
|
+
if (!(key in clone) && typeof patchKey === 'function')
|
|
90
91
|
continue;
|
|
91
92
|
const oldValue = clone[key];
|
|
92
|
-
const patchKey = patcher[key];
|
|
93
93
|
if (undefined === patchKey) {
|
|
94
94
|
RimbuError.throwInvalidUsageError('Do not use undefined directly in patch objects, but use Literal.of(undefined) instead due to type limitations.');
|
|
95
95
|
}
|
package/dist/module/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
|
package/dist/types/literal.d.ts
CHANGED
|
@@ -3,9 +3,9 @@ declare type LITERAL = typeof LITERAL;
|
|
|
3
3
|
/**
|
|
4
4
|
* Type to represent Literal values for the match and patch functions.
|
|
5
5
|
*/
|
|
6
|
-
export
|
|
6
|
+
export interface Literal<T> {
|
|
7
7
|
readonly [LITERAL]: T;
|
|
8
|
-
}
|
|
8
|
+
}
|
|
9
9
|
export declare namespace Literal {
|
|
10
10
|
/**
|
|
11
11
|
* Returns a Literal value embedding the given `value`.
|
|
@@ -15,9 +15,9 @@ export declare namespace Literal {
|
|
|
15
15
|
/**
|
|
16
16
|
* Excludes Iterable types
|
|
17
17
|
*/
|
|
18
|
-
|
|
19
|
-
[Symbol.iterator]?: never;
|
|
20
|
-
}
|
|
18
|
+
interface NoIterable {
|
|
19
|
+
readonly [Symbol.iterator]?: never;
|
|
20
|
+
}
|
|
21
21
|
/**
|
|
22
22
|
* A plain object that is not iterable
|
|
23
23
|
*/
|
package/dist/types/match.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { Immutable, Literal } from './internal';
|
|
|
6
6
|
* @typeparam P - the parant type
|
|
7
7
|
* @typeparam R - the root type
|
|
8
8
|
*/
|
|
9
|
-
export declare type Match<T
|
|
9
|
+
export declare type Match<T> = MatchHelper<T, T, T>;
|
|
10
|
+
declare type MatchHelper<T, P, R> = T extends Literal.Obj ? Match.MatchObj<T, P, R> : T extends readonly any[] ? Match.MatchArray<T, P, R> : Match.Compare<T, P, R>;
|
|
10
11
|
export declare namespace Match {
|
|
11
12
|
/**
|
|
12
13
|
* Type to determine the allowed input type for `match` functions given an object type T.
|
|
@@ -15,7 +16,7 @@ export declare namespace Match {
|
|
|
15
16
|
* @typeparam R - the root type
|
|
16
17
|
*/
|
|
17
18
|
type MatchObj<T, P, R> = (Match.Compare<T, P, R> | {
|
|
18
|
-
[K in keyof T]?:
|
|
19
|
+
[K in keyof T]?: MatchHelper<T[K], T, R>;
|
|
19
20
|
}) & Literal.NoIterable;
|
|
20
21
|
/**
|
|
21
22
|
* Type representing at least one Match object for type T
|
|
@@ -35,10 +36,10 @@ export declare namespace Match {
|
|
|
35
36
|
* @typeparam P - the parent type
|
|
36
37
|
* @typeparam R - the root type
|
|
37
38
|
*/
|
|
38
|
-
type MatchArray<T extends readonly
|
|
39
|
+
type MatchArray<T extends readonly any[], P, R> = (Match.Compare<T, P, R> | {
|
|
39
40
|
[K in {
|
|
40
41
|
[K2 in keyof T]: K2;
|
|
41
|
-
}[keyof T]]?:
|
|
42
|
+
}[keyof T]]?: MatchHelper<T[K], T, R>;
|
|
42
43
|
}) & Literal.NoIterable;
|
|
43
44
|
/**
|
|
44
45
|
* Returns true if the given `value` matches all of the given objects in the `matchers` array.
|
|
@@ -99,3 +100,4 @@ export declare namespace Match {
|
|
|
99
100
|
*/
|
|
100
101
|
function createAny<T, T2 extends T = T>(...matches: Match.Multi<T2>): (value: T) => boolean;
|
|
101
102
|
}
|
|
103
|
+
export {};
|
package/dist/types/patch.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { Literal } from './internal';
|
|
|
6
6
|
* @typeparam P - the parant type
|
|
7
7
|
* @typeparam R - the root type
|
|
8
8
|
*/
|
|
9
|
-
export declare type Patch<T
|
|
9
|
+
export declare type Patch<T> = PatchHelper<T, T, T>;
|
|
10
|
+
declare type PatchHelper<T, P, R> = T extends Literal.Obj ? Patch.PatchObj<T, P, R> : T extends readonly unknown[] ? Patch.PatchArray<T, P, R> : Patch.Update<T, P, R>;
|
|
10
11
|
/**
|
|
11
12
|
* Returns an updated version of given `value`, without modifying the value, where the contents
|
|
12
13
|
* are updated according to the given `patches` Patch array.
|
|
@@ -31,7 +32,7 @@ export declare namespace Patch {
|
|
|
31
32
|
* @typeparam R - the root type
|
|
32
33
|
*/
|
|
33
34
|
type PatchObj<T extends Literal.Obj, P = T, R = T> = Patch.Update<T, P, R> | {
|
|
34
|
-
[K in keyof T]?:
|
|
35
|
+
[K in keyof T]?: PatchHelper<T[K], T, R>;
|
|
35
36
|
};
|
|
36
37
|
/**
|
|
37
38
|
* Type representing at least one Patch object for type T
|
|
@@ -52,11 +53,11 @@ export declare namespace Patch {
|
|
|
52
53
|
* @typeparam R - the root type
|
|
53
54
|
*/
|
|
54
55
|
type PatchArray<T extends readonly unknown[], P, R> = (Patch.Update<T, P, R> | (T extends readonly (infer E)[] ? {
|
|
55
|
-
[Patch.MAP]:
|
|
56
|
+
[Patch.MAP]: PatchHelper<E, T, R>;
|
|
56
57
|
} : never) | {
|
|
57
58
|
[K in {
|
|
58
59
|
[K2 in keyof T]: K2;
|
|
59
|
-
}[keyof T]]?:
|
|
60
|
+
}[keyof T]]?: PatchHelper<T[K], T, R>;
|
|
60
61
|
}) & Literal.NoIterable;
|
|
61
62
|
/**
|
|
62
63
|
* Returns a function that patches a given object of type `T` with the given `patches`
|
|
@@ -71,3 +72,4 @@ export declare namespace Patch {
|
|
|
71
72
|
*/
|
|
72
73
|
function create<T, T2 extends T = T>(...patches: Patch.Multi<T2>): (value: T) => T;
|
|
73
74
|
}
|
|
75
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rimbu/deep",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Tools to use handle plain JS objects as immutable objects",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"immutable",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"rimbu",
|
|
13
13
|
"typescript"
|
|
14
14
|
],
|
|
15
|
-
"homepage": "
|
|
15
|
+
"homepage": "https://rimbu.org",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "Arvid Nicolaas",
|
|
18
18
|
"email": "arvid@rimbu.org",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"bundle:types": "tsc --p tsconfig.types.json",
|
|
48
48
|
"clean": "rimraf dist",
|
|
49
49
|
"format": "yarn format:base --write",
|
|
50
|
-
"format:base": "prettier \"{!CHANGELOG.md}
|
|
50
|
+
"format:base": "prettier \"{!CHANGELOG.md}|**/**/*.{ts,tsx,js,json,md}\"",
|
|
51
51
|
"format:check": "yarn format:base --check",
|
|
52
52
|
"lint": "eslint src",
|
|
53
53
|
"test": "jest",
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
},
|
|
57
57
|
"sideEffects": false,
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@rimbu/base": "^0.
|
|
60
|
-
"@rimbu/common": "^0.
|
|
59
|
+
"@rimbu/base": "^0.7.2",
|
|
60
|
+
"@rimbu/common": "^0.8.2",
|
|
61
61
|
"tslib": "^2.3.1"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"denoify": {
|
|
67
67
|
"replacer": "../../config/denoify-rimbu-replacer.js"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "1594b907f4dbbd994a52f0e2e94ffd9217420ff5"
|
|
70
70
|
}
|
package/src/literal.ts
CHANGED
|
@@ -4,9 +4,9 @@ type LITERAL = typeof LITERAL;
|
|
|
4
4
|
/**
|
|
5
5
|
* Type to represent Literal values for the match and patch functions.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export interface Literal<T> {
|
|
8
8
|
readonly [LITERAL]: T;
|
|
9
|
-
}
|
|
9
|
+
}
|
|
10
10
|
|
|
11
11
|
export namespace Literal {
|
|
12
12
|
/**
|
|
@@ -20,7 +20,9 @@ export namespace Literal {
|
|
|
20
20
|
/**
|
|
21
21
|
* Excludes Iterable types
|
|
22
22
|
*/
|
|
23
|
-
export
|
|
23
|
+
export interface NoIterable {
|
|
24
|
+
readonly [Symbol.iterator]?: never;
|
|
25
|
+
}
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* A plain object that is not iterable
|
package/src/match.ts
CHANGED
|
@@ -8,9 +8,11 @@ import { Immutable, Literal } from './internal';
|
|
|
8
8
|
* @typeparam P - the parant type
|
|
9
9
|
* @typeparam R - the root type
|
|
10
10
|
*/
|
|
11
|
-
export type Match<T
|
|
11
|
+
export type Match<T> = MatchHelper<T, T, T>;
|
|
12
|
+
|
|
13
|
+
type MatchHelper<T, P, R> = T extends Literal.Obj
|
|
12
14
|
? Match.MatchObj<T, P, R>
|
|
13
|
-
: T extends readonly
|
|
15
|
+
: T extends readonly any[]
|
|
14
16
|
? Match.MatchArray<T, P, R>
|
|
15
17
|
: Match.Compare<T, P, R>;
|
|
16
18
|
|
|
@@ -23,7 +25,7 @@ export namespace Match {
|
|
|
23
25
|
*/
|
|
24
26
|
export type MatchObj<T, P, R> = (
|
|
25
27
|
| Match.Compare<T, P, R>
|
|
26
|
-
| { [K in keyof T]?:
|
|
28
|
+
| { [K in keyof T]?: MatchHelper<T[K], T, R> }
|
|
27
29
|
) &
|
|
28
30
|
Literal.NoIterable;
|
|
29
31
|
|
|
@@ -53,10 +55,10 @@ export namespace Match {
|
|
|
53
55
|
* @typeparam P - the parent type
|
|
54
56
|
* @typeparam R - the root type
|
|
55
57
|
*/
|
|
56
|
-
export type MatchArray<T extends readonly
|
|
58
|
+
export type MatchArray<T extends readonly any[], P, R> = (
|
|
57
59
|
| Match.Compare<T, P, R>
|
|
58
60
|
| {
|
|
59
|
-
[K in { [K2 in keyof T]: K2 }[keyof T]]?:
|
|
61
|
+
[K in { [K2 in keyof T]: K2 }[keyof T]]?: MatchHelper<T[K], T, R>;
|
|
60
62
|
}
|
|
61
63
|
) &
|
|
62
64
|
Literal.NoIterable;
|
|
@@ -71,7 +73,7 @@ export namespace Match {
|
|
|
71
73
|
* matchAll({ g: { h: 'abc' }})({ g: { h: v => v.length > 1 }}) => true
|
|
72
74
|
*/
|
|
73
75
|
export function all<T>(value: T): (...matchers: Match.Multi<T>) => boolean {
|
|
74
|
-
return (...matchers) => {
|
|
76
|
+
return (...matchers): boolean => {
|
|
75
77
|
for (const matcher of matchers) {
|
|
76
78
|
if (!matchSingle<any, any, any>(value, matcher, value, value)) {
|
|
77
79
|
return false;
|
|
@@ -92,7 +94,7 @@ export namespace Match {
|
|
|
92
94
|
* matchAny({ g: { h: 'abc' }})({ g: { h: 'a' }}, { g: { h: v => v.length > 1 }}) => true
|
|
93
95
|
*/
|
|
94
96
|
export function any<T>(value: T): (...matchers: Match.Multi<T>) => boolean {
|
|
95
|
-
return (...matchers) => {
|
|
97
|
+
return (...matchers): boolean => {
|
|
96
98
|
for (const matcher of matchers) {
|
|
97
99
|
if (matchSingle<any, any, any>(value, matcher, value, value)) {
|
|
98
100
|
return true;
|
|
@@ -123,7 +125,7 @@ export namespace Match {
|
|
|
123
125
|
export function createAll<T, T2 extends T = T>(
|
|
124
126
|
...matches: Match.Multi<T2>
|
|
125
127
|
): (value: T) => boolean {
|
|
126
|
-
return (value) => Match.all<any>(value)(...matches);
|
|
128
|
+
return (value): boolean => Match.all<any>(value)(...matches);
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
/**
|
|
@@ -148,13 +150,13 @@ export namespace Match {
|
|
|
148
150
|
export function createAny<T, T2 extends T = T>(
|
|
149
151
|
...matches: Match.Multi<T2>
|
|
150
152
|
): (value: T) => boolean {
|
|
151
|
-
return (value) => Match.any<any>(value)(...matches);
|
|
153
|
+
return (value): boolean => Match.any<any>(value)(...matches);
|
|
152
154
|
}
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
function matchSingle<T, P
|
|
157
|
+
function matchSingle<T, P, R>(
|
|
156
158
|
value: Immutable<T>,
|
|
157
|
-
matcher:
|
|
159
|
+
matcher: MatchHelper<T, P, R>,
|
|
158
160
|
parent: Immutable<P>,
|
|
159
161
|
root: Immutable<R>
|
|
160
162
|
): boolean {
|
|
@@ -163,10 +165,12 @@ function matchSingle<T, P = T, R = T>(
|
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
if (null === value || undefined === value || typeof value !== 'object') {
|
|
166
|
-
if (typeof matcher !== 'object' || null === matcher)
|
|
168
|
+
if (typeof matcher !== 'object' || null === matcher) {
|
|
167
169
|
return (matcher as any) === value;
|
|
168
|
-
|
|
170
|
+
}
|
|
171
|
+
if (Literal.isLiteral(matcher)) {
|
|
169
172
|
return Literal.getValue(matcher) === value;
|
|
173
|
+
}
|
|
170
174
|
return (matcher as any) === value;
|
|
171
175
|
}
|
|
172
176
|
|
|
@@ -180,8 +184,8 @@ function matchSingle<T, P = T, R = T>(
|
|
|
180
184
|
|
|
181
185
|
if (null === matcher) return false;
|
|
182
186
|
|
|
183
|
-
if (Literal.isLiteral
|
|
184
|
-
return Literal.getValue
|
|
187
|
+
if (Literal.isLiteral(matcher)) {
|
|
188
|
+
return Literal.getValue(matcher) === value;
|
|
185
189
|
}
|
|
186
190
|
|
|
187
191
|
const valueIsArray = Array.isArray(value);
|
|
@@ -191,10 +195,10 @@ function matchSingle<T, P = T, R = T>(
|
|
|
191
195
|
return (matcher as any) === value;
|
|
192
196
|
}
|
|
193
197
|
|
|
194
|
-
for (const key in matcher as
|
|
198
|
+
for (const key in matcher as any) {
|
|
195
199
|
if (!(key in value)) return false;
|
|
196
200
|
|
|
197
|
-
const matchKey = (matcher as
|
|
201
|
+
const matchKey = (matcher as any)[key];
|
|
198
202
|
|
|
199
203
|
if (undefined === matchKey) {
|
|
200
204
|
RimbuError.throwInvalidUsageError(
|
package/src/patch.ts
CHANGED
|
@@ -8,7 +8,9 @@ import { Literal } from './internal';
|
|
|
8
8
|
* @typeparam P - the parant type
|
|
9
9
|
* @typeparam R - the root type
|
|
10
10
|
*/
|
|
11
|
-
export type Patch<T
|
|
11
|
+
export type Patch<T> = PatchHelper<T, T, T>;
|
|
12
|
+
|
|
13
|
+
type PatchHelper<T, P, R> = T extends Literal.Obj
|
|
12
14
|
? Patch.PatchObj<T, P, R>
|
|
13
15
|
: T extends readonly unknown[]
|
|
14
16
|
? Patch.PatchArray<T, P, R>
|
|
@@ -29,11 +31,16 @@ export type Patch<T, P = T, R = T> = T extends Literal.Obj
|
|
|
29
31
|
* // => { a: 3, b: 4 }
|
|
30
32
|
*/
|
|
31
33
|
export function patch<T>(value: T): (...patches: Patch.Multi<T>) => T {
|
|
32
|
-
return function (...patches) {
|
|
34
|
+
return function (...patches): T {
|
|
33
35
|
let result = value;
|
|
34
36
|
|
|
35
37
|
for (const p of patches) {
|
|
36
|
-
result = patchSingle(
|
|
38
|
+
result = patchSingle(
|
|
39
|
+
result as any,
|
|
40
|
+
p as any,
|
|
41
|
+
result as any,
|
|
42
|
+
result as any
|
|
43
|
+
);
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
return result;
|
|
@@ -51,7 +58,7 @@ export namespace Patch {
|
|
|
51
58
|
*/
|
|
52
59
|
export type PatchObj<T extends Literal.Obj, P = T, R = T> =
|
|
53
60
|
| Patch.Update<T, P, R>
|
|
54
|
-
| { [K in keyof T]?:
|
|
61
|
+
| { [K in keyof T]?: PatchHelper<T[K], T, R> };
|
|
55
62
|
|
|
56
63
|
/**
|
|
57
64
|
* Type representing at least one Patch object for type T
|
|
@@ -77,9 +84,11 @@ export namespace Patch {
|
|
|
77
84
|
*/
|
|
78
85
|
export type PatchArray<T extends readonly unknown[], P, R> = (
|
|
79
86
|
| Patch.Update<T, P, R>
|
|
80
|
-
| (T extends readonly (infer E)[]
|
|
87
|
+
| (T extends readonly (infer E)[]
|
|
88
|
+
? { [Patch.MAP]: PatchHelper<E, T, R> }
|
|
89
|
+
: never)
|
|
81
90
|
| {
|
|
82
|
-
[K in { [K2 in keyof T]: K2 }[keyof T]]?:
|
|
91
|
+
[K in { [K2 in keyof T]: K2 }[keyof T]]?: PatchHelper<T[K], T, R>;
|
|
83
92
|
}
|
|
84
93
|
) &
|
|
85
94
|
Literal.NoIterable;
|
|
@@ -98,14 +107,14 @@ export namespace Patch {
|
|
|
98
107
|
export function create<T, T2 extends T = T>(
|
|
99
108
|
...patches: Patch.Multi<T2>
|
|
100
109
|
): (value: T) => T {
|
|
101
|
-
return (value) =>
|
|
110
|
+
return (value): T =>
|
|
102
111
|
patch<T>(value)(...(patches as unknown as Patch.Multi<T>));
|
|
103
112
|
}
|
|
104
113
|
}
|
|
105
114
|
|
|
106
|
-
function patchSingle<T, P
|
|
115
|
+
function patchSingle<T, P, R>(
|
|
107
116
|
value: T,
|
|
108
|
-
patcher:
|
|
117
|
+
patcher: PatchHelper<T, P, R>,
|
|
109
118
|
parent: P,
|
|
110
119
|
root: R
|
|
111
120
|
): T {
|
|
@@ -115,8 +124,8 @@ function patchSingle<T, P = T, R = T>(
|
|
|
115
124
|
|
|
116
125
|
if (null === value || undefined === value || typeof value !== 'object') {
|
|
117
126
|
if (typeof patcher !== 'object' || null === patcher) return patcher as any;
|
|
118
|
-
if (Literal.isLiteral
|
|
119
|
-
return Literal.getValue(patcher);
|
|
127
|
+
if (Literal.isLiteral(patcher)) {
|
|
128
|
+
return Literal.getValue(patcher) as any;
|
|
120
129
|
}
|
|
121
130
|
return value;
|
|
122
131
|
}
|
|
@@ -129,8 +138,8 @@ function patchSingle<T, P = T, R = T>(
|
|
|
129
138
|
|
|
130
139
|
if (null === patcher) return null as any;
|
|
131
140
|
|
|
132
|
-
if (Literal.isLiteral
|
|
133
|
-
return Literal.getValue(patcher);
|
|
141
|
+
if (Literal.isLiteral(patcher)) {
|
|
142
|
+
return Literal.getValue(patcher) as any;
|
|
134
143
|
}
|
|
135
144
|
|
|
136
145
|
const valueIsArray = Array.isArray(value);
|
|
@@ -160,11 +169,12 @@ function patchSingle<T, P = T, R = T>(
|
|
|
160
169
|
const clone: any = valueIsArray ? ([...(value as any)] as any) : { ...value };
|
|
161
170
|
let changed = false;
|
|
162
171
|
|
|
163
|
-
for (const key in patcher as
|
|
164
|
-
|
|
172
|
+
for (const key in patcher as any) {
|
|
173
|
+
const patchKey = (patcher as any)[key];
|
|
174
|
+
|
|
175
|
+
if (!(key in clone) && typeof patchKey === 'function') continue;
|
|
165
176
|
|
|
166
177
|
const oldValue = clone[key];
|
|
167
|
-
const patchKey = (patcher as T)[key];
|
|
168
178
|
|
|
169
179
|
if (undefined === patchKey) {
|
|
170
180
|
RimbuError.throwInvalidUsageError(
|