/** * Filterable * * 1. v.filter(x => p(x) && q(x)) is equivalent to v.filter(p).filter(q) (distributivity) * 2. v.filter(x => true) is equivalent to v (identity) * 3. v.filter(x => false) is equivalent to w.filter(x => false) if v and w are values of the same Filterable (annihilation) * * filter :: Filterable f => f a ~> (a -> Boolean) -> f a */ import { Predicate } from '../Predicate'; import { HKT, KindOf, URIS } from './HKT'; export interface Filterable { readonly URI: F; readonly filter: (ma: HKT, predicate: Predicate) => HKT; } export interface Filterable1 { readonly URI: F; readonly filter: (ma: KindOf, predicate: Predicate) => KindOf; } export interface Filterable2 { readonly URI: F; readonly filter: (ma: KindOf, predicate: Predicate) => KindOf; }