import * as HKT from './HKT' export interface Functor extends HKT.Base { readonly map_: MapFn_ readonly map: MapFn readonly flap_: FlapFn_ readonly flap: FlapFn readonly as_: AsFn_ readonly as: AsFn readonly fcross_: FCrossFn_ readonly fcross: FCrossFn } export type FunctorMin = { readonly map_: MapFn_ } export function Functor(F: FunctorMin): Functor { const flap_ = flapF_(F) const as_ = asF_(F) const fcross_ = fcrossF_(F) return HKT.instance>({ map_: F.map_, map: (f) => (fa) => F.map_(fa, f), flap_, flap: (a) => (fab) => flap_(fab, a), as_, as: (b) => (fa) => as_(fa, b), fcross_, fcross: (f) => (fa) => fcross_(fa, f) }) } export interface Functor2 extends HKT.CompositionBase2 { readonly map_: MapFn2_ readonly map: MapFn2 } export function getFunctorComposition( F: Functor, G: Functor ): Functor2 { const map_: MapFn2_ = (fga, f) => F.map_(fga, (ga) => G.map_(ga, f)) return HKT.instance>({ map_, map: (f) => (fga) => map_(fga, f) }) } export interface MapFn { (f: (a: A) => B): ( fa: HKT.Kind ) => HKT.Kind } export interface MapFn_ { ( fa: HKT.Kind, f: (a: A) => B ): HKT.Kind } export interface MapFn2 { (f: (a: A) => B): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG >( fa: HKT.Kind> ) => HKT.Kind> } export interface MapFn2_ { ( fa: HKT.Kind>, f: (a: A) => B ): HKT.Kind> } export interface FlapFn_ { ( fab: HKT.Kind B>, a: A ): HKT.Kind } export interface FlapFn { (a: A): ( fab: HKT.Kind B> ) => HKT.Kind } export interface FlapFn2 { (a: A): ( fa: HKT.Kind< F, CF, NF, KF, QF, WF, XF, IF, SF, RF, EF, HKT.Kind B> > ) => HKT.Kind> } export interface FlapFn2_ { ( fa: HKT.Kind< F, CF, NF, KF, QF, WF, XF, IF, SF, RF, EF, HKT.Kind B> >, a: A ): HKT.Kind> } export function flapF_(F: FunctorMin): FlapFn_ { return (fab, a) => F.map_(fab, (f) => f(a)) } export function flapF(F: Functor): FlapFn { const flap_ = flapF_(F) return (a) => (fab) => flap_(fab, a) } export interface AsFn_ { ( fa: HKT.Kind, b: () => B ): HKT.Kind } export interface AsFn { (b: () => B): ( fa: HKT.Kind ) => HKT.Kind } export interface AsFn2 { (b: () => B): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG, A >( fa: HKT.Kind> ) => HKT.Kind> } export interface AsFn2_ { ( fa: HKT.Kind>, b: () => B ): HKT.Kind> } export function asF_(F: FunctorMin): AsFn_ { return (fa, b) => F.map_(fa, b) } export function asF(F: Functor): AsFn { return (b) => (fa) => F.map_(fa, b) } export interface FCrossFn_ { ( fa: HKT.Kind, f: (a: A) => B ): HKT.Kind } export interface FCrossFn { (f: (a: A) => B): ( fa: HKT.Kind ) => HKT.Kind } export interface FCrossFn2 { (f: (a: A) => B): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG >( fa: HKT.Kind> ) => HKT.Kind< F, CF, NF, KF, QF, WF, XF, IF, SF, RF, EF, HKT.Kind > } export interface FCrossFn2_ { ( fa: HKT.Kind>, f: (a: A) => B ): HKT.Kind< F, CF, NF, KF, QF, WF, XF, IF, SF, RF, EF, HKT.Kind > } export function fcrossF_(F: FunctorMin): FCrossFn_ { return (fa, f) => F.map_(fa, (a) => [a, f(a)]) } export function fcrossF(F: Functor): FCrossFn { return (f) => (fa) => F.map_(fa, (a) => [a, f(a)]) } export interface BindToSFn { (name: BN): ( fa: HKT.Kind ) => HKT.Kind } export function bindToSF(F: Functor): BindToSFn { return (name) => F.map((a) => ({ [name]: a })) } export interface TupledFn { (fa: HKT.Kind): HKT.Kind< F, C, N, K, Q, W, X, I, S, R, E, readonly [A] > } export function tupledF(F: Functor): TupledFn { return F.map((a) => [a]) }