import type { SemimonoidalFunctor2, SemimonoidalFunctorMin } from './SemimonoidalFunctor' import type { Unit, Unit2, UnitMin } from './Unit' import { flow } from './function' import * as HKT from './HKT' import { getSemimonoidalFunctorComposition, SemimonoidalFunctor } from './SemimonoidalFunctor' export interface MonoidalFunctor extends SemimonoidalFunctor, Unit {} export type MonoidalFunctorMin = SemimonoidalFunctorMin & UnitMin export function MonoidalFunctor(F: MonoidalFunctorMin): MonoidalFunctor { return HKT.instance>({ ...SemimonoidalFunctor(F), unit: F.unit }) } export interface MonoidalFunctor2 extends SemimonoidalFunctor2, Unit2 {} export function getMonoidalFunctorComposition( F: MonoidalFunctor, G: MonoidalFunctor ): MonoidalFunctor2 { return HKT.instance({ ...getSemimonoidalFunctorComposition(F, G), unit: flow(G.unit, F.unit) }) }