pipe
Hace pasar un valor por una lista de funciones, de izquierda a derecha — con tipado dinámico.
Lección
En FxTS, pipe(x, f, g, h) es un pipeline currificado y
totalmente tipado: TypeScript tiene suficientes sobrecargas y trucos de
genéricos para inferir el tipo que sale de cada paso.
Dart no puede hacer esto. No existe un truco de
sobrecarga con genéricos variádicos, así que el pipe de
FxDart es honesto sobre el compromiso: recibe una
List<Function> normal y hace pasar un valor
dynamic por cada una en orden. Cada función recibe lo que
devolvió la anterior, sin ninguna comprobación estática de tipos entre
medias.
Es decir, pipe sigue funcionando y sigue leyéndose bien
para una transformación corta y desechable — pero un paso que espere el
tipo equivocado solo fallará en tiempo de ejecución, y el tipo
del resultado del pipeline entero es simplemente dynamic.
Si un paso de la lista devuelve un Future,
pipe lo espera automáticamente antes de pasar el valor al
siguiente paso, así que las funciones síncronas y asíncronas pueden
convivir en la misma lista.
Para cualquier cosa que vayas a conservar y mantener, prefiere la cadena
fx(): fx(x).map(f).filter(g) está totalmente
tipada, tiene autocompletado y detecta los tipos incompatibles en tiempo
de compilación — es precisamente la alternativa tipada a este tipo de
pipeline. Recurre a pipe cuando los pasos sean dinámicos por
naturaleza (por ejemplo, construidos a partir de una lista de funciones
en tiempo de ejecución) o cuando estés prototipando rápido.
pipeLazy es la misma idea, pero diferida: devuelve una
función que puedes llamar más tarde en lugar de ejecutarse al momento.
Demo 1 · Fundamentos
Un pipeline corto construido con las funciones data-first de FxDart:
Demo 2 · La pega, sin adornos
Un paso que espera el tipo equivocado compila sin problemas y solo
revienta cuando llega a ejecutarse — esto es justo lo que las cadenas
fx() están diseñadas para evitar:
Pruébalo tú
Ejercicio: haz pasar una lista de números por un paso de filtrado y un paso de suma.