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