compress

Conserva los elementos de un iterable allí donde una lista paralela de booleanos vale true.

Iterable<B> compress<B>(List<bool> selectors, Iterable<B> iterable) FxAsyncIterable<B> compressAsync<B>(List<bool> selectors, FxAsyncIterable<B> iterable)

Lección

compress es una máscara posicional: el elemento i de iterable sobrevive solo si selectors[i] es true. Está construido directamente a partir de dos funciones que ya conoces — map((r) => r.$2, filter((r) => r.$1, zip(selectors, iterable))) — combina la máscara con los datos, filtra los pares que dan true y desempaqueta. Eso también significa que hereda el comportamiento de zip ante longitudes distintas: la iteración se detiene en cuanto se agota el más corto de selectors o iterable, así que una lista de selectores corta trunca el resultado en silencio. Úsalo cuando ya tengas de antemano (o puedas calcular a bajo coste) una máscara booleana — por ejemplo, «qué respuestas del test fueron correctas» — en vez de recalcular un predicado por elemento como haría filter.

No hay método de cadena; llama directamente a la función data-first o a su contraparte asíncrona, o envuelve el resultado con fx(...) / fxAsync(...) para seguir encadenando.

Demo 1 · Fundamentos & longitudes distintas

Demo 2 · Asíncrono, con concurrencia

Pruébalo tú

Ejercicio: usa compress para quedarte solo con las respuestas correctas.

Relacionado: filter — filtra por predicado en lugar de por una máscara precalculada · zip — la función sobre la que se construye compress · differenceBy — filtra por pertenencia a otro iterable · partition — divide en conservados/descartados en una sola pasada