JavaScript de Cero a Experto / JS funcional
Composición y pipes: la línea de ensamble
Tienes piezas puras y fábricas que las producen. La jugada maestra del
estilo funcional es conectarlas: la salida de una es la entrada de la
siguiente, y el programa se convierte en un desfile de transformaciones.
Hoy construyes pipe — la función de tres líneas que arma esos desfiles —
y no vas a querer volver atrás.
La línea de ensamble
Del anidado al pipe
Componer a mano ya lo haces: f(g(x)). El problema es cosmético pero
real — se lee AL REVÉS (la última operación aparece primero):
Desarma el pipe con calma, porque junta medio curso en tres líneas: es
una fábrica (lección pasada) que recibe las estaciones con rest (módulo
3) y devuelve una función; cuando esa función recibe el dato inicial,
reduce (módulo 4) hace rodar la banda — el acumulador es EL PRODUCTO
pasando de estación en estación, y cada vuelta aplica la siguiente
función. La bola de nieve, hecha maquinaria.
Pipelines con fábricas: el combo completo
El pipe brilla de verdad cuando las estaciones salen de tus fábricas de la lección 3 — líneas de ensamble configurables al vuelo:
const filtrar = (criterio) => (lista) => lista.filter(criterio);
const ordenarPor = (campo) => (lista) =>
lista.toSorted((a, b) => b[campo] - a[campo]);
const tomar = (n) => (lista) => lista.slice(0, n);
const top2Comida = pipe(
filtrar((g) => g.categoria === "comida"),
ordenarPor("valor"),
tomar(2)
);
top2Comida(gastos); // [Mercado, Almuerzo] — y el original, intactoLéelo en voz alta: "filtra comida, ordena por valor, toma 2". El código ES
la frase — a eso se le llama estilo declarativo: describes QUÉ pasa con
los datos, no CÓMO iterar. Y como cada estación es pura e inmutable
(filter, toSorted, slice — todas producen copias), la línea entera
es pura: testeable de una, sin sorpresas.
Dos notas honestas: primero, para transformar UN array, encadenar métodos
(gastos.filter(...).toSorted(...).slice(...)) logra lo mismo y es
perfectamente válido — pipe gana cuando las estaciones mezclan tipos
(array → número → string, como el primer ejemplo) o cuando quieres
guardar la línea como pieza reutilizable. Segundo, este patrón le
encantó tanto al lenguaje que hay una propuesta oficial para volverlo
operador nativo (|>); mientras llega, tu pipe de tres líneas es el
estándar de facto en todo código funcional que leerás.
En pipe(soloComida, totalizar, enCOP), ¿qué recibe exactamente la estación totalizar cuando corre la línea con gastos?
Mini-reto
El informe ejecutivo de "Mi Bolsillo" como línea de ensamble: construye
con pipe la función resumenTransporte que — en estaciones separadas y
reutilizables — filtre transporte, totalice, y produzca el string final
"Transporte del mes: $X" (la última estación es
(valor) => \Transporte del mes: ...`). Luego demuestra el superpoder: fabrica resumenOcio` reutilizando TODAS las estaciones menos el filtro.
Dos informes, cero código duplicado, original intacto.
Qué sigue
Notaste el patrón de las fábricas-estación: (config) => (dato) => ... —
funciones que reciben sus argumentos POR ETAPAS. Eso tiene nombre propio,
currying, y es la última pieza técnica del módulo: cómo y cuándo partir
una función en pasos para que encaje perfecta en tus pipes.