EdgeAIG's picture
download
raw
5.03 kB
/**
* Internal and advanced utilities used by Effect's generator-based syntax and
* higher-kinded type support. This is not a general-purpose utility module for
* application code.
*
* `SingleShotGen` makes an Effect-style value work with `yield*` inside
* generator helpers. `Variance` and `Gen` provide the type-level signatures
* used by modules such as `Effect`, `Option`, and `Result` to type their
* `gen` APIs.
*
* @since 2.0.0
*/
import type { Kind, TypeLambda } from "./HKT.ts";
import type * as Types from "./Types.ts";
/**
* Yields its wrapped value exactly once through an `IterableIterator`.
*
* **When to use**
*
* Use to implement `[Symbol.iterator]()` on Effect-like types so they can be
* `yield*`-ed inside generator functions, such as `Effect.gen` and
* `Option.gen`.
*
* **Details**
*
* The first call to `next()` returns `{ value: self, done: false }`. Every
* subsequent call returns `{ value: a, done: true }` where `a` is the argument
* passed to `next()`. `[Symbol.iterator]()` returns a **new** `SingleShotGen`
* wrapping the same value, so the outer type can be iterated multiple times.
*
* **Example** (Yielding a wrapped value in a generator)
*
* ```ts
* import { Utils } from "effect"
*
* const gen = new Utils.SingleShotGen<string, number>("hello")
*
* // First call yields the wrapped value
* console.log(gen.next(0))
* // { value: "hello", done: false }
*
* // Second call signals completion with the provided value
* console.log(gen.next(42))
* // { value: 42, done: true }
* ```
*
* @see {@link Gen} for the type-level signature that relies on `SingleShotGen`
* @category constructors
* @since 2.0.0
*/
export declare class SingleShotGen<T, A> implements IterableIterator<T, A> {
private called;
readonly self: T;
constructor(self: T);
/**
* Yields the stored value once, then completes with the value sent back in.
*
* **When to use**
*
* Use to advance a `SingleShotGen` through its single yield and completion
* step.
*
* @since 2.0.0
*/
next(a: A): IteratorResult<T, A>;
/**
* Creates a fresh single-shot iterator over the stored value.
*
* **When to use**
*
* Use to iterate the wrapped value again without reusing the consumed
* iterator state.
*
* @since 2.0.0
*/
[Symbol.iterator](): IterableIterator<T, A>;
}
/**
* Type-level marker encoding the variance of a `TypeLambda`'s type
* parameters.
*
* **When to use**
*
* Use to define variance constraints for a higher-kinded type so that
* {@link Gen} can correctly infer `R`, `O`, and `E` from yielded values.
*
* **Details**
*
* `F` is invariant and must match exactly. `R` is contravariant in the input
* or environment position. `O` and `E` are covariant in the output and error
* positions. This is a pure type-level construct with no runtime
* representation.
*
* **Example** (Declaring variance for a TypeLambda)
*
* ```ts
* import type { Option, Utils } from "effect"
*
* declare const variance: Utils.Variance<
* Option.OptionTypeLambda,
* never,
* never,
* never
* >
* ```
*
* @see {@link Gen} for the type-level signature that uses `Variance`
* @category models
* @since 2.0.0
*/
export interface Variance<in out F extends TypeLambda, in R, out O, out E> {
readonly _F: Types.Invariant<F>;
readonly _R: Types.Contravariant<R>;
readonly _O: Types.Covariant<O>;
readonly _E: Types.Covariant<E>;
}
/**
* 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 {@link Variance} or `Kind` constraints. The
* generator's return type `A` becomes the output's `A` parameter.
*
* **Example** (Typing a gen function for Option)
*
* ```ts
* import type { Option, Utils } from "effect"
*
* declare const gen: Utils.Gen<Option.OptionTypeLambda>
* ```
*
* @see {@link Variance} for encoding the variance used for inference
* @see {@link SingleShotGen} for the iterator protocol that makes yielding work
* @category models
* @since 2.0.0
*/
export type Gen<F extends TypeLambda> = <Self, K extends Variance<F, any, any, any> | Kind<F, any, any, any, any>, A>(...args: [
self: Self,
body: (this: Self) => Generator<K, A, never>
] | [
body: () => Generator<K, A, never>
]) => Kind<F, [
K
] extends [Variance<F, infer R, any, any>] ? R : [K] extends [Kind<F, infer R, any, any, any>] ? R : never, [
K
] extends [Variance<F, any, infer O, any>] ? O : [K] extends [Kind<F, any, infer O, any, any>] ? O : never, [
K
] extends [Variance<F, any, any, infer E>] ? E : [K] extends [Kind<F, any, any, infer E, any>] ? E : never, A>;
//# sourceMappingURL=Utils.d.ts.map

Xet Storage Details

Size:
5.03 kB
·
Xet hash:
7a7c01fa88ab6993ae1125bdb9703e523d0da2fd407aa3e5f82bccc901f50d1e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.