Either × 파이프라인
타입 있는 에러가 FxDart의 지연·동시성 파이프라인과 융합됩니다 — Arrow에도, 다른 어떤 Dart FP 라이브러리에도 없는 부분입니다.
강의
Either 값들의 체인은 Either를 이해하는
종결 연산자를 갖게 됩니다. rights()와
lefts()는 한쪽만 남기고, separated()는 양쪽을
한 번에 나누며(partition과 같은 레코드 모양),
sequence()는 전부 아니면 전무입니다 — 모든 성공을 리스트
하나로 모으되 즉시, 첫 Left에서 실패합니다.
파이프라인이 지연 평가되므로 fail-fast는 말 그대로입니다.
sequence()는 첫 실패에서 당기기를 멈추고, 그래서
뒤쪽 원소는 아예 계산되지 않습니다.
fail-slow 쌍둥이는 모든 fx()/비동기 체인에 있는
mapOrAccumulate(transform)입니다. 모든 원소를 검증하고,
모든 실패를 보존합니다. 비동기 체인에서는
concurrency: n을 받아 FxDart의 나머지 기능과 똑같은
concurrent(n) 백채널 위에서 동작합니다 — n개가 동시에
진행되고, 결과는 순서대로 나오며, 각 원소는 자기만의 스코프에서
실행되므로 한 원소의 실패가 다른 원소로 새어 나갈 수 없습니다.
이들은 모두 설계상 즉시 실행이며, 그래서 지연 평가 × raise 위험에서 벗어나는 공인된 탈출구이기도 합니다. raise 블록에서 지연 파이프라인을 그대로 반환하지 마세요 — 대신 이 결과들 중 하나를 반환하세요.
데모 1 · rights, lefts & separated
데모 2 · sequence — 말 그대로 fail-fast
데모 3 · 동시성 fail-slow 검증
데모 4 · flattenOrAccumulate와 비동기 추출 패밀리
이미 가지고 있는 Either들을 다룰 때, fail-slow 터미널은
mapOrAccumulate((r, v) => r.bind(v)) —
항등 bind — 로 써야 했습니다. flattenOrAccumulate()(Arrow의
이름 그대로)가 그 터미널입니다. 모든 성공을, 아니면 모든 실패를
Nel로 돌려줍니다. 이것으로 삼총사가 완성됩니다 —
separated()는 양쪽을 다 보존하고, sequence()는
fail-fast, flattenOrAccumulate()는 fail-slow입니다. 그리고
비동기 체인에도 이제 추출 패밀리 전체(rights /
lefts / separated / sequence /
flattenOrAccumulate)가 있어, 비동기 검증이 터미널 하나로
카운트 배지를 채웁니다.
직접 해 보기
연습: 파싱된 것은 더하고, 파싱되지 않은 것은 보고해 보세요.
concurrent — 비동기 변형이 올라타는 백채널 ·
partition — separated()의 술어 사촌 ·
rights / separated — 이벤트 체인의 같은 추출 ·
타입 있는 에러 — 전체 가이드