import type { Monoid } from './Monoid' import * as HKT from './HKT' export interface Foldable extends HKT.Base { readonly foldl_: FoldLeftFn_ readonly foldl: FoldLeftFn readonly foldMap_: FoldMapFn_ readonly foldMap: FoldMapFn readonly foldr_: FoldRightFn_ readonly foldr: FoldRightFn } export type FoldableMin = { readonly foldl_: FoldLeftFn_ readonly foldr_: FoldRightFn_ readonly foldMap_: FoldMapFn_ } export function Foldable(F: FoldableMin): Foldable { return HKT.instance>({ foldl_: F.foldl_, foldl: (b, f) => (fa) => F.foldl_(fa, b, f), foldr_: F.foldr_, foldr: (b, f) => (fa) => F.foldr_(fa, b, f), foldMap_: F.foldMap_, foldMap: (M) => (f) => (fa) => F.foldMap_(M)(fa, f) }) } export interface FoldableComposition extends HKT.CompositionBase2 { readonly foldl_: FoldLeftFnComposition_ readonly foldl: FoldLeftFnComposition readonly foldMap_: FoldMapFnComposition_ readonly foldMap: FoldMapFnComposition readonly foldr_: FoldRightFnComposition_ readonly foldr: FoldRightFnComposition } export function getFoldableComposition( F: Foldable, G: Foldable ): FoldableComposition export function getFoldableComposition( F: Foldable>, G: Foldable> ): FoldableComposition, HKT.UHKT> { return Foldable<[...HKT.MapURIS>, ...HKT.MapURIS>]>({ foldl_: (fga, b, f) => F.foldl_(fga, b, (b, ga) => G.foldl_(ga, b, f)), foldr_: (fga, b, f) => F.foldr_(fga, b, (ga, b) => G.foldr_(ga, b, f)), foldMap_: (M) => (fga, f) => F.foldMap_(M)(fga, (ga) => G.foldMap_(M)(ga, f)) }) } export interface FoldLeftFn { (b: B, f: (b: B, a: A) => B): ( fa: HKT.Kind ) => B } export interface FoldLeftFn_ { ( fa: HKT.Kind, b: B, f: (b: B, a: A) => B ): B } export interface FoldLeftFnComposition { (b: B, f: (b: B, a: A) => B): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG >( fga: HKT.Kind> ) => B } export interface FoldLeftFnComposition_ { ( fga: HKT.Kind>, b: B, f: (b: B, a: A) => B ): B } export interface FoldRightFn { (b: B, f: (a: A, b: B) => B): ( fa: HKT.Kind ) => B } export interface FoldRightFn_ { ( fa: HKT.Kind, b: B, f: (a: A, b: B) => B ): B } export interface FoldRightFnComposition { (b: B, f: (a: A, b: B) => B): < FN extends string, FK, FQ, FW, FX, FI, FS, FR, FE, GN extends string, GK, GQ, GW, GX, GI, GS, GR, GE >( fa: HKT.Kind> ) => B } export interface FoldRightFnComposition_ { ( fa: HKT.Kind>, b: B, f: (a: A, b: B) => B ): B } export interface FoldMapFn { (M: Monoid): ( f: (a: A) => M ) => (fa: HKT.Kind) => M } export interface FoldMapFn_ { (M: Monoid): ( fa: HKT.Kind, f: (a: A) => M ) => M } export interface FoldMapFnComposition { (M: Monoid): ( f: (a: A) => M ) => ( fga: HKT.Kind> ) => M } export interface FoldMapFnComposition_ { (M: Monoid): < NF extends string, KF, QF, WF, XF, IF, SF, RF, EF, NG extends string, KG, QG, WG, XG, IG, SG, RG, EG, A >( fga: HKT.Kind>, f: (a: A) => M ) => M }