windowed

Ventanas deslizantes de size elementos consecutivos, cada una empezando step elementos después de la anterior.

Iterable<List<A>> windowed<A>(int size, Iterable<A> iterable, {int step = 1, bool partial = false}) FxAsyncIterable<List<A>> windowedAsync<A>(int size, FxAsyncIterable<A> iterable, {int step = 1, bool partial = false}) Fx<List<T>> Fx<T>.windowed(int size, {int step = 1, bool partial = false}) // chain (sync) FxAsync<List<T>> FxAsync<T>.windowed(int size, {int step = 1, bool partial = false}) // chain (async)

Lección

chunk corta una secuencia en piezas sin solape. En cuanto las piezas deben solaparse — una media móvil, «tres lecturas consecutivas por encima del límite», cualquier pregunta de cada-elemento-con-sus-vecinos — acabas escribiendo a mano un bucle con índices y límites delicados. windowed(size) es ese bucle como operador perezoso: produce una List con cada grupo de size elementos consecutivos, deslizándose hacia delante step posiciones (1 por defecto) entre ventanas.

Dos perillas cubren toda la familia. step espacia las ventanas: step < size las solapa, step == size las hace encajar exactamente como chunk, y step > size muestrea dejando huecos. partial: true conserva las ventanas más cortas del final en lugar de descartarlas — de hecho chunk(n) es windowed(n, step: n, partial: true); comparten una única implementación.

Extensión de fxdart (sin contraparte en FxTS) — llamada como el windowed de Kotlin; quienes vengan de RxDart lo conocen como bufferCount(size, startEvery). Es perezoso como todos los operadores de fxdart: las ventanas se materializan pull a pull, así que compone con fuentes inagotables y con concurrent.

Demo 1 · Media móvil

Demo 2 · Las perillas step y partial

Pruébalo tú

Ejercicio: marca tres días consecutivos por encima del límite de gasto.

Relacionado: chunk — el caso especial sin solape · pairwise — ventanas de exactamente dos, como registros · scan — estado acumulado sin ventana fija