import * as HKT from './HKT' export interface Invariant extends HKT.Base { readonly invmap_: InvMapFn_ readonly invmap: InvMapFn } export interface InvariantComposition extends HKT.CompositionBase2 { readonly invmap_: InvMapFnComposition_ readonly invmap: InvMapFnComposition } export function getInvariantComposition( F: Invariant, G: Invariant ): InvariantComposition export function getInvariantComposition(F: Invariant>, G: Invariant>) { return HKT.instance, HKT.UHKT>>({ invmap_: (fga, f, g) => F.invmap_(fga, G.invmap(f, g), G.invmap(g, f)), invmap: (f, g) => F.invmap(G.invmap(f, g), G.invmap(g, f)) }) } export interface InvMapFn { (f: (a: A) => B, g: (b: B) => A): ( fa: HKT.Kind ) => HKT.Kind } export interface InvMapFn_ { ( fa: HKT.Kind, f: (a: A) => B, g: (b: B) => A ): HKT.Kind } export interface InvMapFnComposition { (f: (a: A) => B, g: (b: B) => A): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG >( fga: HKT.Kind> ) => HKT.Kind> } export interface InvMapFnComposition_ { ( fga: HKT.Kind>, f: (a: A) => B, g: (b: B) => A ): HKT.Kind> }