Skip to content

Instantly share code, notes, and snippets.

@cleure
Last active August 29, 2015 14:15
Show Gist options
  • Save cleure/3b3ae63db7ab3df5bc51 to your computer and use it in GitHub Desktop.
Save cleure/3b3ae63db7ab3df5bc51 to your computer and use it in GitHub Desktop.
Playing around with functional iterables in ES6.
function *range(start, end, skip) {
if (typeof skip === 'undefined') {
skip = 1;
}
if (typeof end === 'undefined') {
end = start;
start = 0;
}
for (let i = start; i < end; i += skip) {
yield i;
}
}
function iterTools(iterable) {
return {
map: map,
reduce: reduce,
chunk: chunk,
every: every,
some: some
};
function *map(fn) {
for (let i of iterable) {
yield fn(i);
}
}
function reduce(fn, initializer) {
if (typeof initializer === 'undefined') {
initializer = 0;
}
let c;
let p = initializer;
for (c of iterable) {
p = fn(p, c);
}
return p;
}
function *chunk(size) {
let chunk = [];
for (let item of iterable) {
chunk.push(item);
if (!(chunk.length < size)) {
yield chunk;
chunk = [];
}
}
if (chunk.length) {
yield chunk;
}
}
function every(fn) {
for (let i of iterable) {
if (!fn(i)) {
return false;
}
}
return true;
}
function some(fn) {
for (let i of iterable) {
if (fn(i)) {
return true;
}
}
return false;
}
}
var isEven = (x) => Math.floor(x / 2) === x / 2;
var square = (x) => x * x;
var sum = (x, y) => x + y;
for (let i of range(2)) {
console.log(i);
}
for (let i of range(2, 4)) {
console.log(i);
}
for (let i of range(4, 10, 2)) {
console.log(i);
}
console.log(iterTools([2, 4, 6]).every(isEven));
console.log(iterTools([2, 4, 6, 1]).every(isEven));
console.log(iterTools([2, 4, 6]).some(isEven));
console.log(iterTools([2, 4, 6, 1]).some(isEven));
for (let i of iterTools(range(0, 16, 7)).map(square)) {
console.log(i);
}
console.log(iterTools(range(4)).reduce(sum));
for (let i of iterTools([1, 2, 3, 4, 5, 6]).chunk(3)) {
console.log(i);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment