@semyonf/kamchazky 0.2.0

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.
@@ -0,0 +1,340 @@
1
+ /** A successful result containing a value of type `T`. */
2
+ type OkResult<T> = {
3
+ readonly ok: true;
4
+ readonly value: T;
5
+ map<U>(fn: (value: T) => U): OkResult<U>;
6
+ flatMap<U, F extends Error = never>(fn: (value: T) => Result<U, F>): Result<U, F>;
7
+ mapError<F extends Error>(fn: (error: never) => F): OkResult<T>;
8
+ inspect(fn: (value: T) => void): OkResult<T>;
9
+ inspectError(fn: (error: never) => void): OkResult<T>;
10
+ match<R>(handlers: {
11
+ ok: (value: T) => R;
12
+ err: (error: never) => R;
13
+ }): R;
14
+ unwrap(): T;
15
+ unwrapOr(fallback: T): T;
16
+ unwrapOrElse(fn: () => T): T;
17
+ expect(message: string): T;
18
+ };
19
+ /** A failed result containing an error of type `E`. */
20
+ type ErrResult<E extends Error = Error> = {
21
+ readonly ok: false;
22
+ readonly error: E;
23
+ map<U>(fn: (value: never) => U): ErrResult<E>;
24
+ flatMap<U, F extends Error = never>(fn: (value: never) => Result<U, F>): ErrResult<E>;
25
+ mapError<F extends Error>(fn: (error: E) => F): ErrResult<F>;
26
+ inspect(fn: (value: never) => void): ErrResult<E>;
27
+ inspectError(fn: (error: E) => void): ErrResult<E>;
28
+ match<R>(handlers: {
29
+ ok: (value: never) => R;
30
+ err: (error: E) => R;
31
+ }): R;
32
+ unwrap(): never;
33
+ unwrapOr<T>(fallback: T): T;
34
+ unwrapOrElse<T>(fn: () => T): T;
35
+ expect(message: string): never;
36
+ };
37
+ type AnyResult = Result<unknown, Error>;
38
+ type ValueOf<R> = R extends OkResult<infer T> ? T : never;
39
+ type ErrorOf<R> = R extends ErrResult<infer E> ? E : never;
40
+ type TupleValues<R extends readonly AnyResult[]> = {
41
+ [K in keyof R]: ValueOf<R[K]>;
42
+ };
43
+ type TupleErrors<R extends readonly AnyResult[]> = ErrorOf<R[number]>;
44
+ /** Create a successful `Result` containing `value`. */
45
+ declare function ok<T>(value: T): OkResult<T>;
46
+ /** Create a failed `Result` containing `error`. */
47
+ declare function err<E extends Error>(error: E): ErrResult<E>;
48
+ /** Narrow a `Result` to `OkResult`. */
49
+ declare function isOk<T, E extends Error>(result: Result<T, E>): result is OkResult<T>;
50
+ /** Narrow a `Result` to `ErrResult`. */
51
+ declare function isErr<T, E extends Error>(result: Result<T, E>): result is ErrResult<E>;
52
+ /** Transform the value inside an `Ok`, leaving `Err` unchanged. */
53
+ declare function map<T, U>(result: OkResult<T>, fn: (value: T) => U): OkResult<U>;
54
+ declare function map<T, U, E extends Error>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;
55
+ /** Transform the error inside an `Err`, leaving `Ok` unchanged. */
56
+ declare function mapError<T>(result: OkResult<T>, fn: (error: never) => Error): OkResult<T>;
57
+ declare function mapError<T, E extends Error, F extends Error>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;
58
+ /** Run a side-effect on the `Ok` value without transforming the result. */
59
+ declare function inspect<T>(result: OkResult<T>, fn: (value: T) => void): OkResult<T>;
60
+ declare function inspect<T, E extends Error>(result: Result<T, E>, fn: (value: T) => void): Result<T, E>;
61
+ /** Run a side-effect on the `Err` error without transforming the result. */
62
+ declare function inspectError<E extends Error>(result: ErrResult<E>, fn: (error: E) => void): ErrResult<E>;
63
+ declare function inspectError<T, E extends Error>(result: Result<T, E>, fn: (error: E) => void): Result<T, E>;
64
+ /** Chain a `Result`-returning function on the `Ok` value. */
65
+ declare function flatMap<T, U, E extends Error, F extends Error = never>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F>;
66
+ /**
67
+ * Recover from an error by applying `fn` to produce a new `Result`.
68
+ * Alias: `flatMapErr`.
69
+ */
70
+ declare function orElse<T, E extends Error, F extends Error>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F>;
71
+ /**
72
+ * Recover from an error by applying `fn` to produce a new `Result`.
73
+ * Alias for `orElse`.
74
+ */
75
+ declare function flatMapErr<T, E extends Error, F extends Error>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F>;
76
+ /** Flatten a nested `Result<Result<T, E>, F>` into `Result<T, E | F>`. */
77
+ declare function flatten<T, E extends Error, F extends Error>(result: Result<Result<T, E>, F>): Result<T, E | F>;
78
+ /** Exhaustively handle both `Ok` and `Err` branches, returning `R`. */
79
+ declare function match<T, E extends Error, R>(result: Result<T, E>, handlers: {
80
+ ok: (value: T) => R;
81
+ err: (error: E) => R;
82
+ }): R;
83
+ /** Compile-time exhaustiveness guard — only accepts `never`. */
84
+ declare function exhaustive(value: never): never;
85
+ /** Return the `Ok` value or throw the contained error. */
86
+ declare function unwrap<T, E extends Error>(result: Result<T, E>): T;
87
+ /**
88
+ * Return the `Ok` value or `fallback`.
89
+ *
90
+ * The fallback must be the same type `T` as the success value. This is
91
+ * intentional — use `match` when you need a different return type.
92
+ */
93
+ declare function unwrapOr<T, E extends Error>(result: Result<T, E>, fallback: T): T;
94
+ /** Return the `Ok` value, or compute a fallback from `fn`. */
95
+ declare function unwrapOrElse<T, E extends Error>(result: Result<T, E>, fn: () => T): T;
96
+ /** Return the `Ok` value or throw with a custom `message`. */
97
+ declare function expect<T, E extends Error>(result: Result<T, E>, message: string): T;
98
+ /** Convert a nullable value to a `Result`. */
99
+ declare function fromNullable<T, E extends Error>(value: T | null | undefined, errorFactory: () => E): Result<NonNullable<T>, E>;
100
+ /** Convert a predicate check to a `Result`. Supports type-guard predicates. */
101
+ declare function fromPredicate<T, S extends T, E extends Error>(value: T, predicate: (value: T) => value is S, errorFactory: () => E): Result<S, E>;
102
+ declare function fromPredicate<T, E extends Error>(value: T, predicate: (value: T) => boolean, errorFactory: () => E): Result<T, E>;
103
+ /** Convert an unknown thrown value to an `Error` instance. */
104
+ declare function normalizeError(error: unknown): Error;
105
+ /** Wrap a synchronous function that may throw into a `Result`. */
106
+ declare function tryCatch<T>(fn: () => T): Result<T, Error>;
107
+ declare function tryCatch<T, E extends Error>(fn: () => T, onError: (error: unknown) => E): Result<T, E>;
108
+ /** Wrap an asynchronous function that may reject into a `Result`. */
109
+ declare function tryCatchAsync<T>(fn: () => Promise<T>): Promise<Result<T, Error>>;
110
+ declare function tryCatchAsync<T, E extends Error>(fn: () => Promise<T>, onError: (error: unknown) => E): Promise<Result<T, E>>;
111
+ /** Wrap a `Promise` that may reject into a `Result`. */
112
+ declare function fromPromise<T>(promise: Promise<T>): Promise<Result<T, Error>>;
113
+ declare function fromPromise<T, E extends Error>(promise: Promise<T>, onError: (error: unknown) => E): Promise<Result<T, E>>;
114
+ /**
115
+ * Combine multiple `Result`s into a single `Result` containing a tuple of
116
+ * values. Returns the first `Err` encountered (fail-fast).
117
+ *
118
+ * Pass results as individual arguments — spreading an array loses tuple
119
+ * inference and degrades value types to `unknown[]`.
120
+ */
121
+ declare function all<const R extends readonly AnyResult[]>(...results: R): Result<TupleValues<R>, TupleErrors<R>>;
122
+ /**
123
+ * Like `all`, but accepts promises of `Result`s. All promises are resolved
124
+ * concurrently via `Promise.allSettled` before checking for errors.
125
+ *
126
+ * Promises are expected to resolve to `Result`s — not reject. If a promise
127
+ * does reject, the rejection is caught and wrapped as an `Err`.
128
+ *
129
+ * @breaking v0.2 — Uses `Promise.allSettled` instead of `Promise.all`. All
130
+ * promises are now always awaited to completion; the first error found during
131
+ * iteration is returned.
132
+ */
133
+ declare function allAsync<const R extends readonly Promise<AnyResult>[]>(...promises: R): Promise<Result<{
134
+ [K in keyof R]: ValueOf<Awaited<R[K]>>;
135
+ }, ErrorOf<Awaited<R[number]>> | Error>>;
136
+ /**
137
+ * Like `collect`, but for promises of `Result`s. Resolves all promises
138
+ * via `Promise.allSettled`, then collects all errors. Returns an
139
+ * `AggregateError` containing every error found.
140
+ */
141
+ declare function collectAsync<const R extends readonly Promise<AnyResult>[]>(...promises: R): Promise<Result<{
142
+ [K in keyof R]: ValueOf<Awaited<R[K]>>;
143
+ }, AggregateError>>;
144
+ /**
145
+ * Combine multiple `Result`s, collecting **all** errors instead of
146
+ * short-circuiting on the first one. Returns an `AggregateError` whose
147
+ * `.errors` array contains every individual error.
148
+ */
149
+ declare function collect<const R extends readonly AnyResult[]>(...results: R): Result<TupleValues<R>, AggregateError>;
150
+ /** A `Maybe` that contains a value of type `T`. */
151
+ type Some<T> = {
152
+ readonly some: true;
153
+ readonly value: T;
154
+ map<U>(fn: (value: T) => U): Some<U>;
155
+ flatMap<U>(fn: (value: T) => Maybe<U>): Maybe<U>;
156
+ filter(predicate: (value: T) => boolean): Maybe<T>;
157
+ inspect(fn: (value: T) => void): Some<T>;
158
+ match<R>(handlers: {
159
+ some: (value: T) => R;
160
+ none: () => R;
161
+ }): R;
162
+ unwrap(): T;
163
+ expect(message: string): T;
164
+ unwrapOr(fallback: T): T;
165
+ unwrapOrElse(fn: () => T): T;
166
+ };
167
+ /** A `Maybe` that contains no value. */
168
+ type None = {
169
+ readonly some: false;
170
+ map<U>(fn: (value: never) => U): None;
171
+ flatMap<U>(fn: (value: never) => Maybe<U>): None;
172
+ filter(predicate: (value: never) => boolean): None;
173
+ inspect(fn: (value: never) => void): None;
174
+ match<R>(handlers: {
175
+ some: (value: never) => R;
176
+ none: () => R;
177
+ }): R;
178
+ unwrap(): never;
179
+ expect(message: string): never;
180
+ unwrapOr<T>(fallback: T): T;
181
+ unwrapOrElse<T>(fn: () => T): T;
182
+ };
183
+ type AnyMaybe = Maybe<unknown>;
184
+ type MaybeValueOf<M> = M extends Some<infer T> ? T : never;
185
+ type TupleMaybeValues<M extends readonly AnyMaybe[]> = {
186
+ [K in keyof M]: MaybeValueOf<M[K]>;
187
+ };
188
+ /** Create a `Maybe` containing `value`. */
189
+ declare function some<T>(value: T): Some<T>;
190
+ /** Create an empty `Maybe`. */
191
+ declare function none(): None;
192
+ /** Narrow a `Maybe` to `Some`. */
193
+ declare function isSome<T>(maybe: Maybe<T>): maybe is Some<T>;
194
+ /** Narrow a `Maybe` to `None`. */
195
+ declare function isNone<T>(maybe: Maybe<T>): maybe is None;
196
+ /** Transform the value inside a `Some`, leaving `None` unchanged. */
197
+ declare function maybeMap<T, U>(maybe: Some<T>, fn: (value: T) => U): Some<U>;
198
+ declare function maybeMap<T, U>(maybe: Maybe<T>, fn: (value: T) => U): Maybe<U>;
199
+ /** Chain a `Maybe`-returning function on the `Some` value. */
200
+ declare function maybeFlatMap<T, U>(maybe: Maybe<T>, fn: (value: T) => Maybe<U>): Maybe<U>;
201
+ /** Flatten a nested `Maybe<Maybe<T>>` into `Maybe<T>`. */
202
+ declare function maybeFlatten<T>(maybe: Maybe<Maybe<T>>): Maybe<T>;
203
+ /** Keep the `Some` value only if `predicate` returns true. */
204
+ declare function maybeFilter<T, S extends T>(maybe: Maybe<T>, predicate: (value: T) => value is S): Maybe<S>;
205
+ declare function maybeFilter<T>(maybe: Maybe<T>, predicate: (value: T) => boolean): Maybe<T>;
206
+ /** Run a side-effect on the `Some` value without transforming the maybe. */
207
+ declare function maybeInspect<T>(maybe: Some<T>, fn: (value: T) => void): Some<T>;
208
+ declare function maybeInspect<T>(maybe: Maybe<T>, fn: (value: T) => void): Maybe<T>;
209
+ /** Exhaustively handle both `Some` and `None` branches, returning `R`. */
210
+ declare function maybeMatch<T, R>(maybe: Maybe<T>, handlers: {
211
+ some: (value: T) => R;
212
+ none: () => R;
213
+ }): R;
214
+ /** Return the `Some` value or throw. */
215
+ declare function maybeUnwrap<T>(maybe: Maybe<T>): T;
216
+ /**
217
+ * Return the `Some` value or `fallback`.
218
+ *
219
+ * The fallback must be the same type `T` as the contained value. This is
220
+ * intentional — use `match` when you need a different return type.
221
+ */
222
+ declare function maybeUnwrapOr<T>(maybe: Maybe<T>, fallback: T): T;
223
+ /** Return the `Some` value, or compute a fallback from `fn`. */
224
+ declare function maybeUnwrapOrElse<T>(maybe: Maybe<T>, fn: () => T): T;
225
+ /** Return the `Some` value or throw with a custom `message`. */
226
+ declare function maybeExpect<T>(maybe: Maybe<T>, message: string): T;
227
+ /** Convert a nullable value to a `Maybe`. */
228
+ declare function maybeFromNullable<T>(value: T | null | undefined): Maybe<NonNullable<T>>;
229
+ /** Convert a predicate check to a `Maybe`. Supports type-guard predicates. */
230
+ declare function maybeFromPredicate<T, S extends T>(value: T, predicate: (value: T) => value is S): Maybe<S>;
231
+ declare function maybeFromPredicate<T>(value: T, predicate: (value: T) => boolean): Maybe<T>;
232
+ /**
233
+ * Combine multiple `Maybe`s into a single `Maybe` containing a tuple of
234
+ * values. Returns `None` if any input is `None` (fail-fast).
235
+ *
236
+ * Pass maybes as individual arguments — spreading an array loses tuple
237
+ * inference and degrades value types to `unknown[]`.
238
+ */
239
+ declare function maybeAll<const M extends readonly AnyMaybe[]>(...maybes: M): Maybe<TupleMaybeValues<M>>;
240
+ /** Return the first `Some` found, or `None` if all are `None`. */
241
+ declare function maybeFirstSome<T>(...maybes: Maybe<T>[]): Maybe<T>;
242
+ /** Like `all`, but for promises of `Maybe`s. Resolves all promises
243
+ * concurrently via `Promise.allSettled`. */
244
+ declare function maybeAllAsync<const M extends readonly Promise<AnyMaybe>[]>(...promises: M): Promise<Maybe<{
245
+ [K in keyof M]: MaybeValueOf<Awaited<M[K]>>;
246
+ }>>;
247
+ /** Convert a `Maybe` to a `Result`, calling `errorFactory` only when `None`.
248
+ *
249
+ * @breaking v0.2 — The second argument changed from `error: E` to
250
+ * `errorFactory: () => E`. The factory is only called when the Maybe is
251
+ * None, avoiding unnecessary error construction for Some.
252
+ */
253
+ declare function maybeToResult<T, E extends Error>(maybe: Maybe<T>, errorFactory: () => E): Result<T, E>;
254
+ /** Convert a `Result` to a `Maybe`, discarding the error. */
255
+ declare function maybeFromResult<T, E extends Error>(result: Result<T, E>): Maybe<T>;
256
+ /** Convert a `Result` to a `Maybe`, discarding the error. */
257
+ declare function resultToMaybe<T, E extends Error>(result: Result<T, E>): Maybe<T>;
258
+ /** Convert a `Maybe` to a `Result`, calling `errorFactory` only when `None`.
259
+ * Alias for `maybeToResult`.
260
+ *
261
+ * @breaking v0.2 — The second argument changed from `error: E` to
262
+ * `errorFactory: () => E`.
263
+ */
264
+ declare function resultFromMaybe<T, E extends Error>(maybe: Maybe<T>, errorFactory: () => E): Result<T, E>;
265
+ /** Convert a `Result<Maybe<T>, E>` to `Maybe<Result<T, E>>`. */
266
+ declare function resultTranspose<T, E extends Error>(result: Result<Maybe<T>, E>): Maybe<Result<T, E>>;
267
+ /** Convert a `Maybe<Result<T, E>>` to `Result<Maybe<T>, E>`. */
268
+ declare function maybeTranspose<T, E extends Error>(maybe: Maybe<Result<T, E>>): Result<Maybe<T>, E>;
269
+ /**
270
+ * A value that is either present (`Some<T>`) or absent (`None`).
271
+ * Use `Maybe.some` / `Maybe.none` to construct, and the companion `Maybe.*`
272
+ * functions or instance methods to transform.
273
+ */
274
+ type Maybe<T> = Some<T> | None;
275
+ declare const Maybe: {
276
+ readonly some: typeof some;
277
+ readonly none: typeof none;
278
+ readonly isSome: typeof isSome;
279
+ readonly isNone: typeof isNone;
280
+ readonly map: typeof maybeMap;
281
+ readonly flatMap: typeof maybeFlatMap;
282
+ readonly flatten: typeof maybeFlatten;
283
+ readonly filter: typeof maybeFilter;
284
+ readonly inspect: typeof maybeInspect;
285
+ readonly match: typeof maybeMatch;
286
+ readonly unwrap: typeof maybeUnwrap;
287
+ readonly unwrapOr: typeof maybeUnwrapOr;
288
+ readonly unwrapOrElse: typeof maybeUnwrapOrElse;
289
+ readonly expect: typeof maybeExpect;
290
+ readonly fromNullable: typeof maybeFromNullable;
291
+ readonly fromPredicate: typeof maybeFromPredicate;
292
+ readonly all: typeof maybeAll;
293
+ readonly allAsync: typeof maybeAllAsync;
294
+ readonly collect: typeof maybeAll;
295
+ readonly firstSome: typeof maybeFirstSome;
296
+ readonly toResult: typeof maybeToResult;
297
+ readonly fromResult: typeof maybeFromResult;
298
+ readonly transpose: typeof maybeTranspose;
299
+ };
300
+ /**
301
+ * A value that is either a success (`OkResult<T>`) or a failure
302
+ * (`ErrResult<E>`). Use `Result.ok` / `Result.err` to construct, and the
303
+ * companion `Result.*` functions or instance methods to transform.
304
+ */
305
+ type Result<T, E extends Error = Error> = OkResult<T> | ErrResult<E>;
306
+ declare const Result: {
307
+ readonly ok: typeof ok;
308
+ readonly err: typeof err;
309
+ readonly isOk: typeof isOk;
310
+ readonly isErr: typeof isErr;
311
+ readonly map: typeof map;
312
+ readonly mapError: typeof mapError;
313
+ readonly inspect: typeof inspect;
314
+ readonly inspectError: typeof inspectError;
315
+ readonly flatMap: typeof flatMap;
316
+ readonly flatMapErr: typeof flatMapErr;
317
+ readonly orElse: typeof orElse;
318
+ readonly flatten: typeof flatten;
319
+ readonly match: typeof match;
320
+ readonly exhaustive: typeof exhaustive;
321
+ readonly unwrap: typeof unwrap;
322
+ readonly unwrapOr: typeof unwrapOr;
323
+ readonly unwrapOrElse: typeof unwrapOrElse;
324
+ readonly expect: typeof expect;
325
+ readonly fromNullable: typeof fromNullable;
326
+ readonly fromPredicate: typeof fromPredicate;
327
+ readonly normalizeError: typeof normalizeError;
328
+ readonly tryCatch: typeof tryCatch;
329
+ readonly tryCatchAsync: typeof tryCatchAsync;
330
+ readonly fromPromise: typeof fromPromise;
331
+ readonly all: typeof all;
332
+ readonly allAsync: typeof allAsync;
333
+ readonly collect: typeof collect;
334
+ readonly collectAsync: typeof collectAsync;
335
+ readonly toMaybe: typeof resultToMaybe;
336
+ readonly fromMaybe: typeof resultFromMaybe;
337
+ readonly transpose: typeof resultTranspose;
338
+ };
339
+
340
+ export { type ErrResult, Maybe, type None, type OkResult, Result, type Some, err, isErr, isNone, isOk, isSome, none, normalizeError, ok, some };