결과를 만드는 함수 reduce, take
- 값을 꺼내서 깨트리는 역할
- 최종적으로 결과를 만드는 역할
- map filter 지연 실행 후 연산의 시작점을 알린다
- 함수형 생각시 A로부터 B를 만들때 A를 조작한후 어떤 식으로 reduce로 연산한후 B를 만들지 생각하면 좋다
- take 같은 경우도 마지막 완성 짓는게 많아서 지연성을 가지기 보다 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 만들기]