takeWhileRight

Conserva la racha más larga del final de una fuente en la que se cumple un predicado, en el orden de la fuente.

Iterable<A> takeWhileRight<A>(bool Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> takeWhileRightAsync<A>(bool Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.takeWhileRight(bool Function(T a) f) // chain FxAsync<T> FxAsync.takeWhileRight(bool Function(T a) f)

Lección

takeRight toma los últimos n elementos; takeWhileRight toma los últimos que coinciden, sean los que sean. Es a takeRight lo que takeWhile es a take: un predicado donde el otro quería una cantidad.

Solo cuenta la racha que llega hasta el final. Si el último elemento ya falla, el resultado está vacío por larga que fuera la racha que había justo antes. Eso es lo que lo convierte en un operador de sufijo y no en una búsqueda de «la racha más larga en cualquier parte».

El resultado vuelve en el orden de la fuente, no invertido, así que encadena con todo lo demás de la biblioteca y encaja con dropWhileRight: entre los dos parten una fuente sin perder ni repetir nada.

No puede emitirse nada antes de que la fuente termine: hasta que no llega el último elemento, no se sabe de ningún elemento que pertenezca al sufijo. Sobre una List la racha final se busca caminando hacia atrás desde el final, así que el predicado solo ve esa racha; sobre cualquier otra fuente se prueba cada elemento en orden y la racha actual se almacena en memoria. Mantén el predicado puro y la diferencia no te alcanzará.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, y el reparto

Pruébalo tú

Ejercicio: conserva solo la racha final de lecturas iguales o superiores a 30.

Relacionado: dropWhileRight — el complemento: descarta esa misma racha · takeRight — un tramo final por cantidad · takeWhile — la misma idea desde el principio · filter — coincidencias en cualquier parte, no solo al final