zip3

Tres iterables recorridos en paralelo: zip con una entrada más.

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)

Lección

zip3 es zip con un tercer iterable. Todo lo que explica la página de zip sigue valiendo igual: un record por paso, pereza y parada en el momento en que cualquiera de las entradas se agota, así que el resultado es tan largo como la más corta de las tres. El tipo de elemento es un record de Dart (A, B, C), así que desestructúralo con patrones en vez de por índice.

Existe como función propia porque Dart no tiene genéricos variádicos: un único zip que tomara una lista de iterables tendría que borrar los tipos de cada entrada, y (A, B, C) es justo lo que hace que el resultado merezca la pena. La misma razón por la que a tee le acompaña tee3.

Una asimetría que conviene conocer: zip tiene método de cadena (fx(a).zip(b)) y zip3 no — una cadena tiene un solo receptor y zip3 necesita tres iguales. Llámalo como función de nivel superior y envuelve el resultado en fx() para seguir, como hace la última línea de la demo. zip3Async es la forma asíncrona y, igual que zipAsync, lanza las tres llamadas a next() antes de esperar ninguna, así que las fuentes se tiran en paralelo por cada record en lugar de una detrás de otra.

Demo · Tres entradas, un record por paso

Relacionado: zip — la forma de dos iterables, y la explicación completa · zipWith — combina en vez de emparejar · transpose — cualquier número de iterables, a costa de un tipo de elemento común