import { identity } from "../Function"; /* * ------------------------------------------- * Monad Iterable * ------------------------------------------- */ function* genChain(ia: Iterator, f: (a: A) => Iterable) { while (true) { const result = ia.next(); if (result.done) { break; } const ib = f(result.value)[Symbol.iterator](); while (true) { const result = ib.next(); if (result.done) { break; } yield result.value; } } } export const chain = (f: (a: A) => Iterable) => (ma: Iterable): Iterable => ({ [Symbol.iterator]: () => genChain(ma[Symbol.iterator](), f) }); export const chain_ = (ma: Iterable, f: (a: A) => Iterable): Iterable => ({ [Symbol.iterator]: () => genChain(ma[Symbol.iterator](), f) }); export const flatten = (mma: Iterable>) => chain_(mma, identity);