fold

La forma de reduce con valor inicial: siempre segura, incluso sobre un pipeline vacío.

Acc fold<A, Acc>(Acc seed, Acc Function(Acc acc, A a) f, Iterable<A> iterable) Future<Acc> foldAsync<A, Acc>(FutureOr<Acc> seed, FutureOr<Acc> Function(Acc acc, A a) f, FxAsyncIterable<A> iterable) Acc Fx.fold<Acc>(Acc initialValue, Acc Function(Acc acc, T a) combine) // chain (sync, inherited from Iterable) Future<Acc> FxAsync.fold<Acc>(FutureOr<Acc> seed, FutureOr<Acc> Function(Acc acc, T a) f) // chain (async)

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.

Relacionado: 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