fxPipe

타입이 있는 왼쪽→오른쪽 합성. 마지막 .then 함수입니다 — .build()는 없습니다.

R Function(A) fxPipe<A, R>(R Function(A) f) S Function(A) (R Function(A)).then<S>(S Function(R) next) R Function(A) fxPipe2<A, M, R>(M Function(A) first, R Function(M) second) R Function(A) fxPipe3<A, M1, M2, R>(M1 Function(A) first, M2 Function(M1) second, R Function(M2) third) R Function(A) fxPipe4<A, M1, M2, M3, R>(…) R Function(A) fxPipe5<A, M1, M2, M3, M4, R>(…)

강의

pipe는 값을 함수 리스트에 통과시키지만 그 리스트는 dynamic입니다. fxPipe는 함수를 돌려주는 타입이 있는 형태입니다:

final f = fxPipe3(parse, normalise, score);
f(line);
fx(lines).map(f);

.then이 지금까지의 체인을 돌려주므로 "끝내는" 단계가 없습니다. 호출하거나 map / parallel에 넘기세요. fxPipe(parse)는 곧 parse입니다 — 이름만 시작을 표시합니다. parse.then(normalise)도 됩니다.

.parallel을 두 번 호출하면 결과가 이 isolate로 돌아왔다가 다시 나갑니다. 합성한 워커 하나는 홉을 한 번만 냅니다:

await fx(lines)
    .parallel(4, fxPipe3(parse, normalise, score), chunked: true)
    .toList();

결과가 parallel 워커일 때 각 단계는 보낼 수 있어야 합니다. juxt는 반대 방향입니다: 함수 여러 개, 입력 하나, 결과 리스트.

fxPipe2..fxPipe5는 같은 단계를 클로저 하나로 합칩니다. 뜨거운 map이나 parallel 워커가 .then마다 중첩 호출을 내지 않습니다. 인자는 5에서 끝입니다 (zipOrAccumulate2..5와 같습니다). 그 이상은 .then을 이어 붙이거나 합친 함수를 직접 쓰세요.

parallel은 VM 전용이라, 아래 플레이그라운드는 같은 합성 함수를 map으로 돌립니다.

데모 1 · parse, normalise, score

단계 세 개, 함수 하나. VM에서는 이것을 parallel에 넘깁니다. 여기선 플레이그라운드에서 돕니다.

데모 2 · 맵 세 번과 같은 숫자

fxPipe는 새 연산자가 아니라 합성입니다. map 세 번과 합성 함수 하나가 같은 리스트를 찍습니다.

직접 해 보기

연습: parsenormalisescore를 합성하고, 점수가 4 이상인 행만 남기세요.

관련: pipe — 같은 생각, 타입 없음, 값 위 · juxt — 함수 여러 개, 입력 하나, 결과 리스트 · map — 이 isolate에서의 같은 합성 · parallel — 워커를 합성하면 홉을 아끼는 곳