fold
La forma de reduce con valor inicial: siempre segura, incluso sobre un pipeline vacío.
Lección
fold es reduce con un
valor inicial explícito. En FxTS esto es simplemente reduce llamado
con tres argumentos — reduce(f, seed, iterable). Dart no puede
distinguir sobrecargas por el número de argumentos, así que FxDart separa las dos: la
forma sin valor inicial conserva el nombre reduce, y la forma con valor inicial pasa a
llamarse fold, igual que el nombre que el propio
Iterable de Dart ya usa para esta misma operación.
Fíjate bien en el orden de los argumentos: es fold(seed, f, iterable)
— primero el valor inicial, luego el combinador y después la fuente — reflejando
Iterable.fold(initialValue, combine) en la forma encadenada. Eso es
distinto del reduce(f, seed, iterable) de FxTS, donde la
función va primero.
Como siempre aportas el valor inicial, fold nunca lanza sobre un
iterable vacío: simplemente devuelve el valor inicial intacto. Eso lo convierte en la
opción más segura siempre que no tengas la certeza de que el pipeline contenga algún
elemento. Como reduce, es un operador terminal: nada de lo que hay
aguas arriba se ejecuta hasta que fold tira de ello.
Demo 1 · Fundamentos & entrada vacía
Demo 2 · Asíncrono, construyendo un Map
El valor inicial no tiene por qué ser un número: aquí plegamos un pipeline con retardo en un histograma de longitudes:
Pruébalo tú
Ejercicio: pliega con fold los depósitos en un saldo acumulado, partiendo de 1000.
reduce — la contraparte sin valor inicial ·
reduceLazy — un reductor currificado y reutilizable ·
sum — un fold habitual, ya especializado ·
scan — como fold, pero emite perezosamente cada valor intermedio