Either combinators
Combinar, recurrir a una alternativa y validar: map2…map5, alt, orElse, filterOrElse.
Lección
Either por sí solo te da
map, flatMap y fold. Estos cuatro
métodos cubren las formas que acababan convirtiéndose en un
flatMap con un if dentro.
map2 … map5: combinar resultados independientes
Cuando varios Either tienen que salir bien a la vez —
parsear un nombre y una edad y un email —,
map2 los combina y conserva el fallo más a la
izquierda. El callback combinador solo se ejecuta cuando todas
las ramas son Right. Las aridades llegan hasta cinco, el
mismo tope que
zipOrAccumulate2..5 y
Curry2..Curry5.
Aquí «fallar rápido» va del informe, no del trabajo. Las ramas
son valores que ya calculaste, así que todas se ejecutaron; lo que se
detiene en el primer fallo es la respuesta que recibes. Cuando quieres
todos los fallos — un formulario que marca los cuatro campos malos de
una vez —, eso es acumulación, que informa
con un EitherNel y necesita un ámbito
accumulate. Recurre a map2 cuando un solo
mensaje es la respuesta correcta.
alt y orElse: recurrir a una alternativa
alt es la escalera de alternativas: prueba esto y, si falló,
prueba aquello. La alternativa es un callback, así que no se toca nada más
allá del primer acierto — caché, luego disco, luego red, pagando solo por
lo que de verdad alcanzas. El fallo se descarta.
orElse es el mismo movimiento para cuando el fallo importa:
el manejador lo recibe y puede devolver un tipo de fallo distinto, así que
también es como se traduce un vocabulario de errores a otro.
recover es el hermano más rico.
Ejecuta el manejador dentro de un ámbito raise nuevo, de modo que el
manejador escribe Dart normal y llama a r.raise en lugar de
construir un Either a mano. Usa
alt/orElse cuando el Either de
reemplazo ya existe, y recover cuando el manejador tiene
trabajo de verdad.
filterOrElse: validar sobre la marcha
Degrada un Right cuyo valor falla un predicado a un
Left que el segundo callback construye a partir de ese
valor, de modo que el mensaje puede nombrar qué estaba mal. Un
Left pasa intacto y el predicado nunca se ejecuta.
Encadénalos y gana la primera comprobación que falle.
Es la forma sobre un valor Either de
Raise.ensure, que hace el mismo
trabajo dentro de un constructor either { }. Dentro de un
constructor, prefiere ensure; sobre un valor que ya tienes en
la mano, esto.
Demo 1 · map2 y map3
Demo 2 · alt, orElse, filterOrElse
Pruébalo tú
Ejercicio: rechaza una edad fuera de 0..149, con un mensaje tuyo.
Either — el tipo que estos extienden ·
either & Raise — ámbito constructor, ensure y recover ·
acumulación — todos los fallos en vez del primero ·
Either × pipelines — llevar Eithers a través de una cadena