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
I write both English & Spanish about different subjects. You can follow me on Twitter