CodeForge

JavaScript de Cero a Experto / JS funcional

Composición y pipes: la línea de ensamble

Teoría20 min20 XP

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:

combo.js
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, intacto

Lé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.