Either combinators

Combinar, recurrir a una alternativa y validar: map2map5, alt, orElse, filterOrElse.

Either<L, T> Either.map2<B, T>(Either<L, B> b, T Function(R a, B b) combine) // …through map5 Either<L, R> Either.alt(Either<L, R> Function() other) Either<L2, R> Either.orElse<L2>(Either<L2, R> Function(L left) other) Either<L, R> Either.filterOrElse(bool Function(R value) predicate, L Function(R value) onFalse)

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.

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

Relacionado: 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