mapEither & mapEitherAsync
이벤트마다 자신의 raise 스코프에서 돌립니다. r.raise (그리고 r.ensure / r.bind)는 Left가 되고, 평범한 반환은 Right가 됩니다.
강의
attempt는 경계
변환입니다 — 이미 에러 채널에 있는 것을
Left로 바꿉니다. mapEither는 그
다음에, 또는 깨끗한 소스에서 쓰는 연산자입니다. 각
이벤트가 either 빌더
안에서 돌아가므로 r.ensure /
r.raise로 일직선 Dart를 쓰고, 맵 전체의 결과는
Either<E, R>입니다. 실패한 이벤트가 소스를
취소하지 않으며, 이후 이벤트도 도착합니다.
던져진 예외는 에러 채널에 남습니다 — 그것이
either 빌더의 계약이고,
attempt가 throw를 값으로 바꾸는 단 한 곳입니다.
콜백이 raise도 하고 throw도 하면
mapEither 안에서 eitherCatching을
써서 Either 하나가 나오게 하세요.
mapEitherAsync는 비동기 쌍둥이입니다.
asyncMap처럼 한 번에 이벤트 하나.
eitherAsync의 규칙이 그대로 옵니다. raise는
await된 체인 안에서 일어나야 합니다. await되지 않은
future에서의 raise는 스코프보다 오래 살아남아
Left가 아니라 처리되지 않은 존 에러가 됩니다.
소스 에러는 두 연산자 모두 손대지 않고 통과합니다. 그것도
Left로 만들고 싶으면 위쪽에
attempt를 두세요.
데모 1 · raise는 Left, 반환은 Right
데모 2 · mapEitherAsync, 한 번에 하나
직접 해 보기
연습: 던져진 예외는 에러 채널에 남고, 체인은 그 뒤를 계속 갑니다.
attempt — throw를 Left로 바꾸는 경계 ·
either 빌더 — 같은 raise 스코프, 값 하나에서 ·
rights / separated — 나온 Either를 가르기