tee3

Tres folds sobre una pasada de la fuente: tee con una reducción más.

typedef Fold<A, R> = ({R seed, R Function(R acc, A a) step}); (R1, R2, R3) tee3<A, R1, R2, R3>(Iterable<A> iterable, Fold<A, R1> first, Fold<A, R2> second, Fold<A, R3> third)

Lección

tee3 es tee con un tercer fold. Todo lo que explica la página de tee sigue valiendo igual: cada elemento hace avanzar todos los acumuladores antes de tirar del siguiente, así que la fuente se recorre exactamente una vez y no se almacena nada; los acumuladores son independientes y no tienen por qué compartir tipo; y los lectores han de ser folds, no pipelines. Lee esa página primero para el razonamiento y para saber cuándo fork es la mejor herramienta.

Dart no tiene genéricos variádicos, así que cada aridad es su propia función — la misma razón por la que a zip le acompaña zip3. Dos y tres cubren los casos que merecen nombre; más allá, reduce a un pequeño record o clase tuya y usa fold a secas.

Demo · Total, pico y cuenta con una sola lectura

sensor() cuenta sus propios valores. Tres pasadas separadas dejarían reads en 18; tee3 lo deja en 6:

Relacionado: tee — la forma de dos folds, y la explicación completa · fork — lectores independientes, a costa de un búfer · fold — un solo fold