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);