uniqAdjacent
Descarta los elementos iguales a su predecesor — solo se van los duplicados adyacentes, y no se acumula ningún conjunto de vistos.
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.