🛠️ 처음부터 만드는 Pipe — 함수를 순서대로 연결하기
Pipe는 Compose의 반대 방향 버전입니다. 왼쪽에서 오른쪽으로 함수를 순서대로 실행해서, 함수 조합이 직관적입니다.
```typescript
function pipe(...fns: Array<(x: any) => any>) {
return (arg: T) => fns.reduce((result, fn) => fn(result), arg);
}
// 사용 예
const toUpper = (str: string) => str.toUpperCase();
const addExclaim = (str: string) => str + '!';
const addBorder = (str: string) => `* ${str} *`;
const transform = pipe(toUpper, addExclaim, addBorder);
console.log(transform('hello')); // * HELLO! *
```
```typescript
const parseJson = (str: string) => JSON.parse(str);
const getUsers = (data: any) => data.users || [];
const sortByName = (users: any[]) => [...users].sort((a, b) => a.name.localeCompare(b.name));
const formatNames = (users: any[]) => users.map(u => u.name).join(', ');
const processUserData = pipe(
parseJson,
getUsers,
sortByName,
formatNames
);
const json = '{"users": [{"name": "Alice"}, {"name": "Bob"}]}';
console.log(processUserData(json)); // Alice, Bob
```
Reduce의 타입을 명확히 하면 각 단계의 입출력이 일치합니다:
```typescript
function pipe(...fns: T): (x: any) => any {
return (arg: any) => fns.reduce((result, fn) => fn(result), arg);
}
```
Pipe의 장점: 읽는 순서 = 실행 순서. 데이터 흐름이 자연스럽습니다. Ramda, lodash/fp 같은 함수형 라이브러리도 Pipe를 핵심으로 사용합니다.
📚 참고: [Ramda Pipe](https://ramdajs.com/docs/#pipe) | [lodash flow](https://lodash.com/docs/#flow)
기본 구현
```typescript
function pipe
return (arg: T) => fns.reduce((result, fn) => fn(result), arg);
}
// 사용 예
const toUpper = (str: string) => str.toUpperCase();
const addExclaim = (str: string) => str + '!';
const addBorder = (str: string) => `* ${str} *`;
const transform = pipe(toUpper, addExclaim, addBorder);
console.log(transform('hello')); // * HELLO! *
```
실전 예제: 데이터 변환 파이프라인
```typescript
const parseJson = (str: string) => JSON.parse(str);
const getUsers = (data: any) => data.users || [];
const sortByName = (users: any[]) => [...users].sort((a, b) => a.name.localeCompare(b.name));
const formatNames = (users: any[]) => users.map(u => u.name).join(', ');
const processUserData = pipe(
parseJson,
getUsers,
sortByName,
formatNames
);
const json = '{"users": [{"name": "Alice"}, {"name": "Bob"}]}';
console.log(processUserData(json)); // Alice, Bob
```
타입 안전성 강화 (TypeScript)
Reduce의 타입을 명확히 하면 각 단계의 입출력이 일치합니다:
```typescript
function pipe
return (arg: any) => fns.reduce((result, fn) => fn(result), arg);
}
```
Pipe의 장점: 읽는 순서 = 실행 순서. 데이터 흐름이 자연스럽습니다. Ramda, lodash/fp 같은 함수형 라이브러리도 Pipe를 핵심으로 사용합니다.
📚 참고: [Ramda Pipe](https://ramdajs.com/docs/#pipe) | [lodash flow](https://lodash.com/docs/#flow)
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!