/** * Traversable * * 1. t(u.traverse(F, x => x)) is equivalent to u.traverse(G, t) for any t such that * t(a).map(f) is equivalent to t(a.map(f)) (naturality) * 2. u.traverse(F, F.of) is equivalent to F.of(u) for any Applicative F (identity) * 3. u.traverse(Compose, x => new Compose(x)) is equivalent to new Compose(u.traverse(F, x => x).map(x => x.traverse(G, x => x))) * for Compose defined below and any Applicatives F and G (composition) * * traverse :: Applicative f, Traversable t => t a ~> (TypeRep f, a -> f b) -> f (t b) */ import { Applicative, Applicative1, Applicative2 } from './Applicative'; import { Foldable, Foldable1, Foldable2 } from './Foldable'; import { Functor, Functor1, Functor2 } from './Functor'; import { HKT, KindOf, URIS } from './HKT'; export interface Traversable extends Functor, Foldable { readonly traverse: (A: Applicative) => (ma: HKT, f: (a: A) => HKT) => HKT; } export interface Traversable1 extends Functor1, Foldable1 { readonly traverse: Traverse; } export interface Traversable2 extends Functor2, Foldable2 { readonly traverse: Traverse2; } export interface Traverse { (F: Applicative2): (ma: KindOf, f: (a: A) => KindOf) => KindOf]>; (F: Applicative1): (ma: KindOf, f: (a: A) => KindOf) => KindOf]>; (F: Applicative): (ma: KindOf, f: (a: A) => HKT) => HKT>; } export interface Traverse2 { (F: Applicative2): (ma: KindOf, f: (a: A) => KindOf) => KindOf]>; (F: Applicative1): (ma: KindOf, f: (a: A) => KindOf) => KindOf]>; (F: Applicative): (ma: KindOf, f: (a: A) => HKT) => HKT>; } export interface PipeableTraverse1 { (F: Applicative2): (f: (a: A) => KindOf) => (ta: KindOf) => KindOf]>; (F: Applicative1): (f: (a: A) => KindOf) => (ta: KindOf) => KindOf]>; (F: Applicative): (f: (a: A) => HKT) => (ta: KindOf) => HKT>; } export interface PipeableTraverse2 { (F: Applicative2): (f: (a: A) => KindOf) => (ta: KindOf) => KindOf]>; (F: Applicative1): (f: (a: A) => KindOf) => (ta: KindOf) => KindOf]>; (F: Applicative): (f: (a: A) => HKT) => (ta: KindOf) => HKT>; }