LHJ

I'm a FE developer.

30. 커링

16 Aug 2020 » codespitz_re

커링

전달하는 인자값을 줄이는 것을 커링이라고 한다.
아래 코드 안에 설명을 참고하길 바란다.

const Stream = class {
    static get(v) {return new Stream(v);}
    constructor(v) {
        this.v = v;
        this.filters = [];
    }
    add(gene, ...arg){
        // v를 함수의 첫번째 인자값으로 전달 - 커링
        // 제너레이터는 이터러블 객체를 반환할 수 있게 전달
        this.filters.push(v => gene(v, ...arg));
        return this;
    }
    *gene(){
        let v = this.v;
        for (const f of this.filters) v = f(v);
        // v - 배열 갯수만큼 yield를 때림
        yield* v;
    }
}

const odd = function*(data) {
    for (const v of data) if (v % 2) yield v;
};

const take = function*(data, n) {
    for (const v of data) if (n--) yield v; else break;
};

// 아래 Stream.get은 별거 없다.  
// 클래스 객체 생성할 때 new 때리기 싫어서 위에 보면 new Stream(v) 리턴한 것
// take 함수는 data와 n 인자값을 받는데, 아래 식에선 take 함수에 2라는 인자값 하나만 전달함.
// 그 이유는 위의 add 메소드에 v를 함수의 첫번째 인자값으로 전달하기 때문.
for (const v of Stream.get([1,2,3,4]).add(odd).add(take, 2).gene()) console.log(v);