import { $, HKT, kind } from '.' import { Functor, map } from './functor' import { ApplicativeInstances, Applicative, lift2 } from './applicative' export interface Traversable extends Functor { traverse(f: (a: A) => $, ta: $): $> } export type TraversableInstances = keyof typeof Traversable export class TraversableArray { traverse(name: F): (f: (a: A, index?: number) => $, ta: A[]) => $ { return (f: (a: A, index?: number) => $, ta: A[]): $ => { let instance = Applicative[name] return ta.reduce<$>( (acc, i, index) => lift2((a: B[], b: B[]) => a.concat(b))( acc , map(a => [a], f(i, index))) , instance.pure([]) as $ ) } } } export namespace Traversable { export let Array = new TraversableArray }