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.
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.
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