rights, lefts & separated
Operadores conscientes de Either sobre una cadena de eventos de valores Either — desenrolla un lado, o divide ambos a la vez.
Lección
Una vez que una cadena es FxEvents<Either<L, R>>
— desde attempt o
mapEither —
estos tres operadores son las contrapartes del lado push de
FxEitherOps.
rights() conserva solo los éxitos, desenrollados;
lefts() conserva solo los fallos, desenrollados;
separated() divide en
(failures, successes) — la forma Either
de partition.
Aquí no viven terminales. pull() entrega la cadena a
FxAsync, donde sequence() y
flattenOrAccumulate() ya existen. Estos operadores
se quedan en la capa de eventos para que una UI pueda escuchar
éxitos y fallos como dos feeds.
separated() hereda las reglas de vida de
partition: el record se devuelve de inmediato,
escuchar cualquiera de los lados arranca la fuente, cancelar ambos
la cancela, y un valor que pertenece a un lado al que nadie
escucha se descarta en vez de almacenarse en búfer.
También hereda el fan-out de errores de partition: un
evento de error no es un Either, así que va a
cada lado que esté escuchando — un fallo aguas arriba aparece en
ambas mitades. Llama a attempt aguas arriba cuando un
fallo deba contarse una sola vez, como un Left en la
mitad failures.
Demo 1 · rights y lefts
Demo 2 · separated divide ambas mitades
Pruébalo tú
Ejercicio: un evento de error se propaga a ambas mitades;
attempt aguas arriba lo cuenta una sola vez.
sequence y flattenOrAccumulate ·
partition — el primo predicado de separated() ·
attempt — convierte un evento de error para que cuente una sola vez, en la mitad failures