import type { Monoid } from './Monoid' import * as HKT from './HKT' export interface FoldableWithIndex extends HKT.Base { readonly ifoldl_: FoldLeftWithIndexFn_ readonly ifoldl: FoldLeftWithIndexFn readonly ifoldMap_: FoldMapWithIndexFn_ readonly ifoldMap: FoldMapWithIndexFn readonly ifoldr_: FoldRightWithIndexFn_ readonly ifoldr: FoldRightWithIndexFn } export type FoldableWithIndexMin = { readonly ifoldl_: FoldLeftWithIndexFn_ readonly ifoldr_: FoldRightWithIndexFn_ readonly ifoldMap_: FoldMapWithIndexFn_ } export function FoldableWithIndex( F: FoldableWithIndexMin ): FoldableWithIndex { return HKT.instance>({ ifoldl_: F.ifoldl_, ifoldl: (b, f) => (fa) => F.ifoldl_(fa, b, f), ifoldr_: F.ifoldr_, ifoldr: (b, f) => (fa) => F.ifoldr_(fa, b, f), ifoldMap_: F.ifoldMap_, ifoldMap: (M) => (f) => (fa) => F.ifoldMap_(M)(fa, f) }) } export interface FoldableWithIndexComposition extends HKT.CompositionBase2 { readonly ifoldl_: FoldLeftWithIndexFnComposition_ readonly ifoldl: FoldLeftWithIndexFnComposition readonly ifoldMap_: FoldMapWithIndexFnComposition_ readonly ifoldMap: FoldMapWithIndexFnComposition readonly ifoldr_: FoldRightWithIndexFnComposition_ readonly ifoldr: FoldRightWithIndexFnComposition } export function getFoldableWithIndexComposition( F: FoldableWithIndex, G: FoldableWithIndex ): FoldableWithIndexComposition export function getFoldableWithIndexComposition( F: FoldableWithIndex>, G: FoldableWithIndex> ) { const ifoldl_: FoldLeftWithIndexFnComposition_, HKT.UHKT> = ( fga: HKT.HKT>, b: B, f: (b: B, k: [KF, KG], a: A) => B ) => F.ifoldl_(fga, b, (b: B, fi: KF, ga: HKT.HKT) => G.ifoldl_(ga, b, (b: B, gi: KG, a: A) => f(b, [fi, gi], a))) const ifoldMap_: FoldMapWithIndexFnComposition_, HKT.UHKT> = (M: Monoid) => ( fga: HKT.HKT>, f: (k: [KF, KG], a: A) => M ) => F.ifoldMap_(M)(fga, (kf: KF, ga) => G.ifoldMap_(M)(ga, (kg: KG, a) => f([kf, kg], a))) const ifoldr_: FoldRightWithIndexFnComposition_, HKT.UHKT> = ( fga: HKT.HKT>, b: B, f: (a: A, k: [KF, KG], b: B) => B ) => F.ifoldr_(fga, b, (ga: HKT.HKT, fi: KF, b) => G.ifoldr_(ga, b, (a: A, gi: KG, b) => f(a, [fi, gi], b))) return HKT.instance, HKT.UHKT>>({ ifoldl_, ifoldMap_, ifoldr_, ifoldl: (b, f) => (fga) => ifoldl_(fga, b, f), ifoldMap: (M) => (f) => (fga) => ifoldMap_(M)(fga, f), ifoldr: (b, f) => (fga) => ifoldr_(fga, b, f) }) } export interface FoldLeftWithIndexFn { ( b: B, f: (b: B, i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => B ): (fa: HKT.Kind) => B } export interface FoldLeftWithIndexFn_ { ( fa: HKT.Kind, b: B, f: (b: B, i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => B ): B } export interface FoldLeftWithIndexFnComposition { ( b: B, f: ( b: B, i: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], a: A ) => B ): ( fga: HKT.Kind> ) => B } export interface FoldLeftWithIndexFnComposition_ { ( fga: HKT.Kind>, b: B, f: ( b: B, i: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], a: A ) => B ): B } export interface FoldRightWithIndexFn { ( b: B, f: (a: A, k: HKT.IndexFor, HKT.OrFix<'K', C, K>>, b: B) => B ): (fa: HKT.Kind) => B } export interface FoldRightWithIndexFn_ { ( fa: HKT.Kind, b: B, f: (a: A, k: HKT.IndexFor, HKT.OrFix<'K', C, K>>, b: B) => B ): B } export interface FoldRightWithIndexFnComposition { ( b: B, f: ( a: A, k: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], b: B ) => B ): ( fga: HKT.Kind> ) => B } export interface FoldRightWithIndexFnComposition_< F extends HKT.URIS, G extends HKT.URIS, CF = HKT.Auto, CG = HKT.Auto > { ( fga: HKT.Kind>, b: B, f: ( a: A, k: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], b: B ) => B ): B } export interface FoldMapWithIndexFn { (M: Monoid): ( f: (k: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => M ) => (fa: HKT.Kind) => M } export interface FoldMapWithIndexFn_ { (M: Monoid): ( fa: HKT.Kind, f: (k: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => M ) => M } export interface FoldMapWithIndexFnComposition { (M: Monoid): ( f: ( k: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], a: A ) => M ) => ( fga: HKT.Kind> ) => M } export interface FoldMapWithIndexFnComposition_ { (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: ( k: [ HKT.IndexFor, HKT.OrFix<'K', CF, KF>>, HKT.IndexFor, HKT.OrFix<'K', CG, KG>> ], a: A ) => M ) => M }