peek

Ejecuta una función por cada elemento sin cambiar nada: el equivalente en un pipeline a un breakpoint del depurador.

Iterable<A> peek<A>(void Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> peekAsync<A>(FutureOr<void> Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.peek(void Function(T a) f) // chain FxAsync<T> FxAsync.peek(FutureOr<void> Function(T a) f)

Lección

peek es el primo estricto de mapEffect: mientras que mapEffect aún puede cambiar el valor (es map con otro nombre), el callback de peek devuelve void — solo tiene permiso para mirar. El elemento que entra sale intacto. Recurre a él para colar un print, una métrica o una línea de log en mitad de un pipeline mientras depuras, sin arriesgarte a que una errata mute los datos en silencio.

Es tan perezoso como todo lo demás por aquí: el callback se dispara exactamente una vez por cada elemento que llega a pasar por él, en orden, y ni un momento antes.

peekAsync está construido directamente sobre mapAsync (espera a f y luego vuelve a emitir el valor original), así que comparte exactamente el comportamiento de concurrencia de map: .concurrent(n) ejecuta de verdad n callbacks en paralelo, a diferencia de flatMap o scan, cuyas máquinas de estado internas tienen que seguir siendo secuenciales.

Demo 1 · Fundamentos

Los mismos valores entran y salen — peek solo observa:

Demo 2 · Asíncrono, con concurrencia real

Pruébalo tú

Ejercicio: usa peek para imprimir 'checking price: $p' por cada precio sin cambiar los valores, y luego súmalos con fold.

Relacionado: mapEffect — como peek, pero puede transformar · map — transformar cada elemento · pluck — extraer un campo de cada map · concurrent — evaluación en paralelo