mapEither & mapEitherAsync

Ejecuta cada evento en su propio ámbito raise: r.raise (y r.ensure / r.bind) se convierte en un Left, un retorno normal en un Right.

FxEvents<Either<E, R>> FxEvents<T>.mapEither<E, R>(R Function(Raise<E> r, T value) f) FxEvents<Either<E, R>> FxEvents<T>.mapEitherAsync<E, R>(FutureOr<R> Function(Raise<E> r, T value) f)

Lección

attempt es la conversión de frontera — convierte lo que ya está en el canal de error en un Left. mapEither es el operador al que llegas después de eso, o sobre una fuente limpia: cada evento corre dentro de un constructor either, así que escribes Dart en línea recta con r.ensure / r.raise y el resultado del map entero es Either<E, R>. Un evento que falla no cancela la fuente; los eventos posteriores siguen llegando.

Una excepción lanzada se queda en el canal de error — ese es el contrato del constructor either, y mantiene a attempt como el único sitio donde un throw se convierte en un valor. Cuando un callback tanto eleva como lanza, prefiere eitherCatching dentro de mapEither para que salga un Either.

mapEitherAsync es el gemelo async: un evento a la vez, como asyncMap. La regla de eitherAsync se conserva: un raise debe ocurrir dentro de la cadena awaited. Un raise desde un future no awaited sobrevive al ámbito y aparece como un error de zona no manejado en vez de un Left.

Un error de la fuente atraviesa ambos operadores intacto. Conviértelos con attempt aguas arriba cuando también los quieras como Lefts.

Demo 1 · Un raise se convierte en Left, un return en Right

Demo 2 · mapEitherAsync, un evento a la vez

Pruébalo tú

Ejercicio: una excepción lanzada se queda en el canal de error, y la cadena continúa más allá de ella.

Relacionado: attempt — la frontera que convierte un throw en un Left · either constructor — el mismo ámbito raise, sobre un solo valor · rights / separated — parte los Eithers resultantes