Either × 파이프라인

타입 있는 에러가 FxDart의 지연·동시성 파이프라인과 융합됩니다 — Arrow에도, 다른 어떤 Dart FP 라이브러리에도 없는 부분입니다.

on Fx<Either<L, R>>: rights() · lefts() · separated() · sequence() · flattenOrAccumulate() on FxAsync<Either<L, R>>: rights() · lefts() · separated() · sequence() · flattenOrAccumulate() on Fx<T> / FxAsync<T>: Either<Nel<E>, List<R>> mapOrAccumulate(transform, {concurrency})

강의

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)가 있어, 비동기 검증이 터미널 하나로 카운트 배지를 채웁니다.

직접 해 보기

연습: 파싱된 것은 더하고, 파싱되지 않은 것은 보고해 보세요.

관련 항목: 에러 누적 — 스코프 수준의 fail-slow 어휘 · concurrent — 비동기 변형이 올라타는 백채널 · partitionseparated()의 술어 사촌 · rights / separated — 이벤트 체인의 같은 추출 · 타입 있는 에러 — 전체 가이드