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.

FxEvents<R> FxEvents<T>.mergeScan<R>(R seed, Stream<R> Function(R acc, T value) accumulator, {int? concurrent}) FxEvents<R> FxEvents<T>.switchScan<R>(R seed, Stream<R> Function(R acc, T value) accumulator) FxEvents<T> FxEvents<T>.expandEach(Stream<T> Function(T value) project, {int? concurrent})

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.

Relacionado: scan — la semilla se emite · switchMap / mergeMap — aplanado sin estado compartido · expand — aplanado de un nivel en el lado pull, el nombre que este no pudo tomar