// ets_tracing: off import "../Operator/index.js" import { pipe } from "../Function/index.js" import type { IxURI } from "../Modules/index.js" import { chainF, succeedF } from "../Prelude/DSL/index.js" import * as HKT from "../Prelude/HKT/index.js" import type { Monad } from "../Prelude/Monad/index.js" export interface IxC { Ix: { _I: I _O: O } } export type IxCT = Omit & IxC export type Inner, ...HKT.URIS]> = (( ...x: F ) => any) extends (x: infer H, ...r: infer Rest) => any ? Rest extends HKT.URIS ? Rest : never : never export interface Indexed< F extends [HKT.URI, ...HKT.URIS], C extends IxC > { iof: () => < A, K = HKT.Initial, Q = HKT.Initial, W = HKT.Initial, X = HKT.Initial, I = HKT.Initial, S = HKT.Initial, R = HKT.Initial, E = HKT.Initial >( a: A ) => HKT.Kind, K, Q, W, X, I, S, R, E, A> lift: () => < N extends string, K, Q, W, X, I, S, R, E, A >( fa: HKT.Kind, C, K, Q, W, X, I, S, R, E, A> ) => HKT.Kind, K, Q, W, X, I, S, R, E, A> lower: () => < K, Q, W, X, I, S, R, E, A >( fa: HKT.Kind, K, Q, W, X, I, S, R, E, A> ) => HKT.Kind, C, K, Q, W, X, I, S, R, E, A> ichain< IO extends C[IxURI]["_O"], IO2 extends C[IxURI]["_I"], K2, Q2, W2, X2, I2, S2, R2, E2, A, B >( f: (a: A) => HKT.Kind, K2, Q2, W2, X2, I2, S2, R2, E2, B> ): ( fa: HKT.Kind< F, IxCT, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, A > ) => HKT.Kind< F, IxCT, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, B > chain< IO extends C[IxURI]["_O"], N2 extends string, K2, Q2, W2, X2, I2, S2, R2, E2, A, B >( f: (a: A) => HKT.Kind, K2, Q2, W2, X2, I2, S2, R2, E2, B> ): ( fa: HKT.Kind< F, IxCT, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, A > ) => HKT.Kind< F, IxCT, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, B > chainLower( f: (a: A) => HKT.Kind, C, K2, Q2, W2, X2, I2, S2, R2, E2, B> ): < N extends string, II extends C[IxURI]["_I"], IO extends C[IxURI]["_O"], K, Q, W, X, I, S, R, E >( fa: HKT.Kind< F, IxCT, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, HKT.Intro, A > ) => HKT.Kind< F, IxCT, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, HKT.Mix, B > } export class Ix { readonly _I!: I readonly _O!: O constructor(readonly value: A) {} } export function makeIx() { return (a: A): Ix => new Ix(a) } export type IndexedT = Indexed< [HKT.URI, F[0], ...HKT.Rest], IxCT > export function indexedF<_I, _O = _I>() { return (F: Monad): IndexedT => indexed_<_I, _O, F, C>(F) } function indexed_<_I, _O, F extends HKT.URIS, C = HKT.Auto>( F: Monad ): IndexedT function indexed_<_I, _O, F>( F: Monad, HKT.Auto> ): IndexedT, HKT.Auto, _I, _O> { return HKT.instance, HKT.Auto, _I, _O>>({ iof: () => (a: A): Ix> => makeIx()(succeedF(F)(a)), ichain: (f: (a: A) => Ix>) => (fa: Ix>): Ix> => pipe( fa.value, chainF(F)((a) => f(a).value), makeIx() ), lift: () => (fa: HKT.HKT): Ix> => makeIx()(fa), lower: () => (fa) => fa.value, chain: (f: (a: A) => Ix>) => (fa: Ix>): Ix> => pipe( fa.value, chainF(F)((a) => f(a).value), makeIx() ), chainLower: (f: (a: A) => HKT.HKT) => ( fa: Ix> ): Ix> => pipe(fa.value, chainF(F)(f), makeIx()) }) }