import type * as P from "@principia/prelude"; import * as HKT from "@principia/prelude/HKT"; import { make } from "./constructors"; import { map, map_ } from "./functor"; import type { Const, URI, V } from "./model"; /* * ------------------------------------------- * Bifunctor Const * ------------------------------------------- */ export const bimap_ = (pab: Const, f: (e: E) => D, _: (a: A) => B): Const => make(f(pab)); export const bimap = (f: (e: E) => D, g: (a: A) => B) => (pab: Const): Const => bimap_(pab, f, g); export const first_ = (pab: Const, f: (e: E) => D): Const => make(f(pab)); export const first = (f: (e: E) => D) => (pab: Const): Const => make(f(pab)); /** * @category Bifunctor * @since 1.0.0 */ export const Bifunctor: P.Bifunctor<[URI], V> = HKT.instance({ bimap_: bimap_, bimap, first_: first_, first, second_: map_, second: map });