Antes que nada, tenemos que saber que curry es un concepto de functional programming (uno de mis temas favoritos!)
Imagina que tienes una función suma.
Suma recibe 3 argumentos y regresa la suma de ellos.
Es un caso super común! Pero qué tal si queremos tener la opción de enviarle los argumentos 1 a 1, en diferentes tiempos, y que se ejecute "mágicamente" hasta que tenga todos?
Esto es el concepto de curry, y en este caso es una "curried function"
En otros lenguajes de programación, las funciones pueden recibir argumentos en diferentes cantidades y ejecutarse hasta tenerlas todas.
En #javascript, no tenemos esa cualidad, y tenemos que hacerlo manualmente.
Como sería la función anterior en versión curry?
Ah! Solamente separamos los argumentos. Y cada que recibimos uno, regresamos una función que espera el siguiente argumento.
Cuando todos los argumentos son recibidos, finalmente la función se ejecutará.
Pero para que sirve este concepto en la vida real?
Curry es muy útil para "precargar" funciones, y crear funciones nuevas que tengan un valor inicial.
Nos ayuda a evitar duplicar datos y a crear abstracciones!
Es una función extremadamente poderosa del mundo de functional programming.
Ahora bien, no siempre vamos a tener la oportunidad de separar una función manualmente. Qué tal si ya está siendo usada por otros ingenieros del equipo?
La adaptación es una gran cualidad!
Y por ello es que #lodash creo una función para eso!
Lo mejor de usar estas herramientas no es instalarlas, sino saber que hacen y porque.
Es hora de crear nuestro propio curry 🍛
Y lo más cool, vamos a tomar algunos conceptos interesantes de #javascript en el camino.
Empecemos!
Curry recibe una función (fn). Y necesitamos una forma de saber cuantos argumentos va a recibir esa función!
Sabías que las funciones tienen una propiedad "length", que nos dice este dato? Justo lo que necesitamos.
La variable args nos va ayudar a detectar los argumentos que estamos recibiendo.
Recordemos la parte nuclear de curry: si aún no tenemos todos los argumentos, tenemos que regresar una función que esta esperando los argumentos faltantes.
Cada que nos lleguen argumentos, los guardamos en un array. Si el array es del mismo tamaño que los argumentos de la función que nos mandaron, significa que estamos listos para ejecutar la función!
Sino, podemos hacer una recursión y regresar esta función para seguir esperando.
Y ahora curry nos puede ayudar a transformar cualquier función "ordinaria" en una que reciba los argumentos en diferentes formas!
Curry nos da una flexibilidad increíble para manipular nuestras funciones.
Y una pequeña aclaración! El concepto de curry es "una función que recibe argumentos uno por uno"
Existe otro concepto llamado "partial application" (aplicación parcial), que es "una función que recibe argumentos en diferentes cantidades hasta tener las que necesita"
Sin embargo, lodash implementa ambos conceptos en su función curry. Y por ello creamos en este #thread esa solución que involucra ambos conceptos.
Curry toca ideas de recursión y propiedades de las funciones para control de argumentos.
Nos vemos pronto en otro ⚡️ #thread de "conociendo los algoritmos de tu librería favorita"!
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Varios de estos recursos los sigo leyendo cada cierto tiempo, y son excelentes para prepararse en la entrevista especializada de Front End de las empresas grandes en Silicon Valley / #FAANG
[1/x]
Eloquent Javascript: mi biblia de JS enfocado al browser. Desde APIs del DOM hasta técnicas para mejorar el performance de las aplicaciones web.
Si tuvieras que elegir un libro de esta lista, que sea este.
Marca un antes y después como developer.
#CSS Secrets: Cuando empecé mi carrera como front end, odiaba CSS.
Este libro me abrió la mente para descubrir que no lo odiaba, sino que no lo entendía. Y va mucho más allá: no solo ser técnico, pero creativo al crear una UI.
En lo que tengo mi break del segundo día de on boarding en #Google, les dejo uno de mis tools favoritos para codear: hablemos de terminales.
lightning #thread ⚡️🧵