@grahlnn/fn 0.1.0 → 0.1.1
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 +11 -5
- package/dist/matchable.d.ts +33 -4
- package/dist/matchable.d.ts.map +1 -1
- package/dist/matchable.js +90 -15
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Tiny, type-safe helpers for matching enums, unions, and objects.
|
|
1
|
+
Ergonomic functional programming helpers.
|
|
4
2
|
|
|
5
3
|
## Install
|
|
6
4
|
```bash
|
|
7
|
-
bun add @grahlnn/
|
|
5
|
+
bun add @grahlnn/fn
|
|
8
6
|
```
|
|
9
7
|
|
|
10
8
|
## Usage
|
|
11
9
|
```ts
|
|
12
|
-
import { me } from "@grahlnn/
|
|
10
|
+
import { me } from "@grahlnn/fn";
|
|
13
11
|
|
|
14
12
|
const status = me<"idle" | "loading" | "error">("loading");
|
|
15
13
|
|
|
@@ -18,4 +16,12 @@ const label = status.match({
|
|
|
18
16
|
loading: () => "Loading",
|
|
19
17
|
_: () => "Error",
|
|
20
18
|
});
|
|
19
|
+
|
|
20
|
+
import { Ok, Err } from "@grahlnn/fn";
|
|
21
|
+
|
|
22
|
+
const result = Ok(42);
|
|
23
|
+
const error = Err("Something went wrong");
|
|
24
|
+
|
|
25
|
+
result.isOk(); // true
|
|
26
|
+
result.isErr(); // false
|
|
21
27
|
```
|
package/dist/matchable.d.ts
CHANGED
|
@@ -19,8 +19,8 @@ type MatchableEnum<T extends string | number | boolean> = {
|
|
|
19
19
|
not(v: T): v is T;
|
|
20
20
|
in(v: Array<T>): boolean;
|
|
21
21
|
not_in(v: Array<T>): boolean;
|
|
22
|
-
into(): <R>(fn: Handler<R>) => R | null;
|
|
23
|
-
catch<L extends Array<T>>(...arr_branch: L): <R>(fn: Handler<R>) => R | null;
|
|
22
|
+
into(): <R>(fn: Handler<R, T>) => R | null;
|
|
23
|
+
catch<L extends Array<T>>(...arr_branch: L): <R>(fn: Handler<R, L[number]>) => R | null;
|
|
24
24
|
};
|
|
25
25
|
type VariantTag<T> = T extends any ? keyof T : never;
|
|
26
26
|
type FullHandlers<T, R> = {
|
|
@@ -44,11 +44,11 @@ type MatchableUnion<T extends Record<string, any>> = {
|
|
|
44
44
|
in(arr: Array<VariantTag<T>>): boolean;
|
|
45
45
|
not_in(arr: Array<VariantTag<T>>): boolean;
|
|
46
46
|
into(): <R>(fn: (payload: Extract<T, Record<K, any>>[K]) => R) => R | null;
|
|
47
|
-
catch<
|
|
47
|
+
catch<KS extends Array<VariantTag<T>>>(...arr_branch: KS): <R>(fn: (payload: Extract<T, Record<KS[number], any>>[KS[number]]) => R) => R | null;
|
|
48
48
|
};
|
|
49
49
|
}[VariantTag<T>];
|
|
50
50
|
declare const emptyMatchable: {
|
|
51
|
-
__recognizer__:
|
|
51
|
+
__recognizer__: "empty";
|
|
52
52
|
value: null;
|
|
53
53
|
value_or: <T>(x: T) => T;
|
|
54
54
|
value_or_else: <R>(f: () => R) => R;
|
|
@@ -61,6 +61,33 @@ declare const emptyMatchable: {
|
|
|
61
61
|
in: (_?: unknown) => boolean;
|
|
62
62
|
};
|
|
63
63
|
type EmptyMatchable = typeof emptyMatchable;
|
|
64
|
+
type OmitD<T, K extends PropertyKey> = T extends any ? Omit<T, K> : never;
|
|
65
|
+
type HasKeyInAll<U, K extends PropertyKey> = [U] extends [Record<K, any>] ? true : false;
|
|
66
|
+
type DiscTag<U, K extends PropertyKey> = U extends Record<K, infer V> ? V : never;
|
|
67
|
+
type DiscTagValue<U, K extends PropertyKey> = Extract<DiscTag<U, K>, string | number | boolean>;
|
|
68
|
+
type DiscMember<U, K extends PropertyKey, V> = Extract<U, Record<K, V>>;
|
|
69
|
+
type DiscPayload<U, K extends PropertyKey, V> = OmitD<DiscMember<U, K, V>, K>;
|
|
70
|
+
type FromRecordKey<K, TV> = TV extends boolean ? K extends "true" ? true : K extends "false" ? false : never : K extends TV ? K : never;
|
|
71
|
+
type FullDiscHandlers<U, K extends keyof any & string, R> = {
|
|
72
|
+
[RK in ToRecordKey<DiscTagValue<U, K>>]: Handler<R, DiscPayload<U, K, FromRecordKey<RK, DiscTagValue<U, K>>>>;
|
|
73
|
+
};
|
|
74
|
+
type DiscDefaultHandlers<U, K extends keyof any & string, R> = (Partial<FullDiscHandlers<U, K, R>> & {
|
|
75
|
+
_: Handler<R, DiscMember<U, K, DiscTagValue<U, K>>>;
|
|
76
|
+
}) | FullDiscHandlers<U, K, R>;
|
|
77
|
+
type DiscHandlersOrNever<U, K extends keyof any & string, R> = HasKeyInAll<U, K> extends true ? DiscTagValue<U, K> extends never ? never : DiscDefaultHandlers<U, K, R> : never;
|
|
78
|
+
type MatchableDisc<U extends Record<string, any>, K extends keyof any & string> = {
|
|
79
|
+
__recognizer__: "disc";
|
|
80
|
+
key: K;
|
|
81
|
+
value: U;
|
|
82
|
+
tag: DiscTagValue<U, K> | Nil;
|
|
83
|
+
match<R>(h: DiscHandlersOrNever<U, K, R>): R;
|
|
84
|
+
is<V extends DiscTagValue<U, K>>(v: V): boolean;
|
|
85
|
+
not<V extends DiscTagValue<U, K>>(v: V): boolean;
|
|
86
|
+
in(arr: Array<DiscTagValue<U, K>>): boolean;
|
|
87
|
+
not_in(arr: Array<DiscTagValue<U, K>>): boolean;
|
|
88
|
+
into(): <R>(fn: Handler<R, OmitD<U, K>>) => R | null;
|
|
89
|
+
catch<L extends Array<DiscTagValue<U, K>>>(...arr_branch: L): <R>(fn: Handler<R, DiscPayload<U, K, L[number]>>) => R | null;
|
|
90
|
+
};
|
|
64
91
|
type MatchableObj<T extends Record<string, any>> = {
|
|
65
92
|
__recognizer__: "object";
|
|
66
93
|
value: T;
|
|
@@ -68,6 +95,8 @@ type MatchableObj<T extends Record<string, any>> = {
|
|
|
68
95
|
catch<KS extends readonly (keyof T)[]>(...keys: KS): <R>(fn: (props: {
|
|
69
96
|
[P in KS[number]]: NonNullable<T[P]>;
|
|
70
97
|
}) => R) => R | null;
|
|
98
|
+
as<const K extends keyof T & string>(key: K): MatchableDisc<T, K>;
|
|
99
|
+
match<const K extends keyof T & string, R>(key: K, handlers: DiscHandlersOrNever<T, K, R>): R;
|
|
71
100
|
};
|
|
72
101
|
type IsUnion<T, U = T> = T extends any ? [U] extends [T] ? false : true : never;
|
|
73
102
|
type IsSingleKeyObj<O extends Record<string, any>> = IsUnion<keyof O> extends true ? false : true;
|
package/dist/matchable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchable.d.ts","sourceRoot":"","sources":["../src/matchable.ts"],"names":[],"mappings":"AAGA,KAAK,GAAG,GAAG,IAAI,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"matchable.d.ts","sourceRoot":"","sources":["../src/matchable.ts"],"names":[],"mappings":"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"}
|
package/dist/matchable.js
CHANGED
|
@@ -5,13 +5,12 @@ function matchableEnum(value) {
|
|
|
5
5
|
__recognizer__: "enum",
|
|
6
6
|
value,
|
|
7
7
|
value_or(fallback) {
|
|
8
|
-
return value ?? fallback;
|
|
8
|
+
return (value ?? fallback);
|
|
9
9
|
},
|
|
10
10
|
value_or_else(fallback) {
|
|
11
|
-
return value ?? fallback();
|
|
11
|
+
return (value ?? fallback());
|
|
12
12
|
},
|
|
13
13
|
match(h) {
|
|
14
|
-
// 运行时:boolean 转成 "true"/"false"
|
|
15
14
|
const k = (typeof value === "boolean" ? String(value) : value);
|
|
16
15
|
const handler = (k in h ? h[k] : h._);
|
|
17
16
|
return handler(value);
|
|
@@ -27,13 +26,15 @@ function matchableEnum(value) {
|
|
|
27
26
|
into() {
|
|
28
27
|
const self = this;
|
|
29
28
|
return function (fn) {
|
|
30
|
-
return fn(self.value);
|
|
29
|
+
return self.value == null ? null : fn(self.value);
|
|
31
30
|
};
|
|
32
31
|
},
|
|
33
32
|
catch(...arr_branch) {
|
|
34
33
|
const self = this;
|
|
35
34
|
return function (fn) {
|
|
36
|
-
return self.
|
|
35
|
+
return self.value != null && self.in(arr_branch)
|
|
36
|
+
? fn(self.value)
|
|
37
|
+
: null;
|
|
37
38
|
};
|
|
38
39
|
},
|
|
39
40
|
};
|
|
@@ -65,19 +66,26 @@ function matchableUnion(value) {
|
|
|
65
66
|
into() {
|
|
66
67
|
const self = this;
|
|
67
68
|
return function (fn) {
|
|
68
|
-
return self.value && !isEqual(self.value, [])
|
|
69
|
+
return self.value != null && !isEqual(self.value, [])
|
|
70
|
+
? fn(self.value)
|
|
71
|
+
: null;
|
|
69
72
|
};
|
|
70
73
|
},
|
|
71
74
|
catch(...arr_branch) {
|
|
72
75
|
const self = this;
|
|
73
76
|
return function (fn) {
|
|
74
|
-
return self.in(arr_branch) &&
|
|
77
|
+
return self.in(arr_branch) &&
|
|
78
|
+
self.value != null &&
|
|
79
|
+
!isEqual(self.value, [])
|
|
75
80
|
? fn(self.value)
|
|
76
81
|
: null;
|
|
77
82
|
};
|
|
78
83
|
},
|
|
79
84
|
};
|
|
80
85
|
}
|
|
86
|
+
/* =============================
|
|
87
|
+
* Empty matcher (null/undefined)
|
|
88
|
+
* ============================= */
|
|
81
89
|
const emptyMatchable = {
|
|
82
90
|
__recognizer__: "empty",
|
|
83
91
|
value: null,
|
|
@@ -91,18 +99,75 @@ const emptyMatchable = {
|
|
|
91
99
|
into: K(K(null)),
|
|
92
100
|
in: K(false),
|
|
93
101
|
};
|
|
102
|
+
function _disc_key(v) {
|
|
103
|
+
return typeof v === "boolean" ? String(v) : v;
|
|
104
|
+
}
|
|
105
|
+
function _disc_payload(obj, key) {
|
|
106
|
+
const out = { ...obj };
|
|
107
|
+
delete out[key];
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
function matchableDisc(value, key) {
|
|
111
|
+
const tag = value[key];
|
|
112
|
+
return {
|
|
113
|
+
__recognizer__: "disc",
|
|
114
|
+
key,
|
|
115
|
+
value,
|
|
116
|
+
tag,
|
|
117
|
+
match(h) {
|
|
118
|
+
const t = tag;
|
|
119
|
+
const rk = t == null ? null : _disc_key(t);
|
|
120
|
+
const has = rk != null && rk in h;
|
|
121
|
+
const fn = (has ? h[rk] : h._);
|
|
122
|
+
if (!fn) {
|
|
123
|
+
throw new Error(`match(): no handler for key=${String(key)} tag=${String(rk)}`);
|
|
124
|
+
}
|
|
125
|
+
if (has)
|
|
126
|
+
return fn(_disc_payload(value, key));
|
|
127
|
+
return fn(value);
|
|
128
|
+
},
|
|
129
|
+
is(v) {
|
|
130
|
+
return tag === v;
|
|
131
|
+
},
|
|
132
|
+
not(v) {
|
|
133
|
+
return tag !== v;
|
|
134
|
+
},
|
|
135
|
+
in(arr) {
|
|
136
|
+
return tag != null ? arr.includes(tag) : false;
|
|
137
|
+
},
|
|
138
|
+
not_in(arr) {
|
|
139
|
+
return !this.in(arr);
|
|
140
|
+
},
|
|
141
|
+
into() {
|
|
142
|
+
const self = this;
|
|
143
|
+
return function (fn) {
|
|
144
|
+
if (self.tag == null)
|
|
145
|
+
return null;
|
|
146
|
+
return fn(_disc_payload(self.value, self.key));
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
catch(...arr_branch) {
|
|
150
|
+
const self = this;
|
|
151
|
+
return function (fn) {
|
|
152
|
+
if (self.tag == null)
|
|
153
|
+
return null;
|
|
154
|
+
if (!arr_branch.includes(self.tag))
|
|
155
|
+
return null;
|
|
156
|
+
return fn(_disc_payload(self.value, self.key));
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
94
161
|
function matchableObj(value) {
|
|
95
162
|
return {
|
|
96
163
|
__recognizer__: "object",
|
|
97
164
|
value,
|
|
98
165
|
into() {
|
|
99
|
-
return (fn) =>
|
|
100
|
-
return fn(value);
|
|
101
|
-
};
|
|
166
|
+
return (fn) => fn(value);
|
|
102
167
|
},
|
|
103
168
|
catch(...keys) {
|
|
104
169
|
return (fn) => {
|
|
105
|
-
if (keys.some((k) =>
|
|
170
|
+
if (keys.some((k) => value[k] == null))
|
|
106
171
|
return null;
|
|
107
172
|
const picked = {};
|
|
108
173
|
for (const k of keys)
|
|
@@ -110,16 +175,26 @@ function matchableObj(value) {
|
|
|
110
175
|
return fn(picked);
|
|
111
176
|
};
|
|
112
177
|
},
|
|
178
|
+
as(key) {
|
|
179
|
+
return matchableDisc(value, key);
|
|
180
|
+
},
|
|
181
|
+
match(key, handlers) {
|
|
182
|
+
return matchableDisc(value, key).match(handlers);
|
|
183
|
+
},
|
|
113
184
|
};
|
|
114
185
|
}
|
|
115
186
|
export function me(value) {
|
|
116
187
|
if (value == null)
|
|
117
188
|
return emptyMatchable;
|
|
118
|
-
if (["string", "number", "boolean"].includes(typeof value))
|
|
189
|
+
if (["string", "number", "boolean"].includes(typeof value)) {
|
|
119
190
|
return matchableEnum(value);
|
|
120
|
-
|
|
121
|
-
|
|
191
|
+
}
|
|
192
|
+
// 默认仅 Rust-enum 风格:单键对象且键名以大写字母开头 => { Variant: payload }
|
|
193
|
+
// 其他对象一律按普通对象处理;discriminated-union 必须显式传 key。
|
|
194
|
+
const keys = Object.keys(value);
|
|
195
|
+
const key = keys[0];
|
|
196
|
+
if (keys.length === 1 && key != null && /^[A-Z]/.test(key)) {
|
|
122
197
|
return matchableUnion(value);
|
|
123
|
-
|
|
198
|
+
}
|
|
124
199
|
return matchableObj(value);
|
|
125
200
|
}
|