rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
27 lines (23 loc) • 935 B
TypeScript
import type { Monad, Monad$GetTypeClassW } from ".";
import type { Args, Call1W, GenericFn, GenericResolver } from "../../HKT";
import type { HKT$Extract, HKT$ExtractW, HKT$Mutate } from "../HKT";
/**
* Flatten a {@link Monad} of a {@link Monad} into a {@link Monad}.
*
* Sig: `<F<~>, T>(f: F<F<T>>) => F<T>`
*/
export type Flatten<F extends Monad<Monad>> = Call1W<Monad$GetTypeClassW<F>["Flatten"], F>;
interface Resolver extends GenericResolver<[Monad<Monad>], Monad> {
on1: ([f]: Args<this>) => [[], HKT$Mutate<typeof f, HKT$ExtractW<HKT$Extract<typeof f>>>];
on_r: ([, r]: Args<this>) => [
HKT$Mutate<typeof r, typeof r> extends infer R extends Monad<Monad> ? R : never,
];
}
/**
* [Fn] Flatten a {@link Monad} of a {@link Monad} into a {@link Monad}.
*
* Sig: `<F<~>, T>(f: F<F<T>>) => F<T>`
*/
export default interface FlattenFn extends GenericFn<Resolver> {
def: ([f]: Args<this>) => Flatten<typeof f>;
}