import { HKT, Kind, Kind2, Kind3, URIS, URIS2, URIS3 } from 'fp-ts/lib/HKT' import { Monad, Monad1, Monad2, Monad2C, Monad3 } from 'fp-ts/lib/Monad' declare type EnforceNonEmptyRecord = keyof R extends never ? never : R /** * @since 0.1.0 */ export interface Do3 { do: (ma: Kind3) => Do3C doL: (f: (s: S) => Kind3) => Do3C bind: ( name: Exclude, ma: Kind3 ) => Do3C< M, S & { [K in N]: A }, R, E > bindL: ( name: Exclude, f: (s: S) => Kind3 ) => Do3C< M, S & { [K in N]: A }, R, E > let: ( name: Exclude, a: A ) => Do3C< M, S & { [K in N]: A }, R, E > letL: ( name: Exclude, f: (s: S) => A ) => Do3C< M, S & { [K in N]: A }, R, E > sequenceS: >>( r: EnforceNonEmptyRecord & Record> & { [K in keyof S]?: never } ) => Do3C< M, S & { [K in keyof I]: [I[K]] extends [Kind3] ? A : never }, R, E > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & Record> & { [K in keyof S]?: never } ) => Do3C< M, S & { [K in keyof I]: [I[K]] extends [Kind3] ? A : never }, R, E > return: (f: (s: S) => A) => Kind3 done: () => Kind3 } /** * @since 0.1.0 */ export interface Do3C { do: (ma: Kind3) => Do3C doL: (f: (s: S) => Kind3) => Do3C bind: ( name: Exclude, ma: Kind3 ) => Do3C< M, S & { [K in N]: A }, R, E > bindL: ( name: Exclude, f: (s: S) => Kind3 ) => Do3C< M, S & { [K in N]: A }, R, E > let: ( name: Exclude, a: A ) => Do3C< M, S & { [K in N]: A }, R, E > letL: ( name: Exclude, f: (s: S) => A ) => Do3C< M, S & { [K in N]: A }, R, E > sequenceS: >>( r: EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do3C< M, S & { [K in keyof I]: [I[K]] extends [Kind3] ? A : never }, R, E > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do3C< M, S & { [K in keyof I]: [I[K]] extends [Kind3] ? A : never }, R, E > return: (f: (s: S) => A) => Kind3 done: () => Kind3 } /** * @since 0.1.0 */ export interface Do2 { do: (ma: Kind2) => Do2C doL: (f: (s: S) => Kind2) => Do2C bind: ( name: Exclude, ma: Kind2 ) => Do2C< M, S & { [K in N]: A }, E > bindL: ( name: Exclude, f: (s: S) => Kind2 ) => Do2C< M, S & { [K in N]: A }, E > let: ( name: Exclude, a: A ) => Do2C< M, S & { [K in N]: A }, E > letL: ( name: Exclude, f: (s: S) => A ) => Do2C< M, S & { [K in N]: A }, E > sequenceS: >>( r: EnforceNonEmptyRecord & Record> & { [K in keyof S]?: never } ) => Do2C< M, S & { [K in keyof I]: [I[K]] extends [Kind2] ? A : never }, E > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & Record> & { [K in keyof S]?: never } ) => Do2C< M, S & { [K in keyof I]: [I[K]] extends [Kind2] ? A : never }, E > return: (f: (s: S) => A) => Kind2 done: () => Kind2 } /** * @since 0.1.0 */ export interface Do2C { do: (ma: Kind2) => Do2C doL: (f: (s: S) => Kind2) => Do2C bind: ( name: Exclude, ma: Kind2 ) => Do2C< M, S & { [K in N]: A }, E > bindL: ( name: Exclude, f: (s: S) => Kind2 ) => Do2C< M, S & { [K in N]: A }, E > let: ( name: Exclude, a: A ) => Do2C< M, S & { [K in N]: A }, E > letL: ( name: Exclude, f: (s: S) => A ) => Do2C< M, S & { [K in N]: A }, E > sequenceS: >>( r: EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do2C< M, S & { [K in keyof I]: [I[K]] extends [Kind2] ? A : never }, E > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do2C< M, S & { [K in keyof I]: [I[K]] extends [Kind2] ? A : never }, E > return: (f: (s: S) => A) => Kind2 done: () => Kind2 } /** * @since 0.1.0 */ export interface Do1 { do: (ma: Kind) => Do1 doL: (f: (s: S) => Kind) => Do1 bind: ( name: Exclude, ma: Kind ) => Do1< M, S & { [K in N]: A } > bindL: ( name: Exclude, f: (s: S) => Kind ) => Do1< M, S & { [K in N]: A } > let: ( name: Exclude, a: A ) => Do1< M, S & { [K in N]: A } > letL: ( name: Exclude, f: (s: S) => A ) => Do1< M, S & { [K in N]: A } > sequenceS: >>( r: EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do1< M, S & { [K in keyof R]: [R[K]] extends [Kind] ? A : never } > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do1< M, S & { [K in keyof I]: [I[K]] extends [Kind] ? A : never } > return: (f: (s: S) => A) => Kind done: () => Kind } /** * @since 0.1.0 */ export interface Do0 { do: (ma: HKT) => Do0 doL: (f: (s: S) => HKT) => Do0 bind: ( name: Exclude, ma: HKT ) => Do0< M, S & { [K in N]: A } > bindL: ( name: Exclude, f: (s: S) => HKT ) => Do0< M, S & { [K in N]: A } > let: ( name: Exclude, a: A ) => Do0< M, S & { [K in N]: A } > letL: ( name: Exclude, f: (s: S) => A ) => Do0< M, S & { [K in N]: A } > sequenceS: >>( r: EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do0< M, S & { [K in keyof R]: [R[K]] extends [HKT] ? A : never } > sequenceSL: >>( f: ( s: S ) => EnforceNonEmptyRecord & { [K in keyof S]?: never } ) => Do0< M, S & { [K in keyof R]: [R[K]] extends [HKT] ? A : never } > return: (f: (s: S) => A) => HKT done: () => HKT } /** * This function provides a simulation of Haskell do notation. The `bind` / `bindL` functions contributes to a threaded * scope that is available to each subsequent step. The `do` / `doL` functions can be used to perform computations that * add nothing to the scope. The `return` function lifts the given callback to the monad context. Finally the `done` * function returns the scope. * * @example * import { option, some } from 'fp-ts/Option' * import { Do } from 'fp-ts-contrib/Do' * * // x: Option * const x = Do(option) // <- a monad instance * .bindL('foo', () => some('bar')) * .bindL('baz', () => some(4)) * .return(({ foo, baz }) => foo.length + baz) * * assert.deepStrictEqual(x, some(7)) * * @since 0.0.2 */ export declare function Do(M: Monad3): Do3 export declare function Do(M: Monad2): Do2 export declare function Do(M: Monad2C): Do2C export declare function Do(M: Monad1): Do1 export declare function Do(M: Monad): Do0 export {}