skyr 0.1.2 → 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.
package/dist/index.js CHANGED
@@ -1,478 +1,3 @@
1
- //#region src/result.ts
2
- var Ok = class Ok {
3
- _tag = "Ok";
4
- constructor(value) {
5
- this.value = value;
6
- }
7
- map(fn$1) {
8
- const result = fn$1(this.value);
9
- if (result instanceof Ok || result instanceof Fail) return result;
10
- if (result instanceof AsyncResult) return result;
11
- if (result instanceof Promise) return new AsyncResult(result.then((v) => new Ok(v)).catch((err) => new Fail(createUnknownFailure(err))));
12
- return new Ok(result);
13
- }
14
- mapFailure(_fnOrHandlers) {
15
- return this;
16
- }
17
- inspect(fn$1) {
18
- fn$1(this.value);
19
- return this;
20
- }
21
- inspectFailure(_fn) {
22
- return this;
23
- }
24
- unwrap() {
25
- return this.value;
26
- }
27
- unwrapOr(_defaultValue) {
28
- return this.value;
29
- }
30
- expect(_message) {
31
- return this.value;
32
- }
33
- match(handlers) {
34
- return handlers.ok(this.value);
35
- }
36
- isOk() {
37
- return true;
38
- }
39
- hasFailed() {
40
- return false;
41
- }
42
- *[Symbol.iterator]() {
43
- return this.value;
44
- }
45
- };
46
- var Fail = class Fail {
47
- _tag = "Fail";
48
- constructor(failure$1) {
49
- this.failure = failure$1;
50
- }
51
- map(_fn) {
52
- return this;
53
- }
54
- mapFailure(fnOrHandlers) {
55
- if (typeof fnOrHandlers === "object" && fnOrHandlers !== null) {
56
- const handlers = fnOrHandlers;
57
- const failure$1 = this.failure;
58
- if (failure$1 && typeof failure$1 === "object" && "code" in failure$1) {
59
- const handler = handlers[failure$1.code];
60
- if (handler) {
61
- const result$1 = handler(failure$1);
62
- if (result$1 instanceof Ok || result$1 instanceof Fail) return result$1;
63
- if (result$1 instanceof AsyncResult) return result$1;
64
- if (result$1 instanceof Promise) return new AsyncResult(result$1.then((f) => new Fail(f)).catch((err) => new Fail(createUnknownFailure(err))));
65
- return new Fail(result$1);
66
- }
67
- }
68
- return this;
69
- }
70
- const result = fnOrHandlers(this.failure);
71
- if (result instanceof Ok || result instanceof Fail) return result;
72
- if (result instanceof AsyncResult) return result;
73
- if (result instanceof Promise) return new AsyncResult(result.then((f) => new Fail(f)).catch((err) => new Fail(createUnknownFailure(err))));
74
- return new Fail(result);
75
- }
76
- inspect(_fn) {
77
- return this;
78
- }
79
- inspectFailure(fn$1) {
80
- fn$1(this.failure);
81
- return this;
82
- }
83
- unwrap() {
84
- return this.failure;
85
- }
86
- unwrapOr(defaultValue) {
87
- return defaultValue;
88
- }
89
- expect(message) {
90
- throw new globalThis.Error(`${message}: ${JSON.stringify(this.failure)}`);
91
- }
92
- match(handlers) {
93
- return handlers.failed(this.failure);
94
- }
95
- isOk() {
96
- return false;
97
- }
98
- hasFailed() {
99
- return true;
100
- }
101
- *[Symbol.iterator]() {
102
- yield this;
103
- return this;
104
- }
105
- };
106
- /**
107
- * AsyncResult wraps a Promise<Result<T, E>> and implements PromiseLike
108
- * Allows chaining with .map/.mapFailure before awaiting
109
- */
110
- var AsyncResult = class AsyncResult {
111
- constructor(promise) {
112
- this.promise = promise;
113
- }
114
- then(onfulfilled, onrejected) {
115
- return this.promise.then(onfulfilled, onrejected);
116
- }
117
- map(fn$1) {
118
- return new AsyncResult(this.promise.then(async (result) => {
119
- if (!result.isOk()) return result;
120
- const mapped = fn$1(result.value);
121
- if (mapped instanceof Ok || mapped instanceof Fail) return mapped;
122
- if (mapped instanceof AsyncResult) return await mapped;
123
- if (mapped instanceof Promise) try {
124
- return new Ok(await mapped);
125
- } catch (err) {
126
- return new Fail(createUnknownFailure(err));
127
- }
128
- return new Ok(mapped);
129
- }));
130
- }
131
- mapFailure(fnOrHandlers) {
132
- return new AsyncResult(this.promise.then(async (result) => {
133
- if (!result.hasFailed()) return result;
134
- if (typeof fnOrHandlers === "object" && fnOrHandlers !== null && typeof fnOrHandlers !== "function") {
135
- const handlers = fnOrHandlers;
136
- const failure$1 = result.failure;
137
- if (failure$1 && typeof failure$1 === "object" && "code" in failure$1) {
138
- const handler = handlers[failure$1.code];
139
- if (handler) {
140
- const mapped$1 = handler(failure$1);
141
- if (mapped$1 instanceof Ok || mapped$1 instanceof Fail) return mapped$1;
142
- if (mapped$1 instanceof AsyncResult) return await mapped$1;
143
- if (mapped$1 instanceof Promise) try {
144
- return new Fail(await mapped$1);
145
- } catch (err) {
146
- return new Fail(createUnknownFailure(err));
147
- }
148
- return new Fail(mapped$1);
149
- }
150
- }
151
- return result;
152
- }
153
- const mapped = fnOrHandlers(result.failure);
154
- if (mapped instanceof Ok || mapped instanceof Fail) return mapped;
155
- if (mapped instanceof AsyncResult) return await mapped;
156
- if (mapped instanceof Promise) try {
157
- return new Fail(await mapped);
158
- } catch (err) {
159
- return new Fail(createUnknownFailure(err));
160
- }
161
- return new Fail(mapped);
162
- }));
163
- }
164
- inspect(fn$1) {
165
- return new AsyncResult(this.promise.then((result) => {
166
- if (result.isOk()) fn$1(result.value);
167
- return result;
168
- }));
169
- }
170
- inspectFailure(fn$1) {
171
- return new AsyncResult(this.promise.then((result) => {
172
- if (result.hasFailed()) fn$1(result.failure);
173
- return result;
174
- }));
175
- }
176
- async unwrap() {
177
- return (await this.promise).unwrap();
178
- }
179
- async unwrapOr(defaultValue) {
180
- return (await this.promise).unwrapOr(defaultValue);
181
- }
182
- async expect(message) {
183
- return (await this.promise).expect(message);
184
- }
185
- async match(handlers) {
186
- return (await this.promise).match(handlers);
187
- }
188
- async isOk() {
189
- return (await this.promise).isOk();
190
- }
191
- async hasFailed() {
192
- return (await this.promise).hasFailed();
193
- }
194
- *[Symbol.iterator]() {
195
- return yield this;
196
- }
197
- };
198
- /**
199
- * Create a successful Result
200
- */
201
- function ok(value) {
202
- return new Ok(value);
203
- }
204
- /**
205
- * Create a structured failure
206
- */
207
- function failure(code, message, cause) {
208
- return {
209
- code,
210
- message,
211
- cause
212
- };
213
- }
214
- function fail(code, message, cause) {
215
- if (message === void 0) return (msg, c) => {
216
- return new Fail(failure(code, msg, c));
217
- };
218
- return new Fail(failure(code, message, cause));
219
- }
220
- /**
221
- * Reusable factory for unknown failures
222
- */
223
- const UnknownFailure = fail("UNKNOWN_FAILURE");
224
- /**
225
- * Convert unknown error to structured Failure
226
- */
227
- function createUnknownFailure(err) {
228
- return failure("UNKNOWN_FAILURE", err instanceof globalThis.Error ? err.message : String(err), err);
229
- }
230
- function fromThrowable(fnOrPromise, failureMapper = createUnknownFailure) {
231
- if (fnOrPromise instanceof Promise) return new AsyncResult(fnOrPromise.then((value) => new Ok(value)).catch((error) => new Fail(failureMapper(error))));
232
- try {
233
- const result = fnOrPromise();
234
- if (result instanceof Promise) return new AsyncResult(result.then((value) => new Ok(value)).catch((error) => new Fail(failureMapper(error))));
235
- return new Ok(result);
236
- } catch (error) {
237
- return new Fail(failureMapper(error));
238
- }
239
- }
240
- function wrapThrowable(fn$1, failureMapper) {
241
- return (...args) => fromThrowable(() => fn$1(...args), failureMapper);
242
- }
243
- /**
244
- * Check if value is a Fail result
245
- */
246
- function hasFailed(value) {
247
- return value != null && typeof value === "object" && "_tag" in value && value._tag === "Fail";
248
- }
249
- /**
250
- * Check if value is an Ok result
251
- */
252
- function isOk(value) {
253
- return value != null && typeof value === "object" && "_tag" in value && value._tag === "Ok";
254
- }
255
- /**
256
- * Check if value is any Result (Ok or Fail)
257
- */
258
- function isResult(value) {
259
- return isOk(value) || hasFailed(value);
260
- }
261
-
262
- //#endregion
263
- //#region src/di.ts
264
- const DEPENDENCY_SYMBOL = Symbol("dependency");
265
- /**
266
- * Dependency - declares a dependency requirement
267
- * Example: const LoggerService = fn.dependency<Logger>()("logger")
268
- */
269
- var Dependency = class {
270
- constructor(key) {
271
- this.key = key;
272
- }
273
- /**
274
- * Create an implementation binding for this dependency
275
- * Example: LoggerService.impl(myLogger)
276
- */
277
- impl(value) {
278
- return new DependencyImpl(this.key, value);
279
- }
280
- };
281
- /**
282
- * DependencyImpl - binds a value to a dependency key
283
- * Created by Dependency.impl() and used in .inject()
284
- */
285
- var DependencyImpl = class {
286
- constructor(key, value) {
287
- this.key = key;
288
- this.value = value;
289
- }
290
- };
291
- /**
292
- * DependencyDeclaration - yielded in generators to request a dependency
293
- * Created by fn.require(dependency)
294
- */
295
- var DependencyDeclaration = class {
296
- _tag = DEPENDENCY_SYMBOL;
297
- constructor(key) {
298
- this.key = key;
299
- }
300
- *[Symbol.iterator]() {
301
- return yield this;
302
- }
303
- };
304
- function isDependencyDeclaration(value) {
305
- return value != null && typeof value === "object" && "_tag" in value && value._tag === DEPENDENCY_SYMBOL;
306
- }
307
- function isDependentGenerator(value) {
308
- return value != null && typeof value === "object" && "_tag" in value && value._tag === "DependentGenerator";
309
- }
310
- /**
311
- * Resolve a dependency and continue generator execution
312
- */
313
- function resolveDependency(decl, deps, gen) {
314
- if (!(decl.key in deps)) throw new Error(`Missing dependency: ${decl.key}`);
315
- return gen.next(deps[decl.key]);
316
- }
317
- /**
318
- * Run a generator synchronously until it completes or needs to go async
319
- * Handles:
320
- * - Dependency resolution (yield* fn.require(...))
321
- * - Result unwrapping (yield* ok(...) / yield* fail(...))
322
- * - Nested function calls (yield* child.yield(...))
323
- * - Async transition (yield* asyncResult / yield promise)
324
- */
325
- function runGenerator(generator, args, deps) {
326
- const gen = generator(...args);
327
- let result = gen.next();
328
- while (!result.done) {
329
- const yielded = result.value;
330
- if (isDependencyDeclaration(yielded)) {
331
- result = resolveDependency(yielded, deps, gen);
332
- continue;
333
- }
334
- if (isDependentGenerator(yielded)) {
335
- const childGen = yielded._generator;
336
- let childResult = childGen.next();
337
- while (!childResult.done) {
338
- const childYielded = childResult.value;
339
- if (isDependencyDeclaration(childYielded)) {
340
- childResult = resolveDependency(childYielded, deps, childGen);
341
- continue;
342
- }
343
- if (hasFailed(childYielded)) return childYielded;
344
- if (childYielded instanceof AsyncResult) return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
345
- if (childYielded instanceof Promise) return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
346
- childResult = childGen.next();
347
- }
348
- result = gen.next(childResult.value);
349
- continue;
350
- }
351
- if (hasFailed(yielded)) return yielded;
352
- if (yielded instanceof AsyncResult) return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
353
- if (yielded instanceof Promise) return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
354
- result = gen.next();
355
- }
356
- return isResult(result.value) ? result.value : new Ok(result.value);
357
- }
358
- /**
359
- * Run a generator asynchronously after encountering an async value
360
- * Continues where runGenerator left off
361
- */
362
- async function runGeneratorAsync(gen, firstAsyncValue, deps) {
363
- const asyncResult = firstAsyncValue instanceof AsyncResult ? await firstAsyncValue : await firstAsyncValue;
364
- if (hasFailed(asyncResult)) return asyncResult;
365
- const unwrappedValue = isOk(asyncResult) ? asyncResult.value : void 0;
366
- let result = gen.next(unwrappedValue);
367
- while (!result.done) {
368
- const yielded = result.value;
369
- if (isDependencyDeclaration(yielded)) {
370
- result = resolveDependency(yielded, deps, gen);
371
- continue;
372
- }
373
- if (hasFailed(yielded)) return yielded;
374
- if (yielded instanceof AsyncResult) {
375
- const asyncResult$1 = await yielded;
376
- if (hasFailed(asyncResult$1)) return asyncResult$1;
377
- const unwrappedValue$1 = isOk(asyncResult$1) ? asyncResult$1.value : void 0;
378
- result = gen.next(unwrappedValue$1);
379
- continue;
380
- }
381
- if (yielded instanceof Promise) {
382
- await yielded;
383
- result = gen.next();
384
- continue;
385
- }
386
- result = gen.next();
387
- }
388
- return isResult(result.value) ? result.value : new Ok(result.value);
389
- }
390
- /**
391
- * Create a Fn implementation with dependency injection support
392
- */
393
- function createFn(generator, injectedDeps = {}) {
394
- const fnObj = {
395
- _generator: generator,
396
- _injectedDeps: injectedDeps,
397
- _deps: {},
398
- inject(...impls) {
399
- const depsRecord = impls.reduce((acc, impl) => {
400
- acc[impl.key] = impl.value;
401
- return acc;
402
- }, {});
403
- return createFn(generator, {
404
- ...injectedDeps,
405
- ...depsRecord
406
- });
407
- },
408
- run(...args) {
409
- return runGenerator(generator, args, injectedDeps);
410
- },
411
- yield(...args) {
412
- const executeGen = function* () {
413
- const gen = generator(...args);
414
- let result = gen.next();
415
- while (!result.done) {
416
- const yielded = result.value;
417
- if (isDependencyDeclaration(yielded)) {
418
- if (!(yielded.key in injectedDeps)) {
419
- const depValue = yield yielded;
420
- result = gen.next(depValue);
421
- continue;
422
- }
423
- result = resolveDependency(yielded, injectedDeps, gen);
424
- continue;
425
- }
426
- yield yielded;
427
- result = gen.next();
428
- }
429
- const returnValue = result.value;
430
- if (isOk(returnValue)) return returnValue.value;
431
- return returnValue;
432
- };
433
- const instruction = {
434
- _tag: "DependentGenerator",
435
- _deps: {},
436
- _errors: {},
437
- _generator: executeGen(),
438
- *[Symbol.iterator]() {
439
- return yield instruction;
440
- }
441
- };
442
- return instruction;
443
- }
444
- };
445
- const callable = (...args) => fnObj.run(...args);
446
- callable.inject = fnObj.inject;
447
- callable.run = fnObj.run;
448
- callable.yield = fnObj.yield;
449
- callable._generator = fnObj._generator;
450
- callable._injectedDeps = fnObj._injectedDeps;
451
- callable._deps = fnObj._deps;
452
- return callable;
453
- }
454
- function fnImpl(fnOrGen) {
455
- if (fnOrGen.constructor && fnOrGen.constructor.name === "GeneratorFunction") return createFn(fnOrGen);
456
- return fnOrGen;
457
- }
458
- /**
459
- * Create a dependency key
460
- * Example: const LoggerService = fn.dependency<Logger>()("logger")
461
- */
462
- fnImpl.dependency = () => {
463
- return (key) => {
464
- return new Dependency(key);
465
- };
466
- };
467
- /**
468
- * Declare a dependency requirement
469
- * Example: const logger = yield* fn.require(LoggerService)
470
- */
471
- fnImpl.require = (dep) => {
472
- return new DependencyDeclaration(dep.key);
473
- };
474
- const fn = fnImpl;
475
-
476
- //#endregion
477
- export { UnknownFailure, fail, fn, fromThrowable, isResult, ok, wrapThrowable };
1
+ export { fn } from "./di.js";
2
+ export { fail, fromThrowable, isResult, ok, UnknownFailure, wrapThrowable, } from "./result.js";
478
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["value: T","fn","failure: E","failure","result","promise: Promise<Result<T, E>>","mapped","key: K","value: T","asyncResult","unwrappedValue","instruction: DependentGenerator<\n\t\t\t\tUnwrapResult<Return>,\n\t\t\t\tDeps,\n\t\t\t\tErrors\n\t\t\t>","callable: any"],"sources":["../src/result.ts","../src/di.ts"],"sourcesContent":["/**\n * Type-safe error handling with Result types\n * Inspired by Rust's Result<T, E>\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\n/**\n * Structured failure with code, message, and optional cause\n */\nexport type Failure<Code extends string> = {\n\tcode: Code;\n\tmessage: string;\n\tcause?: unknown;\n};\n\n/**\n * Result type - either success (Ok) or failure (Fail)\n */\nexport type Result<T, E> = Ok<T, E> | Fail<T, E>;\n\n// ============================================================================\n// Pattern Matching Type Helpers\n// ============================================================================\n\n/**\n * Extract code literals from a Failure union type\n * ExtractCodes<Failure<\"A\"> | Failure<\"B\">> = \"A\" | \"B\"\n */\nexport type ExtractCodes<E> = E extends Failure<infer Code> ? Code : never;\n\n/**\n * Handler map for pattern matching on failure codes\n * Provides autocomplete for available codes and narrows failure type per handler\n */\nexport type FailureHandlers<E> = {\n\t[K in ExtractCodes<E>]?: (failure: Extract<E, Failure<K>>) => any;\n};\n\n// ============================================================================\n// Ok Class - Represents Success\n// ============================================================================\n\nexport class Ok<T, E> {\n\treadonly _tag = \"Ok\" as const;\n\n\tconstructor(readonly value: T) {}\n\n\t// Transformation methods\n\tmap<U>(fn: (value: T) => U): Result<U, E>;\n\tmap<U>(\n\t\tfn: (value: T) => Promise<U>,\n\t): AsyncResult<U, E | Failure<\"UNKNOWN_FAILURE\">>;\n\tmap<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F>;\n\tmap<U, F>(fn: (value: T) => AsyncResult<U, F>): AsyncResult<U, E | F>;\n\tmap(fn: (value: T) => any): any {\n\t\tconst result = fn(this.value);\n\n\t\t// Handle Result types\n\t\tif (result instanceof Ok || result instanceof Fail) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Handle AsyncResult\n\t\tif (result instanceof AsyncResult) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Handle Promise\n\t\tif (result instanceof Promise) {\n\t\t\treturn new AsyncResult(\n\t\t\t\tresult\n\t\t\t\t\t.then((v) => new Ok(v))\n\t\t\t\t\t.catch((err) => new Fail(createUnknownFailure(err))),\n\t\t\t);\n\t\t}\n\n\t\t// Handle plain value\n\t\treturn new Ok(result);\n\t}\n\n\tmapFailure<F>(_fn: (failure: never) => F): Result<T, F>;\n\tmapFailure(_handlers: FailureHandlers<never>): Result<T, never>;\n\tmapFailure(_fnOrHandlers: any): any {\n\t\treturn this as any;\n\t}\n\n\t// Inspection methods (for side effects)\n\tinspect(fn: (value: T) => void): Result<T, E> {\n\t\tfn(this.value);\n\t\treturn this;\n\t}\n\n\tinspectFailure(_fn: (failure: never) => void): Result<T, E> {\n\t\treturn this;\n\t}\n\n\t// Unwrapping methods\n\tunwrap(): T {\n\t\treturn this.value;\n\t}\n\n\tunwrapOr<U>(_defaultValue: U): T | U {\n\t\treturn this.value;\n\t}\n\n\texpect(_message: string): T {\n\t\treturn this.value;\n\t}\n\n\t// Pattern matching\n\tmatch<U>(handlers: { ok: (value: T) => U; failed: (failure: E) => U }): U {\n\t\treturn handlers.ok(this.value);\n\t}\n\n\t// Type guards\n\tisOk(): this is Ok<T, E> {\n\t\treturn true;\n\t}\n\n\thasFailed(): this is Fail<T, E> {\n\t\treturn false;\n\t}\n\n\t// Generator support - allows `yield* ok(value)` to unwrap the value\n\t// deno-lint-ignore require-yield\n\t*[Symbol.iterator](): Generator<never, T, unknown> {\n\t\treturn this.value;\n\t}\n}\n\n// ============================================================================\n// Fail Class - Represents Failure\n// ============================================================================\n\nexport class Fail<T, E> {\n\treadonly _tag = \"Fail\" as const;\n\n\tconstructor(readonly failure: E) {}\n\n\t// Transformation methods\n\tmap<U>(_fn: (value: never) => U): Result<U, E> {\n\t\treturn this as any;\n\t}\n\n\tmapFailure<F>(fn: (failure: E) => F): Result<T, F>;\n\tmapFailure<F>(\n\t\tfn: (failure: E) => Promise<F>,\n\t): AsyncResult<T, F | Failure<\"UNKNOWN_FAILURE\">>;\n\tmapFailure<U, F>(fn: (failure: E) => Result<U, F>): Result<T | U, F>;\n\tmapFailure<U, F>(\n\t\tfn: (failure: E) => AsyncResult<U, F>,\n\t): AsyncResult<T | U, F>;\n\tmapFailure(handlers: FailureHandlers<E>): any;\n\tmapFailure(fnOrHandlers: ((failure: E) => any) | FailureHandlers<E>): any {\n\t\t// Handle pattern matching with handler map\n\t\tif (typeof fnOrHandlers === \"object\" && fnOrHandlers !== null) {\n\t\t\tconst handlers = fnOrHandlers as Record<string, (f: E) => any>;\n\t\t\tconst failure = this.failure as any;\n\n\t\t\t// Check if this failure has a code property and if there's a handler for it\n\t\t\tif (failure && typeof failure === \"object\" && \"code\" in failure) {\n\t\t\t\tconst handler = handlers[failure.code];\n\t\t\t\tif (handler) {\n\t\t\t\t\tconst result = handler(failure);\n\n\t\t\t\t\t// Apply same logic as function form\n\t\t\t\t\tif (result instanceof Ok || result instanceof Fail) {\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t\tif (result instanceof AsyncResult) {\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\treturn new AsyncResult(\n\t\t\t\t\t\t\tresult\n\t\t\t\t\t\t\t\t.then((f) => new Fail(f))\n\t\t\t\t\t\t\t\t.catch((err) => new Fail(createUnknownFailure(err))),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn new Fail(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No handler found, pass through unchanged\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle function form\n\t\tconst fn = fnOrHandlers as (failure: E) => any;\n\t\tconst result = fn(this.failure);\n\n\t\t// Handle Result types\n\t\tif (result instanceof Ok || result instanceof Fail) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Handle AsyncResult\n\t\tif (result instanceof AsyncResult) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// Handle Promise\n\t\tif (result instanceof Promise) {\n\t\t\treturn new AsyncResult(\n\t\t\t\tresult\n\t\t\t\t\t.then((f) => new Fail(f))\n\t\t\t\t\t.catch((err) => new Fail(createUnknownFailure(err))),\n\t\t\t);\n\t\t}\n\n\t\t// Handle plain failure value\n\t\treturn new Fail(result);\n\t}\n\n\t// Inspection methods\n\tinspect(_fn: (value: never) => void): Result<T, E> {\n\t\treturn this;\n\t}\n\n\tinspectFailure(fn: (failure: E) => void): Result<T, E> {\n\t\tfn(this.failure);\n\t\treturn this;\n\t}\n\n\t// Unwrapping methods\n\tunwrap(): E {\n\t\treturn this.failure;\n\t}\n\n\tunwrapOr<U>(defaultValue: U): T | U {\n\t\treturn defaultValue;\n\t}\n\n\texpect(message: string): never {\n\t\tthrow new globalThis.Error(`${message}: ${JSON.stringify(this.failure)}`);\n\t}\n\n\t// Pattern matching\n\tmatch<U>(handlers: { ok: (value: T) => U; failed: (failure: E) => U }): U {\n\t\treturn handlers.failed(this.failure);\n\t}\n\n\t// Type guards\n\tisOk(): this is Ok<T, E> {\n\t\treturn false;\n\t}\n\n\thasFailed(): this is Fail<T, E> {\n\t\treturn true;\n\t}\n\n\t// Generator support - allows `yield* fail(...)` to short-circuit\n\t*[Symbol.iterator](): Generator<Fail<never, E>, T> {\n\t\t// @ts-expect-error -- This is structurally equivalent and safe\n\t\tyield this;\n\t\t// @ts-expect-error -- This is structurally equivalent and safe\n\t\treturn this;\n\t}\n}\n\n// ============================================================================\n// AsyncResult - Wraps Promise<Result<T, E>>\n// ============================================================================\n\n/**\n * AsyncResult wraps a Promise<Result<T, E>> and implements PromiseLike\n * Allows chaining with .map/.mapFailure before awaiting\n */\nexport class AsyncResult<T, E> implements PromiseLike<Result<T, E>> {\n\tconstructor(private promise: Promise<Result<T, E>>) {}\n\n\t// PromiseLike implementation - makes it awaitable\n\tthen<TResult1 = Result<T, E>, TResult2 = never>(\n\t\tonfulfilled?:\n\t\t\t| ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n\t\t\t| null,\n\t\tonrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n\t): PromiseLike<TResult1 | TResult2> {\n\t\treturn this.promise.then(onfulfilled, onrejected);\n\t}\n\n\t// Transformation methods\n\tmap<U, F>(\n\t\tfn: (value: T) => U | Promise<U> | Result<U, F> | AsyncResult<U, F>,\n\t): AsyncResult<U, E | F | Failure<\"UNKNOWN_FAILURE\">> {\n\t\treturn new AsyncResult(\n\t\t\tthis.promise.then(async (result) => {\n\t\t\t\tif (!result.isOk()) {\n\t\t\t\t\treturn result as any;\n\t\t\t\t}\n\n\t\t\t\tconst mapped = fn(result.value);\n\n\t\t\t\t// Handle Result types\n\t\t\t\tif (mapped instanceof Ok || mapped instanceof Fail) {\n\t\t\t\t\treturn mapped as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle AsyncResult\n\t\t\t\tif (mapped instanceof AsyncResult) {\n\t\t\t\t\treturn (await mapped) as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle Promise\n\t\t\t\tif (mapped instanceof Promise) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst value = await mapped;\n\t\t\t\t\t\treturn new Ok(value) as any;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treturn new Fail(createUnknownFailure(err)) as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Handle plain value\n\t\t\t\treturn new Ok(mapped) as any;\n\t\t\t}),\n\t\t);\n\t}\n\n\tmapFailure<U, F>(\n\t\tfn: (failure: E) => F | Promise<F> | Result<U, F> | AsyncResult<U, F>,\n\t): AsyncResult<T | U, F | Failure<\"UNKNOWN_FAILURE\">>;\n\tmapFailure(handlers: FailureHandlers<E>): any;\n\tmapFailure<U, F>(\n\t\tfnOrHandlers:\n\t\t\t| ((failure: E) => F | Promise<F> | Result<U, F> | AsyncResult<U, F>)\n\t\t\t| FailureHandlers<E>,\n\t): AsyncResult<T | U, F | Failure<\"UNKNOWN_FAILURE\">> {\n\t\treturn new AsyncResult(\n\t\t\tthis.promise.then(async (result) => {\n\t\t\t\tif (!result.hasFailed()) {\n\t\t\t\t\treturn result as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle pattern matching with handler map\n\t\t\t\tif (\n\t\t\t\t\ttypeof fnOrHandlers === \"object\" &&\n\t\t\t\t\tfnOrHandlers !== null &&\n\t\t\t\t\ttypeof fnOrHandlers !== \"function\"\n\t\t\t\t) {\n\t\t\t\t\tconst handlers = fnOrHandlers as Record<string, (f: E) => any>;\n\t\t\t\t\tconst failure = result.failure as any;\n\n\t\t\t\t\t// Check if this failure has a code property and if there's a handler for it\n\t\t\t\t\tif (failure && typeof failure === \"object\" && \"code\" in failure) {\n\t\t\t\t\t\tconst handler = handlers[failure.code];\n\t\t\t\t\t\tif (handler) {\n\t\t\t\t\t\t\tconst mapped = handler(failure);\n\n\t\t\t\t\t\t\t// Apply same logic as function form below\n\t\t\t\t\t\t\tif (mapped instanceof Ok || mapped instanceof Fail) {\n\t\t\t\t\t\t\t\treturn mapped as any;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (mapped instanceof AsyncResult) {\n\t\t\t\t\t\t\t\treturn (await mapped) as any;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (mapped instanceof Promise) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst failureValue = await mapped;\n\t\t\t\t\t\t\t\t\treturn new Fail(failureValue) as any;\n\t\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t\treturn new Fail(createUnknownFailure(err)) as any;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Fail(mapped) as any;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No handler found, pass through unchanged\n\t\t\t\t\treturn result as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle function form\n\t\t\t\tconst fn = fnOrHandlers as (failure: E) => any;\n\t\t\t\tconst mapped = fn(result.failure);\n\n\t\t\t\t// Handle Result types\n\t\t\t\tif (mapped instanceof Ok || mapped instanceof Fail) {\n\t\t\t\t\treturn mapped as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle AsyncResult\n\t\t\t\tif (mapped instanceof AsyncResult) {\n\t\t\t\t\treturn (await mapped) as any;\n\t\t\t\t}\n\n\t\t\t\t// Handle Promise\n\t\t\t\tif (mapped instanceof Promise) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst failure = await mapped;\n\t\t\t\t\t\treturn new Fail(failure) as any;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treturn new Fail(createUnknownFailure(err)) as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Handle plain failure value\n\t\t\t\treturn new Fail(mapped) as any;\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Inspection methods\n\tinspect(fn: (value: T) => void): AsyncResult<T, E> {\n\t\treturn new AsyncResult(\n\t\t\tthis.promise.then((result) => {\n\t\t\t\tif (result.isOk()) {\n\t\t\t\t\tfn(result.value);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t}\n\n\tinspectFailure(fn: (failure: E) => void): AsyncResult<T, E> {\n\t\treturn new AsyncResult(\n\t\t\tthis.promise.then((result) => {\n\t\t\t\tif (result.hasFailed()) {\n\t\t\t\t\tfn(result.failure);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Unwrapping methods\n\tasync unwrap(): Promise<T | E> {\n\t\tconst result = await this.promise;\n\t\treturn result.unwrap();\n\t}\n\n\tasync unwrapOr<U>(defaultValue: U): Promise<T | U> {\n\t\tconst result = await this.promise;\n\t\treturn result.unwrapOr(defaultValue);\n\t}\n\n\tasync expect(message: string): Promise<T> {\n\t\tconst result = await this.promise;\n\t\treturn result.expect(message);\n\t}\n\n\t// Pattern matching\n\tasync match<U>(handlers: {\n\t\tok: (value: T) => U;\n\t\tfailed: (failure: E) => U;\n\t}): Promise<U> {\n\t\tconst result = await this.promise;\n\t\treturn result.match(handlers);\n\t}\n\n\t// Type guards\n\tasync isOk(): Promise<boolean> {\n\t\tconst result = await this.promise;\n\t\treturn result.isOk();\n\t}\n\n\tasync hasFailed(): Promise<boolean> {\n\t\tconst result = await this.promise;\n\t\treturn result.hasFailed();\n\t}\n\n\t// Generator support - allows `yield* asyncResult` to unwrap when awaited\n\t*[Symbol.iterator](): Generator<AsyncResult<T, E>, T, unknown> {\n\t\t// @ts-expect-error -- The DI system will send the unwrapped value\n\t\treturn yield this;\n\t}\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a successful Result\n */\nexport function ok<T>(value: T): Result<T, never> {\n\treturn new Ok(value) as Result<T, never>;\n}\n\n/**\n * Create a structured failure\n */\nexport function failure<Code extends string>(\n\tcode: Code,\n\tmessage: string,\n\tcause?: unknown,\n): Failure<Code> {\n\treturn { code, message, cause };\n}\n\n/**\n * Create a failed Result\n * Can be curried: fail(\"CODE\") returns a factory function\n */\nexport function fail<Code extends string>(\n\tcode: Code,\n): (message: string, cause?: unknown) => Result<never, Failure<Code>>;\nexport function fail<Code extends string>(\n\tcode: Code,\n\tmessage: string,\n\tcause?: unknown,\n): Result<never, Failure<Code>>;\nexport function fail<Code extends string>(\n\tcode: Code,\n\tmessage?: string,\n\tcause?: unknown,\n): any {\n\tif (message === undefined) {\n\t\t// Return factory function for curried usage\n\t\treturn (msg: string, c?: unknown) => {\n\t\t\treturn new Fail(failure(code, msg, c)) as Result<never, Failure<Code>>;\n\t\t};\n\t}\n\treturn new Fail(failure(code, message, cause)) as Result<\n\t\tnever,\n\t\tFailure<Code>\n\t>;\n}\n\n/**\n * Reusable factory for unknown failures\n */\nexport const UnknownFailure = fail(\"UNKNOWN_FAILURE\");\n\n// ============================================================================\n// Error Conversion Utilities\n// ============================================================================\n\n/**\n * Convert unknown error to structured Failure\n */\nfunction createUnknownFailure(err: unknown): Failure<\"UNKNOWN_FAILURE\"> {\n\tconst message = err instanceof globalThis.Error ? err.message : String(err);\n\treturn failure(\"UNKNOWN_FAILURE\", message, err);\n}\n\n/**\n * Convert throwing function or Promise into a Result\n * Catches any errors and converts them to Failure\n */\nexport function fromThrowable<T>(\n\tpromise: Promise<T>,\n): AsyncResult<T, Failure<\"UNKNOWN_FAILURE\">>;\nexport function fromThrowable<T, E>(\n\tpromise: Promise<T>,\n\tfailureMapper: (error: unknown) => E,\n): AsyncResult<T, E>;\nexport function fromThrowable<T>(\n\tfn: () => Promise<T>,\n): AsyncResult<T, Failure<\"UNKNOWN_FAILURE\">>;\nexport function fromThrowable<T, E>(\n\tfn: () => Promise<T>,\n\tfailureMapper: (error: unknown) => E,\n): AsyncResult<T, E>;\nexport function fromThrowable<T>(\n\tfn: () => T,\n): Result<T, Failure<\"UNKNOWN_FAILURE\">>;\nexport function fromThrowable<T, E>(\n\tfn: () => T,\n\tfailureMapper: (error: unknown) => E,\n): Result<T, E>;\nexport function fromThrowable<T, E = Failure<\"UNKNOWN_FAILURE\">>(\n\tfnOrPromise: (() => T | Promise<T>) | Promise<T>,\n\tfailureMapper: (error: unknown) => E = createUnknownFailure as any,\n): Result<T, E> | AsyncResult<T, E> {\n\t// Handle direct Promise\n\tif (fnOrPromise instanceof Promise) {\n\t\treturn new AsyncResult(\n\t\t\tfnOrPromise\n\t\t\t\t.then((value) => new Ok(value) as Result<T, E>)\n\t\t\t\t.catch((error) => new Fail(failureMapper(error)) as Result<T, E>),\n\t\t);\n\t}\n\n\t// Handle function\n\ttry {\n\t\tconst result = fnOrPromise();\n\n\t\t// If function returns Promise, wrap in AsyncResult\n\t\tif (result instanceof Promise) {\n\t\t\treturn new AsyncResult(\n\t\t\t\tresult\n\t\t\t\t\t.then((value) => new Ok(value) as Result<T, E>)\n\t\t\t\t\t.catch((error) => new Fail(failureMapper(error)) as Result<T, E>),\n\t\t\t);\n\t\t}\n\n\t\t// Synchronous success\n\t\treturn new Ok(result) as Result<T, E>;\n\t} catch (error) {\n\t\t// Synchronous error\n\t\treturn new Fail(failureMapper(error)) as Result<T, E>;\n\t}\n}\n\n/**\n * Wrap a function to return Results instead of throwing\n */\nexport function wrapThrowable<Args extends any[], T>(\n\tfn: (...args: Args) => Promise<T>,\n): (...args: Args) => AsyncResult<T, Failure<\"UNKNOWN_FAILURE\">>;\nexport function wrapThrowable<Args extends any[], T, E>(\n\tfn: (...args: Args) => Promise<T>,\n\tfailureMapper: (error: unknown) => E,\n): (...args: Args) => AsyncResult<T, E>;\nexport function wrapThrowable<Args extends any[], T>(\n\tfn: (...args: Args) => T,\n): (...args: Args) => Result<T, Failure<\"UNKNOWN_FAILURE\">>;\nexport function wrapThrowable<Args extends any[], T, E>(\n\tfn: (...args: Args) => T,\n\tfailureMapper: (error: unknown) => E,\n): (...args: Args) => Result<T, E>;\nexport function wrapThrowable<\n\tArgs extends any[],\n\tT,\n\tE = Failure<\"UNKNOWN_FAILURE\">,\n>(\n\tfn: (...args: Args) => T | Promise<T>,\n\tfailureMapper?: (error: unknown) => E,\n): (...args: Args) => Result<T, E> | AsyncResult<T, E> {\n\treturn (...args: Args) =>\n\t\tfromThrowable(() => fn(...args), failureMapper as any) as\n\t\t\t| Result<T, E>\n\t\t\t| AsyncResult<T, E>;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if value is a Fail result\n */\nexport function hasFailed(value: unknown): value is Fail<unknown, unknown> {\n\treturn (\n\t\tvalue != null &&\n\t\ttypeof value === \"object\" &&\n\t\t\"_tag\" in value &&\n\t\tvalue._tag === \"Fail\"\n\t);\n}\n\n/**\n * Check if value is an Ok result\n */\nexport function isOk(value: unknown): value is Ok<unknown, unknown> {\n\treturn (\n\t\tvalue != null &&\n\t\ttypeof value === \"object\" &&\n\t\t\"_tag\" in value &&\n\t\tvalue._tag === \"Ok\"\n\t);\n}\n\n/**\n * Check if value is any Result (Ok or Fail)\n */\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n\treturn isOk(value) || hasFailed(value);\n}\n","/**\n * Dependency Injection using generators\n * Allows declaring, requiring, and injecting dependencies in a type-safe way\n */\n\nimport {\n\tAsyncResult,\n\ttype Fail,\n\tOk,\n\ttype Result,\n\thasFailed,\n\tisOk,\n\tisResult,\n} from \"./result.js\";\n\n// ============================================================================\n// Dependency Types\n// ============================================================================\n\nconst DEPENDENCY_SYMBOL = Symbol(\"dependency\");\n\n/**\n * Dependency - declares a dependency requirement\n * Example: const LoggerService = fn.dependency<Logger>()(\"logger\")\n */\nexport class Dependency<T, K extends string = string> {\n\tconstructor(readonly key: K) {}\n\n\t/**\n\t * Create an implementation binding for this dependency\n\t * Example: LoggerService.impl(myLogger)\n\t */\n\timpl(value: T): DependencyImpl<T, K> {\n\t\treturn new DependencyImpl<T, K>(this.key, value);\n\t}\n}\n\n/**\n * DependencyImpl - binds a value to a dependency key\n * Created by Dependency.impl() and used in .inject()\n */\nexport class DependencyImpl<T, K extends string = string> {\n\tconstructor(\n\t\treadonly key: K,\n\t\treadonly value: T,\n\t) {}\n}\n\n/**\n * DependencyDeclaration - yielded in generators to request a dependency\n * Created by fn.require(dependency)\n */\nexport class DependencyDeclaration<T, K extends string = string> {\n\treadonly _tag = DEPENDENCY_SYMBOL;\n\tconstructor(readonly key: K) {}\n\n\t// Generator support - allows `yield* fn.require(dep)` to get the value\n\t*[Symbol.iterator](): Generator<DependencyDeclaration<T, K>, T, T> {\n\t\treturn yield this;\n\t}\n}\n\n/**\n * DependentGenerator - instruction to execute a function with dependency inheritance\n * Created by fn.yield() and consumed by the DI system\n */\nexport interface DependentGenerator<T, Deps = never, Errors = never> {\n\t_tag: \"DependentGenerator\";\n\t_deps: Deps;\n\t_errors: Errors;\n\t_generator: Generator<YieldedValue, T, any>;\n\t[Symbol.iterator](): Generator<DependentGenerator<T, Deps, Errors>, T, any>;\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Values that can be yielded in a generator\n */\ntype YieldedValue =\n\t| Result<any, any>\n\t| AsyncResult<any, any>\n\t| Promise<unknown>\n\t| DependencyDeclaration<any>\n\t| DependentGenerator<any, any, any>;\n\n/**\n * Extract return type from generator\n */\ntype ExtractGeneratorReturn<G> = G extends Generator<any, infer R, any>\n\t? R\n\t: never;\n\n/**\n * Extract yield type from generator\n */\ntype ExtractGeneratorYield<G> = G extends Generator<infer Y, any, any>\n\t? Y\n\t: never;\n\n/**\n * Extract error types from yielded values\n */\ntype ExtractYieldedErrors<Y> = Y extends Fail<any, infer E>\n\t? E\n\t: Y extends Result<any, infer E>\n\t\t? E\n\t\t: Y extends AsyncResult<any, infer E>\n\t\t\t? E\n\t\t\t: Y extends DependentGenerator<any, any, infer E>\n\t\t\t\t? E\n\t\t\t\t: never;\n\n/**\n * Extract dependencies from yielded values\n */\ntype ExtractYieldedDependencies<Y> = Y extends DependencyDeclaration<\n\tinfer T,\n\tinfer K\n>\n\t? K extends string\n\t\t? Dependency<T, K>\n\t\t: never\n\t: Y extends DependentGenerator<any, infer D, any>\n\t\t? D\n\t\t: never;\n\n/**\n * Infer all dependencies from a generator\n */\ntype InferDependencies<G> = ExtractYieldedDependencies<\n\tExtractGeneratorYield<G>\n>;\n\n/**\n * Extract dependency keys from Dependency union\n */\ntype ExtractDepKeys<D> = D extends Dependency<any, infer K> ? K : never;\n\n/**\n * Remove dependencies from union by key\n */\ntype RemoveDepByKey<D, K extends string> = D extends Dependency<any, K>\n\t? never\n\t: D;\n\n/**\n * Check if yields contain async values\n */\ntype ContainsAsyncYields<Y> = [\n\tExtract<Y, AsyncResult<any, any> | Promise<any>>,\n] extends [never]\n\t? false\n\t: true;\n\n/**\n * Marker for async yields\n */\nconst AsyncYieldsMarker = Symbol(\"AsyncYields\");\ntype AsyncYieldsMarker = typeof AsyncYieldsMarker;\n\n/**\n * Normalize yields - return marker if async present\n */\ntype NormalizeYields<Y> = ContainsAsyncYields<Y> extends true\n\t? AsyncYieldsMarker\n\t: never;\n\n/**\n * Ensure return type is a Result\n * Converts to AsyncResult if async yields are present\n */\ntype EnsureResult<T, E = never, Yields = never> = [Yields] extends [never]\n\t? T extends Result<infer U, infer TE>\n\t\t? Result<U, TE | E>\n\t\t: T extends AsyncResult<infer U, infer TE>\n\t\t\t? AsyncResult<U, TE | E>\n\t\t\t: Result<T, E>\n\t: Yields extends AsyncYieldsMarker\n\t\t? T extends Result<infer U, infer TE>\n\t\t\t? AsyncResult<U, TE | E>\n\t\t\t: T extends AsyncResult<infer U, infer TE>\n\t\t\t\t? AsyncResult<U, TE | E>\n\t\t\t\t: AsyncResult<T, E>\n\t\t: T extends Result<infer U, infer TE>\n\t\t\t? Result<U, TE | E>\n\t\t\t: T extends AsyncResult<infer U, infer TE>\n\t\t\t\t? AsyncResult<U, TE | E>\n\t\t\t\t: Result<T, E>;\n\n/**\n * Unwrap Result type to get inner value\n */\ntype UnwrapResult<T> = T extends Result<infer U, any>\n\t? U\n\t: T extends AsyncResult<infer U, any>\n\t\t? U\n\t\t: T;\n\n/**\n * Generator type for functions with dependencies\n */\nexport type FnGenerator<Return, Errors = any> = Generator<YieldedValue, Return>;\n\n// ============================================================================\n// Fn Interface\n// ============================================================================\n\n/**\n * Function with dependency injection support\n */\nexport interface Fn<\n\tArgs extends any[],\n\tReturn,\n\tErrors,\n\tDeps = never,\n\tYields = never,\n> {\n\t/**\n\t * Call the function directly (only available when all dependencies are satisfied)\n\t */\n\t(\n\t\t...args: Args\n\t): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;\n\n\t/**\n\t * Inject dependencies using implementation bindings\n\t * Example: fn.inject(LoggerImpl, DbImpl)\n\t * Allows injecting any dependency, even if not currently required (enables overriding)\n\t */\n\tinject<const Impls extends readonly DependencyImpl<any, string>[]>(\n\t\t...impls: Impls\n\t): Fn<\n\t\tArgs,\n\t\tReturn,\n\t\tErrors,\n\t\tRemoveDepByKey<Deps, Impls[number][\"key\"]>,\n\t\tYields\n\t>;\n\n\t/**\n\t * Execute the function with all dependencies satisfied\n\t * Only callable when Deps is never (all dependencies injected)\n\t */\n\trun(\n\t\t...args: Args\n\t): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;\n\n\t/**\n\t * Create an instruction for executing this function with dependency inheritance\n\t * Use with yield* to inherit dependencies from parent generator\n\t * Automatically unwraps Ok results for seamless composition\n\t */\n\tyield(...args: Args): DependentGenerator<UnwrapResult<Return>, Deps, Errors>;\n\n\t// Internal properties\n\t_generator: (...args: Args) => FnGenerator<Return, Errors>;\n\t_injectedDeps: Record<string, any>;\n\t_deps: Deps;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isDependencyDeclaration(\n\tvalue: unknown,\n): value is DependencyDeclaration<any> {\n\treturn (\n\t\tvalue != null &&\n\t\ttypeof value === \"object\" &&\n\t\t\"_tag\" in value &&\n\t\tvalue._tag === DEPENDENCY_SYMBOL\n\t);\n}\n\nfunction isDependentGenerator(\n\tvalue: unknown,\n): value is DependentGenerator<any, any, any> {\n\treturn (\n\t\tvalue != null &&\n\t\ttypeof value === \"object\" &&\n\t\t\"_tag\" in value &&\n\t\tvalue._tag === \"DependentGenerator\"\n\t);\n}\n\n// ============================================================================\n// Generator Execution\n// ============================================================================\n\n/**\n * Resolve a dependency and continue generator execution\n */\nfunction resolveDependency(\n\tdecl: DependencyDeclaration<any>,\n\tdeps: Record<string, any>,\n\tgen: Generator<YieldedValue, any, any>,\n): IteratorResult<YieldedValue, any> {\n\tif (!(decl.key in deps)) {\n\t\tthrow new Error(`Missing dependency: ${decl.key}`);\n\t}\n\treturn gen.next(deps[decl.key]);\n}\n\n/**\n * Run a generator synchronously until it completes or needs to go async\n * Handles:\n * - Dependency resolution (yield* fn.require(...))\n * - Result unwrapping (yield* ok(...) / yield* fail(...))\n * - Nested function calls (yield* child.yield(...))\n * - Async transition (yield* asyncResult / yield promise)\n */\nfunction runGenerator<Args extends any[], Return, Errors>(\n\tgenerator: (...args: Args) => FnGenerator<Return, Errors>,\n\targs: Args,\n\tdeps: Record<string, any>,\n): EnsureResult<Return, Errors> {\n\tconst gen = generator(...args);\n\tlet result = gen.next();\n\n\twhile (!result.done) {\n\t\tconst yielded = result.value;\n\n\t\t// Handle dependency declaration\n\t\tif (isDependencyDeclaration(yielded)) {\n\t\t\tresult = resolveDependency(yielded, deps, gen);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle nested function call (DependentGenerator)\n\t\tif (isDependentGenerator(yielded)) {\n\t\t\tconst childGen = yielded._generator;\n\t\t\tlet childResult = childGen.next();\n\n\t\t\t// Execute child generator\n\t\t\twhile (!childResult.done) {\n\t\t\t\tconst childYielded = childResult.value;\n\n\t\t\t\t// Resolve child's dependencies\n\t\t\t\tif (isDependencyDeclaration(childYielded)) {\n\t\t\t\t\tchildResult = resolveDependency(childYielded, deps, childGen);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Short-circuit on child failure\n\t\t\t\tif (hasFailed(childYielded)) {\n\t\t\t\t\treturn childYielded as any;\n\t\t\t\t}\n\n\t\t\t\t// Switch to async if child yields async\n\t\t\t\tif (childYielded instanceof AsyncResult) {\n\t\t\t\t\treturn new AsyncResult(\n\t\t\t\t\t\trunGeneratorAsync(gen, childYielded, deps),\n\t\t\t\t\t) as any;\n\t\t\t\t}\n\n\t\t\t\tif (childYielded instanceof Promise) {\n\t\t\t\t\treturn new AsyncResult(\n\t\t\t\t\t\trunGeneratorAsync(gen, childYielded, deps),\n\t\t\t\t\t) as any;\n\t\t\t\t}\n\n\t\t\t\tchildResult = childGen.next();\n\t\t\t}\n\n\t\t\t// Send child's return value back to parent\n\t\t\tresult = gen.next(childResult.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Short-circuit on failure\n\t\tif (hasFailed(yielded)) {\n\t\t\treturn yielded as any;\n\t\t}\n\n\t\t// Switch to async mode\n\t\tif (yielded instanceof AsyncResult) {\n\t\t\treturn new AsyncResult(runGeneratorAsync(gen, yielded, deps)) as any;\n\t\t}\n\n\t\tif (yielded instanceof Promise) {\n\t\t\treturn new AsyncResult(runGeneratorAsync(gen, yielded, deps)) as any;\n\t\t}\n\n\t\t// Continue for Ok or other values\n\t\tresult = gen.next();\n\t}\n\n\t// Auto-wrap return value in Ok if not already a Result\n\treturn (isResult(result.value) ? result.value : new Ok(result.value)) as any;\n}\n\n/**\n * Run a generator asynchronously after encountering an async value\n * Continues where runGenerator left off\n */\nasync function runGeneratorAsync(\n\tgen: Generator<YieldedValue, any, any>,\n\tfirstAsyncValue: AsyncResult<unknown, unknown> | Promise<unknown>,\n\tdeps: Record<string, any>,\n): Promise<any> {\n\t// Resolve the first async value\n\tconst asyncResult =\n\t\tfirstAsyncValue instanceof AsyncResult\n\t\t\t? await firstAsyncValue\n\t\t\t: await firstAsyncValue;\n\n\t// Short-circuit if it's a failure\n\tif (hasFailed(asyncResult)) {\n\t\treturn asyncResult;\n\t}\n\n\t// Unwrap Ok value to send back to generator (for yield* asyncResult)\n\tconst unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;\n\tlet result = gen.next(unwrappedValue);\n\n\twhile (!result.done) {\n\t\tconst yielded = result.value;\n\n\t\t// Handle dependency declaration\n\t\tif (isDependencyDeclaration(yielded)) {\n\t\t\tresult = resolveDependency(yielded, deps, gen);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Short-circuit on failure\n\t\tif (hasFailed(yielded)) {\n\t\t\treturn yielded;\n\t\t}\n\n\t\t// Handle AsyncResult\n\t\tif (yielded instanceof AsyncResult) {\n\t\t\tconst asyncResult = await yielded;\n\t\t\tif (hasFailed(asyncResult)) {\n\t\t\t\treturn asyncResult;\n\t\t\t}\n\t\t\t// Unwrap Ok to send back (for yield* asyncResult)\n\t\t\tconst unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;\n\t\t\tresult = gen.next(unwrappedValue);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle Promise\n\t\tif (yielded instanceof Promise) {\n\t\t\tawait yielded;\n\t\t\tresult = gen.next();\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Continue for Ok or other values\n\t\tresult = gen.next();\n\t}\n\n\t// Auto-wrap return value in Ok if not already a Result\n\treturn isResult(result.value) ? result.value : new Ok(result.value);\n}\n\n// ============================================================================\n// Fn Factory\n// ============================================================================\n\n/**\n * Create a Fn implementation with dependency injection support\n */\nfunction createFn<\n\tArgs extends any[],\n\tReturn,\n\tErrors,\n\tDeps = never,\n\tYields = never,\n>(\n\tgenerator: (...args: Args) => FnGenerator<Return, Errors>,\n\tinjectedDeps: Record<string, any> = {},\n): Fn<Args, Return, Errors, Deps, Yields> {\n\t// Create the Fn object\n\tconst fnObj = {\n\t\t_generator: generator,\n\t\t_injectedDeps: injectedDeps,\n\t\t_deps: {} as Deps,\n\n\t\tinject(...impls: readonly DependencyImpl<any, any>[]): any {\n\t\t\t// Merge new implementations with existing ones\n\t\t\tconst depsRecord = impls.reduce(\n\t\t\t\t(acc, impl) => {\n\t\t\t\t\tacc[impl.key] = impl.value;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, any>,\n\t\t\t);\n\t\t\tconst newInjectedDeps = { ...injectedDeps, ...depsRecord };\n\t\t\treturn createFn(generator, newInjectedDeps);\n\t\t},\n\n\t\trun(...args: Args): any {\n\t\t\treturn runGenerator(generator, args, injectedDeps);\n\t\t},\n\n\t\tyield(\n\t\t\t...args: Args\n\t\t): DependentGenerator<UnwrapResult<Return>, Deps, Errors> {\n\t\t\t// Create execution generator that handles dependency inheritance\n\t\t\tconst executeGen = function* (): Generator<YieldedValue, any, any> {\n\t\t\t\tconst gen = generator(...args);\n\t\t\t\tlet result = gen.next();\n\n\t\t\t\twhile (!result.done) {\n\t\t\t\t\tconst yielded = result.value;\n\n\t\t\t\t\t// If it's a dependency we don't have, yield it to parent\n\t\t\t\t\tif (isDependencyDeclaration(yielded)) {\n\t\t\t\t\t\tif (!(yielded.key in injectedDeps)) {\n\t\t\t\t\t\t\t// Yield to parent and get the value back\n\t\t\t\t\t\t\tconst depValue = yield yielded;\n\t\t\t\t\t\t\tresult = gen.next(depValue);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We have this dependency, resolve it internally\n\t\t\t\t\t\tresult = resolveDependency(yielded, injectedDeps, gen);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Yield other values to parent\n\t\t\t\t\tyield yielded as YieldedValue;\n\t\t\t\t\tresult = gen.next();\n\t\t\t\t}\n\n\t\t\t\t// Auto-unwrap Result return values for seamless composition\n\t\t\t\tconst returnValue = result.value;\n\t\t\t\tif (isOk(returnValue)) {\n\t\t\t\t\treturn returnValue.value;\n\t\t\t\t}\n\t\t\t\treturn returnValue;\n\t\t\t};\n\n\t\t\t// Create instruction object\n\t\t\tconst instruction: DependentGenerator<\n\t\t\t\tUnwrapResult<Return>,\n\t\t\t\tDeps,\n\t\t\t\tErrors\n\t\t\t> = {\n\t\t\t\t_tag: \"DependentGenerator\",\n\t\t\t\t_deps: {} as Deps,\n\t\t\t\t_errors: {} as Errors,\n\t\t\t\t_generator: executeGen(),\n\t\t\t\t// Make it iterable for yield* - yields itself as instruction\n\t\t\t\t*[Symbol.iterator]() {\n\t\t\t\t\treturn yield instruction;\n\t\t\t\t},\n\t\t\t};\n\n\t\t\treturn instruction;\n\t\t},\n\t};\n\n\t// Make the Fn object callable\n\tconst callable: any = (...args: Args) => fnObj.run(...args);\n\n\t// Copy Fn properties to the callable function\n\tcallable.inject = fnObj.inject;\n\tcallable.run = fnObj.run;\n\tcallable.yield = fnObj.yield;\n\tcallable._generator = fnObj._generator;\n\tcallable._injectedDeps = fnObj._injectedDeps;\n\tcallable._deps = fnObj._deps;\n\n\treturn callable as Fn<Args, Return, Errors, Deps>;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Create a function with dependency injection support\n *\n * For generator functions: Enables DI and automatic error handling\n * For regular functions: Identity transform with type inference\n */\nfunction fnImpl<Args extends any[], T, E>(\n\tfn: (...args: Args) => Result<T, E>,\n): (...args: Args) => Result<T, E>;\nfunction fnImpl<Args extends any[], Gen extends Generator<any, any, any>>(\n\tgenerator: (...args: Args) => Gen,\n): Fn<\n\tArgs,\n\tExtractGeneratorReturn<Gen>,\n\tExtractYieldedErrors<ExtractGeneratorYield<Gen>>,\n\tInferDependencies<Gen>,\n\tNormalizeYields<ExtractGeneratorYield<Gen>>\n>;\nfunction fnImpl(fnOrGen: any): any {\n\t// Check if it's a generator function\n\tif (fnOrGen.constructor && fnOrGen.constructor.name === \"GeneratorFunction\") {\n\t\treturn createFn(fnOrGen);\n\t}\n\n\t// Regular function - return as-is (identity)\n\treturn fnOrGen;\n}\n\n/**\n * Create a dependency key\n * Example: const LoggerService = fn.dependency<Logger>()(\"logger\")\n */\nfnImpl.dependency = <T>() => {\n\treturn <const K extends string>(key: K): Dependency<T, K> => {\n\t\treturn new Dependency<T, K>(key);\n\t};\n};\n\n/**\n * Declare a dependency requirement\n * Example: const logger = yield* fn.require(LoggerService)\n */\nfnImpl.require = <T, K extends string>(\n\tdep: Dependency<T, K>,\n): DependencyDeclaration<T, K> => {\n\treturn new DependencyDeclaration<T, K>(dep.key);\n};\n\nexport const fn = fnImpl;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EACN,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,EAAE,EACF,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAC"}