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