<Self, K, A>(
...args:
| [self: Self, body: (this: Self) => Generator<K, A, never>]
| [body: () => Generator<K, A, never>]
): Result<
A,
[K] extends [Gen.Variance<ResultTypeLambda, any, any, infer E>]
? E
: [K] extends [Result<any, infer E>]
? E
: never
>Provides generator-based syntax for composing Result values sequentially.
When to use
Use when you need generator syntax to compose sequential Result
computations instead of nested flatMap calls.
Details
- Use
yield*to unwrap aResultinside the generator; if any yieldedResultis aFailure, the generator short-circuits and returns that failure - The return value of the generator is wrapped in
Success - Evaluated eagerly and synchronously (unlike
Effect.gen)
Example (Composing multiple Results)
import { Result } from "effect"
const result = Result.gen(function*() {
const a = yield* Result.succeed(1)
const b = yield* Result.succeed(2)
return a + b
})
console.log(result)
// Output: { _tag: "Success", success: 3, ... }export const const gen: Gen.Gen<ResultTypeLambda>Provides generator-based syntax for composing Result values sequentially.
When to use
Use when you need generator syntax to compose sequential Result
computations instead of nested flatMap calls.
Details
- Use
yield* to unwrap a Result inside the generator; if any yielded
Result is a Failure, the generator short-circuits and returns that failure
- The return value of the generator is wrapped in
Success
- Evaluated eagerly and synchronously (unlike
Effect.gen)
Example (Composing multiple Results)
import { Result } from "effect"
const result = Result.gen(function*() {
const a = yield* Result.succeed(1)
const b = yield* Result.succeed(2)
return a + b
})
console.log(result)
// Output: { _tag: "Success", success: 3, ... }
gen: import GenGen.type Gen<F extends TypeLambda> = <
Self,
K extends
| Gen.Variance<F, any, any, any>
| Equivalence<F, any, any, any, any>,
A
>(
...args:
| [
self: Self,
body: (
this: Self
) => Generator<K, A, never>
]
| [body: () => Generator<K, A, never>]
) => Equivalence<
F,
[K] extends [Gen.Variance<F, infer R, any, any>]
? R
: [K] extends [
Equivalence<F, infer R, any, any, any>
]
? R
: never,
[K] extends [Gen.Variance<F, any, infer O, any>]
? O
: [K] extends [
Equivalence<F, any, infer O, any, any>
]
? O
: never,
[K] extends [Gen.Variance<F, any, any, infer E>]
? E
: [K] extends [
Equivalence<F, any, any, infer E, any>
]
? E
: never,
A
>
Type-level signature for generator-based monadic composition over any
TypeLambda.
When to use
Use to type the gen function of a module that supports generator syntax,
such as Option.gen, Result.gen, and Effect.gen.
Details
This is a pure type alias with no runtime behavior. It infers R, O, and
E from the yielded values via
Variance
or Kind constraints. The
generator's return type A becomes the output's A parameter.
Example (Typing a gen function for Option)
import type { Option, Utils } from "effect"
declare const gen: Utils.Gen<Option.OptionTypeLambda>
Gen<ResultTypeLambda> = (...args: | [
self: Self,
body: (this: Self) => Generator<K, A, never>
]
| [body: () => Generator<K, A, never>]
args) => {
const const f: () => Generator<K, A, never>f = args: | [
self: Self,
body: (this: Self) => Generator<K, A, never>
]
| [body: () => Generator<K, A, never>]
args.length: 1 | 2length === 1 ? args: [body: () => Generator<K, A, never>](parameter) args: {
0: () => Generator<K, A, never>;
length: 1;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => (() => Generator<K, A, never>) | undefined;
push: (...items: Array<() => Generator<K, A, never>>) => number;
concat: { (...items: Array<ConcatArray<() => Generator<K, A, never>>>): Array<() => Generator<K, A, never>>; (...items: Array<(() => Generator<K, A, never>) | ConcatArray<() => Generator<K, A, never>>>): Array<() => Generator<K, A, never>> };
join: (separator?: string) => string;
reverse: () => Array<() => Generator<K, A, never>>;
shift: () => (() => Generator<K, A, never>) | undefined;
slice: (start?: number, end?: number) => Array<() => Generator<K, A, never>>;
sort: (compareFn?: ((a: () => Generator<K, A, never>, b: () => Generator<K, A, never>) => number) | undefined) => [body: () => Generator<K, A, never>];
splice: { (start: number, deleteCount?: number): Array<() => Generator<K, A, never>>; (start: number, deleteCount: number, ...items: Array<() => Generator<K, A, never>>): Array<() => Generator<K, A, never>> };
unshift: (...items: Array<() => Generator<K, A, never>>) => number;
indexOf: (searchElement: () => Generator<K, A, never>, fromIndex?: number) => number;
lastIndexOf: (searchElement: () => Generator<K, A, never>, fromIndex?: number) => number;
every: { (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => value is S, thisArg?: any): this is S[]; (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => …;
some: (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => void, thisArg?: any) => void;
map: (callbackfn: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => value is S, thisArg?: any): Array<S>; (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Gen…;
reduce: { (callbackfn: (previousValue: () => Generator<K, A, never>, currentValue: () => Generator<K, A, never>, currentIndex: number, array: Array<() => Generator<K, A, never>>) => () => Generator<K, A, never>): () => Generator<K, A, never>; (cal…;
reduceRight: { (callbackfn: (previousValue: () => Generator<K, A, never>, currentValue: () => Generator<K, A, never>, currentIndex: number, array: Array<() => Generator<K, A, never>>) => () => Generator<K, A, never>): () => Generator<K, A, never>; (cal…;
find: { (predicate: (value: () => Generator<K, A, never>, index: number, obj: Array<() => Generator<K, A, never>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: () => Generator<K, A, never>, index: number, obj: Array<() => Ge…;
findIndex: (predicate: (value: () => Generator<K, A, never>, index: number, obj: Array<() => Generator<K, A, never>>) => unknown, thisArg?: any) => number;
fill: (value: () => Generator<K, A, never>, start?: number, end?: number) => [body: () => Generator<K, A, never>];
copyWithin: (target: number, start: number, end?: number) => [body: () => Generator<K, A, never>];
entries: () => ArrayIterator<[number, () => Generator<K, A, never>]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<() => Generator<K, A, never>>;
includes: (searchElement: () => Generator<K, A, never>, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => (() => Generator<K, A, never>) | undefined;
findLast: { (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => value is S, thisArg?: any): S | undefined; (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() =…;
findLastIndex: (predicate: (value: () => Generator<K, A, never>, index: number, array: Array<() => Generator<K, A, never>>) => unknown, thisArg?: any) => number;
toReversed: () => Array<() => Generator<K, A, never>>;
toSorted: (compareFn?: ((a: () => Generator<K, A, never>, b: () => Generator<K, A, never>) => number) | undefined) => Array<() => Generator<K, A, never>>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<() => Generator<K, A, never>>): Array<() => Generator<K, A, never>>; (start: number, deleteCount?: number): Array<() => Generator<K, A, never>> };
with: (index: number, value: () => Generator<K, A, never>) => Array<() => Generator<K, A, never>>;
}
args[0] : args: [
self: Self,
body: (this: Self) => Generator<K, A, never>
]
(parameter) args: {
0: Self;
1: (this: Self) => Generator<K, A, never>;
length: 2;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Self | ((this: Self) => Generator<K, A, never>) | undefined;
push: (...items: Array<Self | ((this: Self) => Generator<K, A, never>)>) => number;
concat: { (...items: Array<ConcatArray<Self | ((this: Self) => Generator<K, A, never>)>>): Array<Self | ((this: Self) => Generator<K, A, never>)>; (...items: Array<Self | ((this: Self) => Generator<K, A, never>) | ConcatArray<Self | ((this: Self) …;
join: (separator?: string) => string;
reverse: () => Array<Self | ((this: Self) => Generator<K, A, never>)>;
shift: () => Self | ((this: Self) => Generator<K, A, never>) | undefined;
slice: (start?: number, end?: number) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
sort: (compareFn?: ((a: Self | ((this: Self) => Generator<K, A, never>), b: Self | ((this: Self) => Generator<K, A, never>)) => number) | undefined) => [self: Self, body: (this: Self) => Generator<K, A, never>];
splice: { (start: number, deleteCount?: number): Array<Self | ((this: Self) => Generator<K, A, never>)>; (start: number, deleteCount: number, ...items: Array<Self | ((this: Self) => Generator<K, A, never>)>): Array<Self | ((this: Self) => Generato…;
unshift: (...items: Array<Self | ((this: Self) => Generator<K, A, never>)>) => number;
indexOf: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => number;
lastIndexOf: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => number;
every: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Self | ((this: Self) => Ge…;
some: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Self | ((this: Self) => Gener…;
reduce: { (callbackfn: (previousValue: Self | ((this: Self) => Generator<K, A, never>), currentValue: Self | ((this: Self) => Generator<K, A, never>), currentIndex: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => Self | (…;
reduceRight: { (callbackfn: (previousValue: Self | ((this: Self) => Generator<K, A, never>), currentValue: Self | ((this: Self) => Generator<K, A, never>), currentIndex: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => Self | (…;
find: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, obj: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Self | ((this: Self) => Ge…;
findIndex: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, obj: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => number;
fill: (value: Self | ((this: Self) => Generator<K, A, never>), start?: number, end?: number) => [self: Self, body: (this: Self) => Generator<K, A, never>];
copyWithin: (target: number, start: number, end?: number) => [self: Self, body: (this: Self) => Generator<K, A, never>];
entries: () => ArrayIterator<[number, Self | ((this: Self) => Generator<K, A, never>)]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Self | ((this: Self) => Generator<K, A, never>)>;
includes: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Self | ((this: Self) => Generator<K, A, never>) | undefined;
findLast: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Self | ((this: Self) => …;
findLastIndex: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Self | ((this: Self) => Generator<K, A, never>)>;
toSorted: (compareFn?: ((a: Self | ((this: Self) => Generator<K, A, never>), b: Self | ((this: Self) => Generator<K, A, never>)) => number) | undefined) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Self | ((this: Self) => Generator<K, A, never>)>): Array<Self | ((this: Self) => Generator<K, A, never>)>; (start: number, deleteCount?: number): Array<Self | ((this: Self) => Generato…;
with: (index: number, value: Self | ((this: Self) => Generator<K, A, never>)) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
}
args[1].CallableFunction.bind<(this: Self) => Generator<K, A, never>>(this: (this: Self) => Generator<K, A, never>, thisArg: Self): OmitThisParameter<(this: Self) => Generator<K, A, never>> (+1 overload)For a given function, creates a bound function that has the same body as the original function.
The this object of the bound function is associated with the specified object, and has the specified initial parameters.
bind(args: [
self: Self,
body: (this: Self) => Generator<K, A, never>
]
(parameter) args: {
0: Self;
1: (this: Self) => Generator<K, A, never>;
length: 2;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => Self | ((this: Self) => Generator<K, A, never>) | undefined;
push: (...items: Array<Self | ((this: Self) => Generator<K, A, never>)>) => number;
concat: { (...items: Array<ConcatArray<Self | ((this: Self) => Generator<K, A, never>)>>): Array<Self | ((this: Self) => Generator<K, A, never>)>; (...items: Array<Self | ((this: Self) => Generator<K, A, never>) | ConcatArray<Self | ((this: Self) …;
join: (separator?: string) => string;
reverse: () => Array<Self | ((this: Self) => Generator<K, A, never>)>;
shift: () => Self | ((this: Self) => Generator<K, A, never>) | undefined;
slice: (start?: number, end?: number) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
sort: (compareFn?: ((a: Self | ((this: Self) => Generator<K, A, never>), b: Self | ((this: Self) => Generator<K, A, never>)) => number) | undefined) => [self: Self, body: (this: Self) => Generator<K, A, never>];
splice: { (start: number, deleteCount?: number): Array<Self | ((this: Self) => Generator<K, A, never>)>; (start: number, deleteCount: number, ...items: Array<Self | ((this: Self) => Generator<K, A, never>)>): Array<Self | ((this: Self) => Generato…;
unshift: (...items: Array<Self | ((this: Self) => Generator<K, A, never>)>) => number;
indexOf: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => number;
lastIndexOf: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => number;
every: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): this is S[]; (predicate: (value: Self | ((this: Self) => Ge…;
some: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Self | ((this: Self) => Gener…;
reduce: { (callbackfn: (previousValue: Self | ((this: Self) => Generator<K, A, never>), currentValue: Self | ((this: Self) => Generator<K, A, never>), currentIndex: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => Self | (…;
reduceRight: { (callbackfn: (previousValue: Self | ((this: Self) => Generator<K, A, never>), currentValue: Self | ((this: Self) => Generator<K, A, never>), currentIndex: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => Self | (…;
find: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, obj: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Self | ((this: Self) => Ge…;
findIndex: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, obj: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => number;
fill: (value: Self | ((this: Self) => Generator<K, A, never>), start?: number, end?: number) => [self: Self, body: (this: Self) => Generator<K, A, never>];
copyWithin: (target: number, start: number, end?: number) => [self: Self, body: (this: Self) => Generator<K, A, never>];
entries: () => ArrayIterator<[number, Self | ((this: Self) => Generator<K, A, never>)]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Self | ((this: Self) => Generator<K, A, never>)>;
includes: (searchElement: Self | ((this: Self) => Generator<K, A, never>), fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Self | ((this: Self) => Generator<K, A, never>) | undefined;
findLast: { (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Self | ((this: Self) => …;
findLastIndex: (predicate: (value: Self | ((this: Self) => Generator<K, A, never>), index: number, array: Array<Self | ((this: Self) => Generator<K, A, never>)>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Self | ((this: Self) => Generator<K, A, never>)>;
toSorted: (compareFn?: ((a: Self | ((this: Self) => Generator<K, A, never>), b: Self | ((this: Self) => Generator<K, A, never>)) => number) | undefined) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Self | ((this: Self) => Generator<K, A, never>)>): Array<Self | ((this: Self) => Generator<K, A, never>)>; (start: number, deleteCount?: number): Array<Self | ((this: Self) => Generato…;
with: (index: number, value: Self | ((this: Self) => Generator<K, A, never>)) => Array<Self | ((this: Self) => Generator<K, A, never>)>;
}
args[0])
const const iterator: Generator<K, A, never>iterator = const f: () => Generator<K, A, never>f()
let let state: IteratorResult<any, any>state: type IteratorResult<T, TReturn = any> =
| IteratorYieldResult<T>
| IteratorReturnResult<TReturn>
IteratorResult<any> = const iterator: Generator<K, A, never>iterator.Generator<K, A, never>.next(...[value]: [] | [never]): IteratorResult<K, A>next()
while (!let state: IteratorResult<any, any>state.done?: boolean | undefineddone) {
const const current: anycurrent = let state: IteratorYieldResult<any>state.IteratorYieldResult<any>.value: anyvalue
if (const isFailure: <A, E>(
self: Result<A, E>
) => self is Failure<A, E>
Checks whether a Result is a Failure.
When to use
Use to narrow a known Result to the Failure variant.
Details
- Acts as a TypeScript type guard, narrowing to
Failure<A, E>
- After narrowing, you can access
.failure to read the error value
Example (Narrowing to failure)
import { Result } from "effect"
const result = Result.fail("oops")
if (Result.isFailure(result)) {
console.log(result.failure)
// Output: "oops"
}
isFailure(const current: anycurrent)) {
return const current: Failure<unknown, unknown>const current: {
_tag: "Failure";
_op: "Failure";
failure: E;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
current
}
let state: IteratorResult<any, any>state = const iterator: Generator<K, A, never>iterator.Generator<K, A, never>.next(...[value]: [] | [never]): IteratorResult<K, A>next(const current: anycurrent.success as never)
}
return const succeed: <A>(right: A) => Result<A>Creates a Result holding a Success value.
Details
- Use when you have a value and want to lift it into the
Result type
- The error type
E defaults to never
Example (Wrapping a value)
import { Result } from "effect"
const result = Result.succeed(42)
console.log(Result.isSuccess(result))
// Output: true
succeed(let state: IteratorReturnResult<any>state.IteratorReturnResult<any>.value: anyvalue) as any
}