go, pipe
2024. 7. 5. 18:35ㆍjs
자바스크립트에서 사용 할 수 있는 go, pipe 함수
pipe 함수를 보며, c/c++ 에서 파이프를 통해 데이터를 전달하는 것을 떠올리게 된다.
javascript 에서 함수를 연속적으로 실행해주는 것을 pipe함수로 사용하게 되는데
이를 구현 해보자.
pipe함수의 경우, 전달받은 매개변수를 다음 함수로 전달해주는 역할을 한다

여기서 매번 인자로 들어온 함수들을 매번 실행 시키고, 마지막 남은 함수를 반환하면 된다.
코드로 표현해보면
function _each(arr, iter) {
for (let i = 0; i < arr.len; ++i) {
iter(arr[i]);
}
return arr;
}
function _rest(list, num) {
return Array.prototype.slice.call(list, num);
}
function _reduce(arr, apply, init) {
arr = _rest(arr, init ? 0 : 1);
_each(arr, (item) => {
init = apply(init, item);
});
return init;
}
function pipe(...fns) {
return function (arg) {
return _reduce(fns, function(arg, fn) {
return fn((arg);
});
}
}
파이프 함수의 로직을 살펴보면, 인자를 하나의 fns의 변수에 집어넣게 되고 이 집어넣은것을
내부적으로 기억하게 된다 이떄, 인자에 arg를 받게되는데, 여기서 arg를 console.log 를 통해 확인 해보면,
function (b) {
return fn(b, a);
}
라는 함수를 받고있는것ㅇ르 확인 할 수 있다.
이렇게, 내부의 인자를 공유하고 있다는 특성을 이용해서, 들어온 arguments를 하나의 결과로 합쳐주는 _reduce
함수를 통해 실행시켜주면, pipe 함수가 만들어 지게 된다.
go의 경우는, 결국 마지막에, function이 아닌 결과를 리턴해주기 때문에,
function _go(arg, ...fns) {
return _pipe.apply(null, fns)(arg);
}
이전에 구현한 pipe 함수를 호출하고, 마지막 결과에 arg를 넣어 리턴하면 된다.
'js' 카테고리의 다른 글
filter를 이용해, reject, compact 함수 구현 (0) | 2024.07.07 |
---|---|
수집하기, map을 이용해서 만드는, values, pluck --- 1 (0) | 2024.07.06 |
tsconfig 절대경로 설정시 에러 (0) | 2024.01.28 |
모듈 정리 (0) | 2023.04.11 |
제너레이터 (2) | 2023.04.11 |