Skip to content

Instantly share code, notes, and snippets.

@sergeysova
Created March 4, 2019 12:59
Show Gist options
  • Save sergeysova/dfcb6de176690dc09b367889eea7dcf1 to your computer and use it in GitHub Desktop.
Save sergeysova/dfcb6de176690dc09b367889eea7dcf1 to your computer and use it in GitHub Desktop.
Array.prototype.iter = function() {
return new ListIter(this);
};
class Iter {
map(fn) {
return new Map(this, fn);
}
collect() {
let accum = [];
let current;
while (!(current = this.next()).done) {
accum.push(current.value);
}
return accum;
}
[Symbol.iterator]() {
return this;
}
}
class Map extends Iter {
constructor(iter, fn) {
super();
this.iter = iter;
this.fn = fn;
}
next() {
const iter = this.iter.next();
if (iter.done) {
return { done: true, value: undefined };
} else {
return {
value: this.fn(iter.value),
done: iter.done
};
}
}
}
class ListIter extends Iter {
constructor(list) {
super();
this.list = list;
this.position = 0;
}
next() {
if (this.position > this.list.length) {
return { done: true, value: undefined };
}
return {
value: this.list[this.position++],
done: this.list.length == this.position - 1
};
}
}
let list = [1, 2, 3];
let iter = list
.iter()
.map(a => a * 2)
.map(a => a + 1000);
console.log([...iter]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment