Skip to content

Instantly share code, notes, and snippets.

@HelveticaScenario
Created November 30, 2017 05:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HelveticaScenario/c488ae54dc6d75f176711562e9ee2232 to your computer and use it in GitHub Desktop.
Save HelveticaScenario/c488ae54dc6d75f176711562e9ee2232 to your computer and use it in GitHub Desktop.
class Seq {
constructor(iterable, transformerGenerator) {
this.iterable = iterable;
this.transformerGenerator = transformerGenerator;
Object.freeze(this);
}
[Symbol.iterator]() {
const cache = this.iterable[Symbol.iterator]();
const transformer = this.transformerGenerator();
let last;
return {
next: value => {
if (last && last.done) {
return last;
} else {
last = transformer(cache.next(value));
return last;
}
}
};
}
map(f) {
return new Seq(this, () => e => {
if (e.done) {
return { value: undefined, done: true };
} else {
return { value: e.value && f(e.value), done: false };
}
});
}
take(n) {
return new Seq(this, (i = 0) => e => {
if (e.done) {
return e;
} else if (i >= n) {
return { value: undefined, done: true };
} else {
i++;
return e;
}
});
}
static from(iterable) {
return new Seq(iterable, () => _ => _);
}
}
const a = [1, 2, 3];
const s = Seq.from(a);
const ss = s.map(n => n + 1);
const sse = ss.map(n => n * 2);
const sr = s.take(2);
const ssr = ss.take(2);
console.log(Array.from(s), Array.from(ss), Array.from(sr), Array.from(ssr));
console.log(Array.from(s), Array.from(ss), Array.from(sr), Array.from(ssr));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment