cases

Construye una tabla de despacho de predicado/mapeador, con un valor por defecto opcional.

R Function(T value) cases<T, R>(List<(bool Function(T), R Function(T))> pairs, {R Function(T)? orElse})

Lección

cases construye una función de coincidencia a partir de una lista de pares (predicado, mapeador): prueba cada par en orden y, al primero cuyo predicado devuelve true, le aplica su mapeador para producir el resultado. Es el sustituto funcional de una cadena de if/else if, y compone bien con map: la función devuelta es una función unaria normal T -> R que puedes pasar directamente.

Esta forma difiere de FxTS a propósito. El cases de FxTS es variádico: cada par [predicate, mapper] se pasa como su propio argumento final, con una función suelta opcional al final que actúa como valor por defecto, y los genéricos sobrecargados de TypeScript tipan cada aridad a mano. Dart no tiene ni genéricos variádicos ni sobrecargas por aridad, así que no hay forma de aceptar «cualquier número de pares» y conservar una comprobación de tipos real. La versión de FxDart toma en su lugar una única List de (predicado, mapeador) en forma de registros —el tipo tupla de Dart— más un parámetro con nombre orElse aparte, para que el valor por defecto nunca se confunda con un par más.

Si no coincide nada y no se pasa orElse, cases recurre a devolver el propio value, lo cual solo compila en el punto de llamada si T resulta satisfacer también R; en caso contrario lanza un StateError en tiempo de ejecución. En la práctica, pasa siempre orElse salvo que tengas la certeza de que tus predicados son exhaustivos.

Demo 1 · Fundamentos

Demo 2 · Un pipeline de calificaciones

Pruébalo tú

Ejercicio: clasifica cada tamaño como 'small' (<10), 'medium' (<30) o 'large'.

Relacionado: when / unless — un solo predicado, mismo tipo de resultado · throwError — un orElse habitual cuando no encontrar coincidencia debe ser fatal · always — un orElse constante · matches — un predicado que puedes conectar a un caso