결과를 만드는 함수 reduce, take


제너레이터로 만든 L 함수는 결말을 지어야한다!!

값그대로 이용하려면 즉시평가해서 결말필요!

[reduce로 결론 짓는 함수]

L.entries = function* (obj) {
  for (const k in obj) yield [k, obj[k]];
};

// Array 뿐만 아니라 다형성을 더 높게 새로 만들어보자
const join = curry((sep = ',', iter) =>
  reduce((a, b) => `${a}${sep}${b}`, iter));

// 제너레이터에서 custom join 써보기

// function *a() {
//   yield 10;
//   yield 11;
//   yield 12;
//   yield 13;
// }
//
// log(join(' - ', a()));

const queryStr = pipe(
  L.entries,
  L.map(([k, v]) => `${k}=${v}`),
  join('&'));

log(queryStr({limit: 10, offset: 10, type: 'notice'}));

[take로 결론 짓는 함수]

find는 take로 결론짓는 함수

const users = [
  {age: 32},
  {age: 31},
  {age: 37},
  {age: 28},
  {age: 25},
  {age: 32},
  {age: 31},
  {age: 37}
];

// 만족하는 하나 뽑아내는 함수
const find = curry((f, iter) => go(
	iter,
	L.filter(f),
	take(1),
	([a]) => a));

log(find(u => u.age < 30)(users));

go(users,
  L.map(u => u.age),
  find(n => n < 30),
  log);

[L.map + take로 즉시평가 map 만들기]

L.map = curry(function* (f, iter) {
  for (const a of iter) {
    yield f(a);
  }
});

const takeAll = take(Infinity);

// 즉시 평가하는 map
const map = curry(pipe(L.map, takeAll));

log(map(a => a + 10, L.range(4)));

[L.filter + take로 즉시평가 filter 만들기]