zip3
세 개의 이터러블을 나란히 걷습니다 — 입력이 하나 더 붙은 zip.
Iterable<(A, B, C)> zip3<A, B, C>(Iterable<A> iterable1, Iterable<B> iterable2, Iterable<C> iterable3)
FxAsyncIterable<(A, B, C)> zip3Async<A, B, C>(FxAsyncIterable<A> iterable1, FxAsyncIterable<B> iterable2, FxAsyncIterable<C> iterable3)
강의
zip3는 이터러블이 하나 더 붙은
zip입니다.
zip 페이지가 설명하는 내용은 그대로
적용됩니다 — 한 걸음에 레코드 하나, 지연 평가, 그리고 입력 중
어느 하나라도 떨어지는 순간 멈추므로 결과 길이는 셋 중 가장
짧은 것을 따릅니다. 원소 타입은 Dart 레코드 (A, B, C)이니
인덱스가 아니라 패턴 매칭으로 분해하세요.
별도의 함수로 존재하는 이유는 Dart에 가변 제네릭이 없기 때문입니다.
이터러블의 리스트를 받는 단일 zip은 입력별 타입을 지워야
하는데, (A, B, C)야말로 이 결과를 쓸모 있게 만드는
핵심이니까요. tee 옆에
tee3가 있는 것과 같은 이유입니다.
알아 둘 비대칭이 하나 있습니다. zip에는 체인 메서드가
있지만(fx(a).zip(b)) zip3에는 없습니다 —
체인의 수신자는 하나인데 zip3는 대등한 셋을 필요로 하니까요.
최상위 함수로 호출한 뒤 결과를 fx()로 감싸 이어 가세요.
데모의 마지막 줄이 그 방식입니다. zip3Async가 비동기
버전이고, zipAsync와 마찬가지로 셋의 next()를
모두 발행한 뒤에 기다리므로, 레코드마다 소스들을 차례로가 아니라
병렬로 끌어당깁니다.