JSFiddle - React, Tailwind, and code Playground
by Adam Boduch
JavaScript
function* range(start, end) {
for (let i = start; i < end; i++) {
yield i;
}
}
function* map(items, func) {
for (let i of items) {
yield func(i);
}
}
function* reduce(items, func) {
for (let i of items) {
let result = func(i);
if (result) {
yield result;
}
}
}
function* at(items, key) {
yield* map(items, i => i[key]);
}
function* filter(items, func) {
yield* reduce(items, i => func(i) ? i : null);
}
function* take(items, count) {
let cnt = 0;
for (let i of items) {
if (cnt++ < count ) {
yield i;
} else {
break;
}
}
}
function* compose(...gens) {
let result;
for (let gen in gens) {
result = gen(result);
}
yield* result;
}
// Main
let items;
for (let i of range(1, 10)) {
console.log('range', i);
}
items = [
{ a: 1 },
{ a: 2 },
{ a: 3 },
];
for (let i of at(items, 'a')) {
console.log('at', i);
}
for (let i of take(filter(range(1, 10), v => v > 4), 3)) {
console.log('take', i);
}
let composed = compose(
range(1, 100),
g => map(i => i * 2)
);
for (let i of composed) {
console.log('composed', i);
}