import type { Predicate, Refinement } from "../Function"; import type { FreeMonoid } from "./model"; /* * ------------------------------------------- * FreeSemigroup Constructors * ------------------------------------------- */ /** * @category Constructors * @since 1.0.0 */ export const combine = (left: FreeMonoid, right: FreeMonoid): FreeMonoid => ({ _tag: "Combine", left, right }); /** * @category Constructors * @since 1.0.0 */ export const element = (a: A): FreeMonoid => ({ _tag: "Element", value: a }); /** * @category Constructors * @since 1.0.0 */ export const empty = (): FreeMonoid => ({ _tag: "Empty" }); /** * @category Constructors * @since 1.0.0 */ export const filter_: { (fa: FreeMonoid, f: Refinement): FreeMonoid; (fa: FreeMonoid, f: Predicate): FreeMonoid; } = (fa: FreeMonoid, f: Predicate): FreeMonoid => ({ _tag: "Filter", fa, f }); /** * @category Constructors * @since 1.0.0 */ export const filter: { (f: Refinement): (fa: FreeMonoid) => FreeMonoid; (f: Predicate): (fa: FreeMonoid) => FreeMonoid; } = (f: Predicate) => (fa: FreeMonoid): FreeMonoid => ({ _tag: "Filter", fa, f }); export const map_ = (fa: FreeMonoid, f: (a: A) => A): FreeMonoid => ({ _tag: "Map", fa, f }); export const map = (f: (a: A) => A) => (fa: FreeMonoid): FreeMonoid => ({ _tag: "Map", fa, f });