import type * as P from "@principia/prelude";
import * as HKT from "@principia/prelude/HKT";
import type { Monoid } from "@principia/prelude/Monoid";
import type { URI, V } from "./model";
/*
* -------------------------------------------
* Foldable Identity
* -------------------------------------------
*/
export const reduce_ = (fa: A, b: B, f: (b: B, a: A) => B): B => f(b, fa);
export const reduce = (b: B, f: (b: B, a: A) => B) => (fa: A): B => f(b, fa);
export const foldMap_ = (_: Monoid) => (fa: A, f: (a: A) => M) => f(fa);
export const foldMap = (_: Monoid) => (f: (a: A) => M) => (fa: A): M => f(fa);
export const reduceRight_ = (fa: A, b: B, f: (a: A, b: B) => B): B => f(fa, b);
export const reduceRight = (b: B, f: (a: A, b: B) => B) => (fa: A): B => f(fa, b);
export const Foldable: P.Foldable<[URI], V> = HKT.instance({
reduce_: reduce_,
reduce,
foldMap_: foldMap_,
foldMap,
reduceRight_: reduceRight_,
reduceRight
});