<Self, K, A>(
...args:
| [self: Self, body: (this: Self) => Generator<K, A, never>]
| [body: () => Generator<K, A, never>]
): Option<A>Provides generator-based syntax for Option, similar to async/await but for
optional values. Yielding a None short-circuits the generator to None.
When to use
Use when you need generator syntax for a sequence of Option steps that
should short-circuit on None.
Details
- Each
yield*unwraps aSomevalue or short-circuits toNone - The return value is wrapped in
Some - No
Effectruntime is needed
Example (Sequencing Option computations with generator syntax)
import { Option } from "effect"
const maybeName: Option.Option<string> = Option.some("John")
const maybeAge: Option.Option<number> = Option.some(25)
const person = Option.gen(function*() {
const name = (yield* maybeName).toUpperCase()
const age = yield* maybeAge
return { name, age }
})
console.log(person)
// Output:
// { _id: 'Option', _tag: 'Some', value: { name: 'JOHN', age: 25 } }export const const gen: Gen.Gen<OptionTypeLambda>Provides generator-based syntax for Option, similar to async/await but for
optional values. Yielding a None short-circuits the generator to None.
When to use
Use when you need generator syntax for a sequence of Option steps that
should short-circuit on None.
Details
- Each
yield* unwraps a Some value or short-circuits to None
- The return value is wrapped in
Some
- No
Effect runtime is needed
Example (Sequencing Option computations with generator syntax)
import { Option } from "effect"
const maybeName: Option.Option<string> = Option.some("John")
const maybeAge: Option.Option<number> = Option.some(25)
const person = Option.gen(function*() {
const name = (yield* maybeName).toUpperCase()
const age = yield* maybeAge
return { name, age }
})
console.log(person)
// Output:
// { _id: 'Option', _tag: 'Some', value: { name: 'JOHN', age: 25 } }
gen: import GenGen.type Gen<F extends TypeLambda> = <
Self,
K extends
| Gen.Variance<F, any, any, any>
| Combiner<F, any, any, any, any>,
A
>(
...args:
| [
self: Self,
body: (
this: Self
) => Generator<K, A, never>
]
| [body: () => Generator<K, A, never>]
) => Combiner<
F,
[K] extends [Gen.Variance<F, infer R, any, any>]
? R
: [K] extends [
Combiner<F, infer R, any, any, any>
]
? R
: never,
[K] extends [Gen.Variance<F, any, infer O, any>]
? O
: [K] extends [
Combiner<F, any, infer O, any, any>
]
? O
: never,
[K] extends [Gen.Variance<F, any, any, infer E>]
? E
: [K] extends [
Combiner<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<OptionTypeLambda> = (...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 isNone: <A>(
self: Option<A>
) => self is None<A>
Checks whether an Option is None (absent).
When to use
Use when you need to branch on an absent Option before accessing .value.
Details
- Acts as a type guard, narrowing to
None<A>
Example (Checking for None)
import { Option } from "effect"
console.log(Option.isNone(Option.some(1)))
// Output: false
console.log(Option.isNone(Option.none()))
// Output: true
isNone(const current: anycurrent)) {
return const current: None<unknown>const current: {
_tag: "None";
_op: "None";
valueOrUndefined: undefined;
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.value as never)
}
return const some: <A>(value: A) => Option<A>Wraps the given value into an Option to represent its presence.
When to use
Use to wrap a known present value as Option
- Returning a successful result from a partial function
Details
- Always returns
Some<A>
- Does not filter
null or undefined; use
fromNullishOr
for that
Example (Wrapping a value)
import { Option } from "effect"
// ┌─── Option<number>
// ▼
const value = Option.some(1)
console.log(value)
// Output: { _id: 'Option', _tag: 'Some', value: 1 }
some(let state: IteratorReturnResult<any>state.IteratorReturnResult<any>.value: anyvalue)
}