Either × pipelines

Errores tipados fusionados con los pipelines perezosos y conscientes de la concurrencia de FxDart — la pieza que no tienen ni Arrow ni ninguna librería FP de Dart.

on Fx<Either<L, R>>: rights() · lefts() · separated() · sequence() · flattenOrAccumulate() on FxAsync<Either<L, R>>: rights() · lefts() · separated() · sequence() · flattenOrAccumulate() on Fx<T> / FxAsync<T>: Either<Nel<E>, List<R>> mapOrAccumulate(transform, {concurrency})

Lección

Una cadena de valores Either gana terminales que entienden de Either: rights() y lefts() se quedan con uno de los dos lados, separated() parte los dos a la vez (con la misma forma de record que partition) y sequence() es todo o nada — recoge todos los aciertos en una sola lista y falla rápido en el primer Left. Como el pipeline es perezoso, el fail-fast es literal: sequence() deja de tirar de valores en el primer fallo, así que los elementos posteriores nunca llegan a computarse.

Su gemelo fail-slow es mapOrAccumulate(transform) sobre cualquier cadena fx()/asíncrona: valida todos los elementos y conserva todos los fallos. En cadenas asíncronas acepta concurrency: n y viaja por el mismo canal de retorno concurrent(n) que el resto de FxDart — n elementos en vuelo, resultados en orden, y cada elemento se ejecuta en su propio ámbito, así que un fallo en uno jamás puede filtrarse a otro.

Todos ellos son ansiosos por diseño, lo que además los convierte en la vía de escape autorizada del peligro pereza × raise: nunca devuelvas un pipeline perezoso desde un bloque raise — devuelve en su lugar uno de estos resultados.

Demo 1 · rights, lefts & separated

Demo 2 · sequence — fail-fast, literalmente

Demo 3 · validación fail-slow concurrente

Demo 4 · flattenOrAccumulate y los extractores async

Cuando ya tienes los Eithers, el terminal fail-slow se escribía mapOrAccumulate((r, v) => r.bind(v)) — un bind identidad. flattenOrAccumulate() (el nombre de Arrow) es ese terminal directamente: cada éxito, o cada fallo como un Nel. Completa el trío — separated() conserva ambos lados, sequence() falla rápido, flattenOrAccumulate() falla lento. Y la cadena async ya lleva la familia completa de extractores (rights / lefts / separated / sequence / flattenOrAccumulate), así que una validación async alimenta una insignia de conteos en un solo terminal.

Pruébalo tú

Ejercicio: suma lo que sí se parseó e informa de lo que no.

Relacionado: acumulación — el vocabulario fail-slow a nivel de ámbito · concurrent — el canal de retorno por el que viaja la variante asíncrona · partition — el primo de separated() basado en predicados · rights / separated — las mismas extracciones en una cadena de eventos · errores tipados — guía completa