uniqAdjacent

Descarta los elementos iguales a su predecesor — solo se van los duplicados adyacentes, y no se acumula ningún conjunto de vistos.

Iterable<A> uniqAdjacent<A>(Iterable<A> iterable) Iterable<A> uniqAdjacentBy<A, B>(B Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> uniqAdjacentAsync<A>(FxAsyncIterable<A> iterable) FxAsyncIterable<A> uniqAdjacentByAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx<T>.uniqAdjacent() / .uniqAdjacentBy<B>(B Function(T a) f) // chain (sync) FxAsync<T> FxAsync<T>.uniqAdjacent() / .uniqAdjacentBy<B>(FutureOr<B> Function(T a) f) // chain (async) FxEvents<T> FxEvents<T>.uniqAdjacent() / .uniqAdjacentBy<B>(B Function(T a) f) // chain (events)

Lección

uniq responde a «¿he visto este valor alguna vez?» — mantiene un conjunto con todo lo visto hasta el momento. uniqAdjacent() responde a otra pregunta: «¿el valor cambió?» Compara cada elemento solo con su predecesor inmediato, así que [1, 1, 2, 2, 1] se convierte en (1, 2, 1) — el 1 final sobrevive, porque es una racha nueva, no una repetición de la actual.

Eso lo convierte en el operador para colapsar rachas: feeds de estado que reportan lo mismo en cada tick, valores de sensores que se estabilizan, streams de log que repiten un nivel. Y como no hay conjunto de vistos, la memoria se mantiene constante por larga que sea la secuencia — seguro sobre fuentes inagotables donde uniq crecería sin límite. uniqAdjacentBy(key) compara por una clave derivada, reflejando a uniqBy.

Extensión de fxdart (sin contraparte en FxTS) — Rx lo llama distinctUntilChanged, los streams de Dart lo llaman Stream.distinct. El callback de clave async corre de un elemento en uno (la comparación es inherentemente ordenada), pero el tramo de aguas arriba sigue evaluándose en paralelo bajo concurrent.

Demo 1 · Colapsa rachas, conserva los regresos

Demo 2 · Cambios de estado por clave

Pruébalo tú

Ejercicio: reporta solo los momentos en que cambia la zona de un sensor.

Relacionado: uniq — deduplicación global con conjunto de vistos · uniqBy — deduplicación global por clave · pairwise — cuando necesitas ambos lados del cambio