import type { Either } from './Either' import type { FunctorWithIndexMin } from './FunctorWithIndex' import type { Option } from './Option' import type { PredicateWithIndex } from './Predicate' import type { RefinementWithIndex } from './Refinement' import * as E from './Either' import { FunctorWithIndex } from './FunctorWithIndex' import * as HKT from './HKT' import * as O from './Option' export interface FilterableWithIndex extends FunctorWithIndex { readonly ipartitionMap_: PartitionMapWithIndexFn_ readonly ipartition_: PartitionWithIndexFn_ readonly ifilterMap_: FilterMapWithIndexFn_ readonly ifilter_: FilterWithIndexFn_ readonly ipartitionMap: PartitionMapWithIndexFn readonly ipartition: PartitionWithIndexFn readonly ifilterMap: FilterMapWithIndexFn readonly ifilter: FilterWithIndexFn } export type FilterableWithIndexMin = FunctorWithIndexMin & ( | { readonly ifilterMap_: FilterMapWithIndexFn_ readonly ipartitionMap_: PartitionMapWithIndexFn_ } | { readonly ifilterMap_: FilterMapWithIndexFn_ readonly ipartitionMap_: PartitionMapWithIndexFn_ readonly ifilter_: FilterWithIndexFn_ readonly ipartition_: PartitionWithIndexFn_ } ) export function FilterableWithIndex( F: FilterableWithIndexMin ): FilterableWithIndex export function FilterableWithIndex(F: FilterableWithIndexMin>): FilterableWithIndex> { const ifilterMap_: FilterMapWithIndexFn_> = F.ifilterMap_ const ipartitionMap_: PartitionMapWithIndexFn_> = F.ipartitionMap_ let ipartition_: PartitionWithIndexFn_> let ifilter_: FilterWithIndexFn_> if ('ifilter_' in F) { ifilter_ = F.ifilter_ } else { ifilter_ = (fa: HKT.HKT, predicate: PredicateWithIndex): HKT.HKT => F.ifilterMap_(fa, (i, a) => (predicate(i, a) ? O.Some(a) : O.None())) } if ('ipartition_' in F) { ipartition_ = F.ipartition_ } else { ipartition_ = ( fa: HKT.HKT, predicate: PredicateWithIndex ): readonly [HKT.HKT, HKT.HKT] => ipartitionMap_(fa, (i, a) => (predicate(i, a) ? E.Right(a) : E.Left(a))) } return HKT.instance>>({ ...FunctorWithIndex(F), ifilterMap_, ifilterMap: (f) => (fa) => ifilterMap_(fa, f), ipartitionMap_, ipartitionMap: (f) => (fa) => ipartitionMap_(fa, f), ifilter_, ifilter: (f: PredicateWithIndex) => (fa: HKT.HKT) => ifilter_(fa, f), ipartition_, ipartition: (f: PredicateWithIndex) => (fa: HKT.HKT) => ipartition_(fa, f) }) } export interface FilterWithIndexFn { ( refinement: RefinementWithIndex, HKT.OrFix<'K', C, K>>, A, B> ): ( fa: HKT.Kind ) => HKT.Kind ( predicate: PredicateWithIndex, HKT.OrFix<'K', C, K>>, A> ): ( fa: HKT.Kind ) => HKT.Kind } export interface FilterWithIndexFn_ { ( fa: HKT.Kind, refinement: RefinementWithIndex, HKT.OrFix<'K', C, K>>, A, B> ): HKT.Kind ( fa: HKT.Kind, predicate: PredicateWithIndex, HKT.OrFix<'K', C, K>>, A> ): HKT.Kind } export interface FilterMapWithIndexFn { (f: (i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => Option): < Q, W, X, I, S, R, E >( fa: HKT.Kind ) => HKT.Kind } export interface FilterMapWithIndexFn_ { ( fa: HKT.Kind, f: (i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => Option ): HKT.Kind } export interface PartitionMapWithIndexFn { ( f: (i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => Either ): ( fa: HKT.Kind ) => readonly [HKT.Kind, HKT.Kind] } export interface PartitionMapWithIndexFn_ { ( fa: HKT.Kind, f: (i: HKT.IndexFor, HKT.OrFix<'K', C, K>>, a: A) => Either ): readonly [HKT.Kind, HKT.Kind] } export interface PartitionWithIndexFn { ( refinement: RefinementWithIndex, HKT.OrFix<'K', C, K>>, A, B> ): ( fa: HKT.Kind ) => readonly [HKT.Kind, HKT.Kind] ( predicate: PredicateWithIndex, HKT.OrFix<'K', C, K>>, A> ): ( fa: HKT.Kind ) => readonly [HKT.Kind, HKT.Kind] } export interface PartitionWithIndexFn_ { ( fa: HKT.Kind, refinement: RefinementWithIndex, HKT.OrFix<'K', C, K>>, A, B> ): readonly [HKT.Kind, HKT.Kind] ( fa: HKT.Kind, predicate: PredicateWithIndex, HKT.OrFix<'K', C, K>>, A> ): readonly [HKT.Kind, HKT.Kind] }