함수 합성
pipe에 대해 소개하겠습니다.
pipe라는 함수는 이미 여러 라이브러리에서 제공하고 있어서 익숙할 수 있습니다.
pipe는 함수의 출력을 다른 함수의 인자로 전달하여 함수들을 연결하는 함수입니다.
pipe가 왜 필요한지 잠시 살펴보겠습니다.
배열이 있고, 이 배열에 filter -> map -> reduce를 수행하여 최종 결과를 얻고 싶다고 가정해봅시다.
typescript
const sum = (a: number, b: number) => a + b;
const arr = [1, 2, 3, 4, 5];
// filter
// map
// reduce모든 코드가 순수 함수이므로 함수 합성을 만들기 쉽지만, 읽기가 매우 어려워 보입니다.
typescript
reduce(
sum,
map(
(a) => a + 10,
filter((a) => a % 2 === 0, arr);
),
)위 문제를 해결하기 위해 pipe를 제공합니다.
typescript
import { filter, map, pipe, reduce } from "@fxts/core";
pipe(
arr,
filter((a) => a % 2 === 0),
map((a) => a + 10),
reduce(sum),
);pipe와 함께 사용하면 읽기 쉬워 보입니다.
Array.prototype.[Function]과의 비교는 이 문서를 확인하세요.
또한, Promise 값을 직접 다룰 필요가 없습니다.
typescript
await pipe(
Promise.resolve(1),
(a /*: Awaited<number>*/) => a + 1,
async (b /*: Awaited<number>*/) => b + 1,
(c /*: Awaited<number>*/) => c + 1,
); // 4- a :
a는 number로 추론되며, 실제 값도Promise<number>가 아닌 number입니다. - c : 이전 함수가 비동기 함수여도 인자는
Promise<number>가 아닙니다.
비동기 값을 직접 다루지 않는다고 해서 에러 발생 시 처리할 수 없는 것은 아닙니다. 에러 처리에 대해서는 에러 처리를 확인하세요.
