import type { FunctorMin } from './Functor' import { Functor } from './Functor' import * as HKT from './HKT' export interface Extend extends Functor { readonly extend_: ExtendFn_ readonly extend: ExtendFn } export type ExtendMin = FunctorMin & { readonly extend_: ExtendFn_ } export function Extend(F: ExtendMin): Extend { return HKT.instance({ ...Functor(F), extend_: F.extend_, extend: (f) => (wa) => F.extend_(wa, f) }) } export interface ExtendFn { (f: (wa: HKT.Kind) => B): ( wa: HKT.Kind ) => HKT.Kind } export interface ExtendFn_ { ( wa: HKT.Kind, f: (wa: HKT.Kind) => B ): HKT.Kind }