/** * @since 0.24.0 */ import { dual, identity } from "effect/Function" import type { Kind, TypeClass, TypeLambda } from "effect/HKT" import type { Covariant } from "./Covariant.js" /** * @category type class * @since 0.24.0 */ export interface Bicovariant extends TypeClass { readonly bimap: { ( f: (e: E1) => E2, g: (a: A) => B ): (self: Kind) => Kind ( self: Kind, f: (e: E1) => E2, g: (a: A) => B ): Kind } } /** * Returns a default ternary `bimap` composition. * * @since 0.24.0 */ export const bimapComposition = ( CovariantF: Covariant, BicovariantG: Bicovariant ) => ( self: Kind>, f: (e: E1) => E2, g: (a: A) => B ): Kind> => CovariantF.map(self, BicovariantG.bimap(f, g)) /** * Returns a default `mapLeft` implementation. * * @since 0.24.0 */ export const mapLeft = ( F: Bicovariant ): { (f: (e: E) => G): (self: Kind) => Kind (self: Kind, f: (e: E) => G): Kind } => dual( 2, (self: Kind, f: (e: E) => G): Kind => F.bimap(self, f, identity) ) /** * Returns a default `map` implementation. * * @since 0.24.0 */ export const map = ( F: Bicovariant ): Covariant["map"] => dual( 2, (self: Kind, f: (a: A) => B): Kind => F.bimap(self, identity, f) )