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/di.d.ts ADDED
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Dependency Injection using generators
3
+ * Allows declaring, requiring, and injecting dependencies in a type-safe way
4
+ */
5
+ import { AsyncResult, type Fail, type Result } from "./result.js";
6
+ /**
7
+ * Dependency - declares a dependency requirement
8
+ * Example: const LoggerService = fn.dependency<Logger>()("logger")
9
+ */
10
+ export declare class Dependency<T, K extends string = string> {
11
+ readonly key: K;
12
+ constructor(key: K);
13
+ /**
14
+ * Create an implementation binding for this dependency
15
+ * Example: LoggerService.impl(myLogger)
16
+ */
17
+ impl(value: T): DependencyImpl<T, K>;
18
+ }
19
+ /**
20
+ * DependencyImpl - binds a value to a dependency key
21
+ * Created by Dependency.impl() and used in .inject()
22
+ */
23
+ export declare class DependencyImpl<T, K extends string = string> {
24
+ readonly key: K;
25
+ readonly value: T;
26
+ constructor(key: K, value: T);
27
+ }
28
+ /**
29
+ * DependencyDeclaration - yielded in generators to request a dependency
30
+ * Created by fn.require(dependency)
31
+ */
32
+ export declare class DependencyDeclaration<T, K extends string = string> {
33
+ readonly key: K;
34
+ readonly _tag: symbol;
35
+ constructor(key: K);
36
+ [Symbol.iterator](): Generator<DependencyDeclaration<T, K>, T, T>;
37
+ }
38
+ /**
39
+ * DependentGenerator - instruction to execute a function with dependency inheritance
40
+ * Created by fn.yield() and consumed by the DI system
41
+ */
42
+ export interface DependentGenerator<T, Deps = never, Errors = never> {
43
+ _tag: "DependentGenerator";
44
+ _deps: Deps;
45
+ _errors: Errors;
46
+ _generator: Generator<YieldedValue, T, any>;
47
+ [Symbol.iterator](): Generator<DependentGenerator<T, Deps, Errors>, T, any>;
48
+ }
49
+ /**
50
+ * Values that can be yielded in a generator
51
+ */
52
+ type YieldedValue = Result<any, any> | AsyncResult<any, any> | Promise<unknown> | DependencyDeclaration<any> | DependentGenerator<any, any, any>;
53
+ /**
54
+ * Extract return type from generator
55
+ */
56
+ type ExtractGeneratorReturn<G> = G extends Generator<any, infer R, any> ? R : never;
57
+ /**
58
+ * Extract yield type from generator
59
+ */
60
+ type ExtractGeneratorYield<G> = G extends Generator<infer Y, any, any> ? Y : never;
61
+ /**
62
+ * Extract error types from yielded values
63
+ */
64
+ type ExtractYieldedErrors<Y> = Y extends Fail<any, infer E> ? E : Y extends Result<any, infer E> ? E : Y extends AsyncResult<any, infer E> ? E : Y extends DependentGenerator<any, any, infer E> ? E : never;
65
+ /**
66
+ * Extract dependencies from yielded values
67
+ */
68
+ type ExtractYieldedDependencies<Y> = Y extends DependencyDeclaration<infer T, infer K> ? K extends string ? Dependency<T, K> : never : Y extends DependentGenerator<any, infer D, any> ? D : never;
69
+ /**
70
+ * Infer all dependencies from a generator
71
+ */
72
+ type InferDependencies<G> = ExtractYieldedDependencies<ExtractGeneratorYield<G>>;
73
+ /**
74
+ * Remove dependencies from union by key
75
+ */
76
+ type RemoveDepByKey<D, K extends string> = D extends Dependency<any, K> ? never : D;
77
+ /**
78
+ * Check if yields contain async values
79
+ */
80
+ type ContainsAsyncYields<Y> = [
81
+ Extract<Y, AsyncResult<any, any> | Promise<any>>
82
+ ] extends [never] ? false : true;
83
+ /**
84
+ * Marker for async yields
85
+ */
86
+ declare const AsyncYieldsMarker: unique symbol;
87
+ type AsyncYieldsMarker = typeof AsyncYieldsMarker;
88
+ /**
89
+ * Normalize yields - return marker if async present
90
+ */
91
+ type NormalizeYields<Y> = ContainsAsyncYields<Y> extends true ? AsyncYieldsMarker : never;
92
+ /**
93
+ * Ensure return type is a Result
94
+ * Converts to AsyncResult if async yields are present
95
+ */
96
+ type EnsureResult<T, E = never, Yields = never> = [Yields] extends [never] ? T extends Result<infer U, infer TE> ? Result<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : Result<T, E> : Yields extends AsyncYieldsMarker ? T extends Result<infer U, infer TE> ? AsyncResult<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : AsyncResult<T, E> : T extends Result<infer U, infer TE> ? Result<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : Result<T, E>;
97
+ /**
98
+ * Unwrap Result type to get inner value
99
+ */
100
+ type UnwrapResult<T> = T extends Result<infer U, any> ? U : T extends AsyncResult<infer U, any> ? U : T;
101
+ /**
102
+ * Generator type for functions with dependencies
103
+ */
104
+ export type FnGenerator<Return, Errors = any> = Generator<YieldedValue, Return>;
105
+ /**
106
+ * Function with dependency injection support
107
+ */
108
+ export interface Fn<Args extends any[], Return, Errors, Deps = never, Yields = never> {
109
+ /**
110
+ * Call the function directly (only available when all dependencies are satisfied)
111
+ */
112
+ (...args: Args): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;
113
+ /**
114
+ * Inject dependencies using implementation bindings
115
+ * Example: fn.inject(LoggerImpl, DbImpl)
116
+ * Allows injecting any dependency, even if not currently required (enables overriding)
117
+ */
118
+ inject<const Impls extends readonly DependencyImpl<any, string>[]>(...impls: Impls): Fn<Args, Return, Errors, RemoveDepByKey<Deps, Impls[number]["key"]>, Yields>;
119
+ /**
120
+ * Execute the function with all dependencies satisfied
121
+ * Only callable when Deps is never (all dependencies injected)
122
+ */
123
+ run(...args: Args): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;
124
+ /**
125
+ * Create an instruction for executing this function with dependency inheritance
126
+ * Use with yield* to inherit dependencies from parent generator
127
+ * Automatically unwraps Ok results for seamless composition
128
+ */
129
+ yield(...args: Args): DependentGenerator<UnwrapResult<Return>, Deps, Errors>;
130
+ _generator: (...args: Args) => FnGenerator<Return, Errors>;
131
+ _injectedDeps: Record<string, any>;
132
+ _deps: Deps;
133
+ }
134
+ /**
135
+ * Create a function with dependency injection support
136
+ *
137
+ * For generator functions: Enables DI and automatic error handling
138
+ * For regular functions: Identity transform with type inference
139
+ */
140
+ declare function fnImpl<Args extends any[], T, E>(fn: (...args: Args) => Result<T, E>): (...args: Args) => Result<T, E>;
141
+ declare function fnImpl<Args extends any[], Gen extends Generator<any, any, any>>(generator: (...args: Args) => Gen): Fn<Args, ExtractGeneratorReturn<Gen>, ExtractYieldedErrors<ExtractGeneratorYield<Gen>>, InferDependencies<Gen>, NormalizeYields<ExtractGeneratorYield<Gen>>>;
142
+ declare namespace fnImpl {
143
+ var dependency: <T>() => <const K extends string>(key: K) => Dependency<T, K>;
144
+ var require: <T, K extends string>(dep: Dependency<T, K>) => DependencyDeclaration<T, K>;
145
+ }
146
+ export declare const fn: typeof fnImpl;
147
+ export {};
148
+ //# sourceMappingURL=di.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di.d.ts","sourceRoot":"","sources":["../src/di.ts"],"names":[],"mappings":"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"}
package/dist/di.js ADDED
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Dependency Injection using generators
3
+ * Allows declaring, requiring, and injecting dependencies in a type-safe way
4
+ */
5
+ import { AsyncResult, hasFailed, isOk, isResult, Ok, } from "./result.js";
6
+ // ============================================================================
7
+ // Dependency Types
8
+ // ============================================================================
9
+ const DEPENDENCY_SYMBOL = Symbol("dependency");
10
+ /**
11
+ * Dependency - declares a dependency requirement
12
+ * Example: const LoggerService = fn.dependency<Logger>()("logger")
13
+ */
14
+ export class Dependency {
15
+ key;
16
+ constructor(key) {
17
+ this.key = key;
18
+ }
19
+ /**
20
+ * Create an implementation binding for this dependency
21
+ * Example: LoggerService.impl(myLogger)
22
+ */
23
+ impl(value) {
24
+ return new DependencyImpl(this.key, value);
25
+ }
26
+ }
27
+ /**
28
+ * DependencyImpl - binds a value to a dependency key
29
+ * Created by Dependency.impl() and used in .inject()
30
+ */
31
+ export class DependencyImpl {
32
+ key;
33
+ value;
34
+ constructor(key, value) {
35
+ this.key = key;
36
+ this.value = value;
37
+ }
38
+ }
39
+ /**
40
+ * DependencyDeclaration - yielded in generators to request a dependency
41
+ * Created by fn.require(dependency)
42
+ */
43
+ export class DependencyDeclaration {
44
+ key;
45
+ _tag = DEPENDENCY_SYMBOL;
46
+ constructor(key) {
47
+ this.key = key;
48
+ }
49
+ // Generator support - allows `yield* fn.require(dep)` to get the value
50
+ *[Symbol.iterator]() {
51
+ return yield this;
52
+ }
53
+ }
54
+ /**
55
+ * Marker for async yields
56
+ */
57
+ const AsyncYieldsMarker = Symbol("AsyncYields");
58
+ // ============================================================================
59
+ // Type Guards
60
+ // ============================================================================
61
+ function isDependencyDeclaration(value) {
62
+ return (value != null &&
63
+ typeof value === "object" &&
64
+ "_tag" in value &&
65
+ value._tag === DEPENDENCY_SYMBOL);
66
+ }
67
+ function isDependentGenerator(value) {
68
+ return (value != null &&
69
+ typeof value === "object" &&
70
+ "_tag" in value &&
71
+ value._tag === "DependentGenerator");
72
+ }
73
+ // ============================================================================
74
+ // Generator Execution
75
+ // ============================================================================
76
+ /**
77
+ * Resolve a dependency and continue generator execution
78
+ */
79
+ function resolveDependency(decl, deps, gen) {
80
+ if (!(decl.key in deps)) {
81
+ throw new Error(`Missing dependency: ${decl.key}`);
82
+ }
83
+ return gen.next(deps[decl.key]);
84
+ }
85
+ /**
86
+ * Run a generator synchronously until it completes or needs to go async
87
+ * Handles:
88
+ * - Dependency resolution (yield* fn.require(...))
89
+ * - Result unwrapping (yield* ok(...) / yield* fail(...))
90
+ * - Nested function calls (yield* child.yield(...))
91
+ * - Async transition (yield* asyncResult / yield promise)
92
+ */
93
+ function runGenerator(generator, args, deps) {
94
+ const gen = generator(...args);
95
+ let result = gen.next();
96
+ while (!result.done) {
97
+ const yielded = result.value;
98
+ // Handle dependency declaration
99
+ if (isDependencyDeclaration(yielded)) {
100
+ result = resolveDependency(yielded, deps, gen);
101
+ continue;
102
+ }
103
+ // Handle nested function call (DependentGenerator)
104
+ if (isDependentGenerator(yielded)) {
105
+ const childGen = yielded._generator;
106
+ let childResult = childGen.next();
107
+ // Execute child generator
108
+ while (!childResult.done) {
109
+ const childYielded = childResult.value;
110
+ // Resolve child's dependencies
111
+ if (isDependencyDeclaration(childYielded)) {
112
+ childResult = resolveDependency(childYielded, deps, childGen);
113
+ continue;
114
+ }
115
+ // Short-circuit on child failure
116
+ if (hasFailed(childYielded)) {
117
+ return childYielded;
118
+ }
119
+ // Switch to async if child yields async
120
+ if (childYielded instanceof AsyncResult) {
121
+ return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
122
+ }
123
+ if (childYielded instanceof Promise) {
124
+ return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
125
+ }
126
+ childResult = childGen.next();
127
+ }
128
+ // Send child's return value back to parent
129
+ result = gen.next(childResult.value);
130
+ continue;
131
+ }
132
+ // Short-circuit on failure
133
+ if (hasFailed(yielded)) {
134
+ return yielded;
135
+ }
136
+ // Switch to async mode
137
+ if (yielded instanceof AsyncResult) {
138
+ return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
139
+ }
140
+ if (yielded instanceof Promise) {
141
+ return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
142
+ }
143
+ // Continue for Ok or other values
144
+ result = gen.next();
145
+ }
146
+ // Auto-wrap return value in Ok if not already a Result
147
+ return (isResult(result.value) ? result.value : new Ok(result.value));
148
+ }
149
+ /**
150
+ * Run a generator asynchronously after encountering an async value
151
+ * Continues where runGenerator left off
152
+ */
153
+ async function runGeneratorAsync(gen, firstAsyncValue, deps) {
154
+ // Resolve the first async value
155
+ const asyncResult = firstAsyncValue instanceof AsyncResult
156
+ ? await firstAsyncValue
157
+ : await firstAsyncValue;
158
+ // Short-circuit if it's a failure
159
+ if (hasFailed(asyncResult)) {
160
+ return asyncResult;
161
+ }
162
+ // Unwrap Ok value to send back to generator (for yield* asyncResult)
163
+ const unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;
164
+ let result = gen.next(unwrappedValue);
165
+ while (!result.done) {
166
+ const yielded = result.value;
167
+ // Handle dependency declaration
168
+ if (isDependencyDeclaration(yielded)) {
169
+ result = resolveDependency(yielded, deps, gen);
170
+ continue;
171
+ }
172
+ // Short-circuit on failure
173
+ if (hasFailed(yielded)) {
174
+ return yielded;
175
+ }
176
+ // Handle AsyncResult
177
+ if (yielded instanceof AsyncResult) {
178
+ const asyncResult = await yielded;
179
+ if (hasFailed(asyncResult)) {
180
+ return asyncResult;
181
+ }
182
+ // Unwrap Ok to send back (for yield* asyncResult)
183
+ const unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;
184
+ result = gen.next(unwrappedValue);
185
+ continue;
186
+ }
187
+ // Handle Promise
188
+ if (yielded instanceof Promise) {
189
+ await yielded;
190
+ result = gen.next();
191
+ continue;
192
+ }
193
+ // Continue for Ok or other values
194
+ result = gen.next();
195
+ }
196
+ // Auto-wrap return value in Ok if not already a Result
197
+ return isResult(result.value) ? result.value : new Ok(result.value);
198
+ }
199
+ // ============================================================================
200
+ // Fn Factory
201
+ // ============================================================================
202
+ /**
203
+ * Create a Fn implementation with dependency injection support
204
+ */
205
+ function createFn(generator, injectedDeps = {}) {
206
+ // Create the Fn object
207
+ const fnObj = {
208
+ _generator: generator,
209
+ _injectedDeps: injectedDeps,
210
+ _deps: {},
211
+ inject(...impls) {
212
+ // Merge new implementations with existing ones
213
+ const depsRecord = impls.reduce((acc, impl) => {
214
+ acc[impl.key] = impl.value;
215
+ return acc;
216
+ }, {});
217
+ const newInjectedDeps = { ...injectedDeps, ...depsRecord };
218
+ return createFn(generator, newInjectedDeps);
219
+ },
220
+ run(...args) {
221
+ return runGenerator(generator, args, injectedDeps);
222
+ },
223
+ yield(...args) {
224
+ // Create execution generator that handles dependency inheritance
225
+ const executeGen = function* () {
226
+ const gen = generator(...args);
227
+ let result = gen.next();
228
+ while (!result.done) {
229
+ const yielded = result.value;
230
+ // If it's a dependency we don't have, yield it to parent
231
+ if (isDependencyDeclaration(yielded)) {
232
+ if (!(yielded.key in injectedDeps)) {
233
+ // Yield to parent and get the value back
234
+ const depValue = yield yielded;
235
+ result = gen.next(depValue);
236
+ continue;
237
+ }
238
+ // We have this dependency, resolve it internally
239
+ result = resolveDependency(yielded, injectedDeps, gen);
240
+ continue;
241
+ }
242
+ // Yield other values to parent
243
+ yield yielded;
244
+ result = gen.next();
245
+ }
246
+ // Auto-unwrap Result return values for seamless composition
247
+ const returnValue = result.value;
248
+ if (isOk(returnValue)) {
249
+ return returnValue.value;
250
+ }
251
+ return returnValue;
252
+ };
253
+ // Create instruction object
254
+ const instruction = {
255
+ _tag: "DependentGenerator",
256
+ _deps: {},
257
+ _errors: {},
258
+ _generator: executeGen(),
259
+ // Make it iterable for yield* - yields itself as instruction
260
+ *[Symbol.iterator]() {
261
+ return yield instruction;
262
+ },
263
+ };
264
+ return instruction;
265
+ },
266
+ };
267
+ // Make the Fn object callable
268
+ const callable = (...args) => fnObj.run(...args);
269
+ // Copy Fn properties to the callable function
270
+ callable.inject = fnObj.inject;
271
+ callable.run = fnObj.run;
272
+ callable.yield = fnObj.yield;
273
+ callable._generator = fnObj._generator;
274
+ callable._injectedDeps = fnObj._injectedDeps;
275
+ callable._deps = fnObj._deps;
276
+ return callable;
277
+ }
278
+ function fnImpl(fnOrGen) {
279
+ // Check if it's a generator function
280
+ if (fnOrGen.constructor && fnOrGen.constructor.name === "GeneratorFunction") {
281
+ return createFn(fnOrGen);
282
+ }
283
+ // Regular function - return as-is (identity)
284
+ return fnOrGen;
285
+ }
286
+ /**
287
+ * Create a dependency key
288
+ * Example: const LoggerService = fn.dependency<Logger>()("logger")
289
+ */
290
+ fnImpl.dependency = () => {
291
+ return (key) => {
292
+ return new Dependency(key);
293
+ };
294
+ };
295
+ /**
296
+ * Declare a dependency requirement
297
+ * Example: const logger = yield* fn.require(LoggerService)
298
+ */
299
+ fnImpl.require = (dep) => {
300
+ return new DependencyDeclaration(dep.key);
301
+ };
302
+ export const fn = fnImpl;
303
+ //# sourceMappingURL=di.js.map
package/dist/di.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di.js","sourceRoot":"","sources":["../src/di.ts"],"names":[],"mappings":"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"}