dropWhileRight

Descarta la racha más larga del final de una fuente en la que se cumple un predicado: recorta la cola.

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

Lección

Este es el operador de recorte. Ceros finales, líneas en blanco finales, una cola de filas de relleno: cualquier cosa que quieras fuera del final sin contarla antes, que es todo lo que dropRight sabe hacer.

Solo se descarta la racha que llega hasta el final. Una racha coincidente en mitad de la fuente no es un sufijo y se queda exactamente donde está; es lo único que conviene contrastar con tu intuición, ya que filter y reject sí la habrían borrado.

A diferencia de takeWhileRight, este va emitiendo sobre la marcha. Una racha coincidente se retiene en vez de emitirse, porque podría resultar ser el sufijo; el primer elemento que falla el predicado demuestra que no lo era y libera la racha entera de golpe. Así el coste en memoria es la racha más larga, no la longitud de la fuente, y los valores siguen fluyendo mientras la fuente está abierta.

Sobre una List la racha 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. Mantén el predicado puro.

Demo 1 · Fundamentos

Demo 2 · Asíncrono, y el reparto

Pruébalo tú

Ejercicio: descarta los ceros finales y conserva el resto.

Relacionado: takeWhileRight — el complemento: conserva esa misma racha · dropRight — recorta un tramo final por cantidad · skipWhile — la misma idea desde el principio · whereNot — borra coincidencias en cualquier parte, no solo al final