pairwise

Cada elemento emparejado con su sucesor: [a, b, c] se convierte en ((a, b), (b, c)).

Iterable<(A, A)> pairwise<A>(Iterable<A> iterable) FxAsyncIterable<(A, A)> pairwiseAsync<A>(FxAsyncIterable<A> iterable) Fx<(T, T)> Fx<T>.pairwise() // chain (sync) FxAsync<(T, T)> FxAsync<T>.pairwise() // chain (async) FxEvents<(T, T)> FxEvents<T>.pairwise() // chain (events)

Lección

«¿Cuánto cambió?» necesita dos elementos a la vez — el anterior y el actual — y un map normal solo ve uno. Los apaños habituales son un bucle con índices (list[i - 1], con su riesgo de descuadre incluido) o hacer zip de una lista consigo misma desplazada en uno. pairwise() es esa idea como operador: produce registros (anterior, actual), perezosamente, con n − 1 pares para n elementos. Con menos de dos elementos no produce nada — no hay par que formar.

Los campos del registro mantienen ambos lados al alcance: p.$2 - p.$1 es el delta, p.$2.compareTo(p.$1) la dirección. Es exactamente windowed(2) con registros tipados en lugar de listas de dos elementos — recurre a windowed cuando el vecindario crezca más allá de dos.

Extensión de fxdart (sin contraparte en FxTS), inspirada en el pairwise de RxDart. La forma async no computa nada hasta que se le pide y compone con concurrent.

Demo 1 · Deltas entre lecturas

Demo 2 · Dirección del cambio

Pruébalo tú

Ejercicio: encuentra los huecos en una secuencia de timestamps.

Relacionado: windowed — vecindarios de más de dos · zip — emparejar dos secuencias distintas · scan — llevar estado en lugar de mirar uno atrás