/** * @since 1.0.0 */ import { identity } from "@effect/data/Function" import type { Kind, TypeLambda } from "@effect/data/HKT" /** * @category symbols * @since 1.0.0 */ export const GenKindTypeId = Symbol.for("@effect/data/Gen/GenKind") /** * @category symbols * @since 1.0.0 */ export type GenKindTypeId = typeof GenKindTypeId /** * @category models * @since 1.0.0 */ export interface GenKind extends Variance { readonly value: Kind [Symbol.iterator](): Generator, A> } /** * @category constructors * @since 1.0.0 */ export class GenKindImpl implements GenKind { constructor( /** * @since 1.0.0 */ readonly value: Kind ) {} /** * @since 1.0.0 */ get _F() { return identity } /** * @since 1.0.0 */ get _R() { return (_: R) => _ } /** * @since 1.0.0 */ get _O() { return (_: never): O => _ } /** * @since 1.0.0 */ get _E() { return (_: never): E => _ } /** * @since 1.0.0 */ readonly [GenKindTypeId]: typeof GenKindTypeId = GenKindTypeId; /** * @since 1.0.0 */ [Symbol.iterator](): Generator, A> { return new SingleShotGen, A>(this as any) } } /** * @category constructors * @since 1.0.0 */ export class SingleShotGen implements Generator { private called = false constructor(readonly self: T) {} /** * @since 1.0.0 */ next(a: A): IteratorResult { return this.called ? ({ value: a, done: true }) : (this.called = true, ({ value: this.self, done: false })) } /** * @since 1.0.0 */ return(a: A): IteratorResult { return ({ value: a, done: true }) } /** * @since 1.0.0 */ throw(e: unknown): IteratorResult { throw e } /** * @since 1.0.0 */ [Symbol.iterator](): Generator { return new SingleShotGen(this.self) } } /** * @category constructors * @since 1.0.0 */ export const makeGenKind = ( kind: Kind ): GenKind => new GenKindImpl(kind) /** * @category models * @since 1.0.0 */ export interface Variance { readonly [GenKindTypeId]: GenKindTypeId readonly _F: (_: F) => F readonly _R: (_: R) => unknown readonly _O: (_: never) => O readonly _E: (_: never) => E } /** * @category models * @since 1.0.0 */ export interface Gen { , A>( body: (resume: Z) => Generator ): Kind< F, [K] extends [Variance] ? R : never, [K] extends [Variance] ? O : never, [K] extends [Variance] ? E : never, A > } /** * @category models * @since 1.0.0 */ export interface Adapter { <_R, _O, _E, _A>( self: Kind ): GenKind (a: A, ab: (a: A) => Kind): GenKind (a: A, ab: (a: A) => B, bc: (b: B) => Kind): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: F) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (g: H) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => P, pq: (p: P) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => P, pq: (p: P) => Q, qr: (q: Q) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => P, pq: (p: P) => Q, qr: (q: Q) => R, rs: (r: R) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => P, pq: (p: P) => Q, qr: (q: Q) => R, rs: (r: R) => S, st: (s: S) => Kind ): GenKind ( a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, jk: (j: J) => K, kl: (k: K) => L, lm: (l: L) => M, mn: (m: M) => N, no: (n: N) => O, op: (o: O) => P, pq: (p: P) => Q, qr: (q: Q) => R, rs: (r: R) => S, st: (s: S) => T, tu: (s: T) => Kind ): GenKind } /** * @category adapters * @since 1.0.0 */ export const adapter: () => Adapter = () => // @ts-expect-error function() { let x = arguments[0] for (let i = 1; i < arguments.length; i++) { x = arguments[i](x) } return new GenKindImpl(x) }