Cristian Personal Blog

Programación Funcional. Pipe

May 29, 2019

El concepto de pipe es simple - combina n cantidad de funciones. Es un tubo que fluye de izquierda a derecha, llamando cada una de las funciones con el resultado de la anterior.

Vamos a escribir una función que retorna el nombre de una persona usando el objeto person:

getName = (person) => person.name
console.log(getName({ name: 'Cristian'}))
// 'Cristian'

Ahora vamos a escribir una función que convierte Strings a Mayúsculas:

upperCase = string => string.toUpperCase()
console.log(upperCase('Cristian'))
// 'CRISTIAN'

Si queremos convertir el nombre del objeto person, podríamos hacer lo siguiente:

upperCase(getName({name: 'Cristian'}))
// 'CRISTIAN'

Ahora, vamos a crear una función para revertir un String:

reverse = string => string.split('').reverse().join('')
reverse('Cristian')
// 'naitsirC'

En ese caso, ahora tendríamos algo como esto:

reverse(upperCase(getName({name: 'Cristian'})))
// 'NAITSIRC'

Y podríamos seguir y seguir y sería un gran tamal!!

Pipe

En lugar de estar juntando funciones una encima de otra, metamoslas en un solo tubo!

pipe(getName, upperCase, reverse)({name: 'Cristian'})

Acá podríamos usar ramdajs para hacer uso de la función pipe. Pero en este caso no ocupamos importar toda una librería a nuestro poryecto y en su lugar usamos la siguiente función:

pipe = (...funcs) => (...args) => funcs.reduce((acc, func, i) => (i === 0 ? func(...acc) : func(acc)), args)

Usando rest parameters podemos hacer pipe a n cantidad de funciones. Cada función toma el resultado de la función anterior y todo es reducido a un solo valor.

Así todo lo que hicimos quedaría como:

pipe(getName, upperCase, reverse)({name: 'Cristian'})
// 'NAITSIRC'

Fuente: freeCodeCamp


Cristian Echeverría

Written by Cristian Echeverría who lives and works in Sweden building useful things. You should follow him on Twitter