mergeScan, switchScan & expandEach
Pliega cada evento en estado compartido a través de un stream interno — fusiónalos, cámbialos o recorre un árbol. La semilla no se emite.
Lección
FxEvents.scan emite primero la semilla y luego cada
acumulación en curso — la convención de la capa pull, igual que
scan.
mergeScan y switchScan
no. La semilla es solo el acumulador de partida,
nunca un evento. Eso coincide con Rx, y es lo que sorprende a quien
viene de FxEvents.scan: una fuente vacía
cierra vacía.
mergeScan(seed, acc) pliega cada evento abriendo
accumulator(state, value) como un stream interno. Cada
emisión interna se convierte en el nuevo estado y se reenvía. Con
concurrent: n como mucho n internos corren a la
vez y el resto espera en una cola; comparten una sola variable de
estado — gana la última emisión interna. concurrent
nulo es ilimitado. El resultado cierra cuando la fuente ha cerrado y
todo interno ha terminado.
switchScan es el hermano que cancela: un nuevo valor de
la fuente cancela el interno anterior a mitad de
vuelo, y la última emisión interna (si la hay) es el estado que se
entrega a la siguiente llamada del acumulador. Tras cerrar la
fuente, se deja terminar el interno actual.
expandEach es el expand de Rx, renombrado
porque la capa pull ya usa esa palabra para el
flatMap de iterables.
Emite cada valor de la fuente y luego aplana de forma recursiva el
project de ese valor — y de cada valor que
project emita a su vez — en anchura primero. Un
project que nunca devuelve un stream vacío no
terminará. Capa de eventos de fxdart, siguiendo a
mergeScan, switchScan y
expand de Rx.
Demo 1 · mergeScan — la semilla se queda en silencio
Demo 2 · switchScan — lo más nuevo cancela
Pruébalo tú
Ejercicio: expandEach, un árbol finito 0 → 1 → 2.