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
});