Programando com Ramda JS
Tags: functional, webdev, javascript, programming
Published: 2021-03-01 12:46:01

Algumas coisas que aprendi depois de conhecer o Ramda, uma excelente biblioteca de programação funcional.

O Ramda facilita diversos métodos que a gente utiliza no dia a dia, além de melhorar performance e evitar erros. A dificuldade de achar conteúdos em português sobre o Ramda fez com que eu tivesse a ideia para este texto.
Mesmo lendo a documentação, confesso que ainda tem coisas que me deixam boiando. Não sou uma especialista, mas quero compartilhar e comentar alguns métodos bem bacanas que ele permite usar!

<h2>Programação Funcional</h2>

Antes de focarmos no Ramda, vale uma breve explicação sobre programação funcional, que tem tudo a ver com ele. O que é? Onde vive? O que come?

Ela é baseada na aplicação de funções matemáticas e utiliza o conceito de imutabilidade. Nela, o código tem funções/passos para chegar à resolução de um problema.

<blockquote>"Já existem várias bibliotecas excelentes com um sabor funcional. Normalmente, elas devem ser kits de ferramentas de uso geral, adequadas para trabalhar em vários paradigmas.
Ramda tem um objetivo mais focado. Queríamos uma biblioteca projetada especificamente para um estilo de programação funcional, que facilite a criação de pipelines funcionais, que nunca modifique os dados do usuário"</blockquote>

O Ramda é justamente uma ótima biblioteca de programação funcional.

<h2>Alguns recursos do Ramda<h2>

Abaixo veremos alguns métodos do Ramda. Você também pode verificá-los na [documentação](https://ramdajs.com/docs/#)

<h3>ANY, EQUALS, VALUES</h3>
Com esse recurso, podemos procurar um valor específico dentro de um array ou objeto.

<pre>import {any, equals, values} from 'ramda'
const array = [1,2,3,6,7,8,0]
any(equals(0))(values(array))
//true</pre>

Assim, se algum (any) valor do array (values) for igual (equal) a zero, ele retornará true. :D


<h3>PATH, PIPE, MAP</h3>

Agora vamos supor que você tem um objeto e gostaria de pegar os nomes de autores de livros.

<pre>let library= {
     “books”: {
      “authors”: [
       {“authorName”:”Kyle Simpson”,”book”:”you don’t know JS”}, 
      {“authorName”:”David Flanagan”,”book”:”O guia definitivo JS”}
    ]
  }
}</pre>

Com o Ramda, podemos fazer:

<pre>//react component
import {path, pipe, map} from 'ramda'
const getAuthors = pipe(
  path(["book" , "authors"] ),
  map(item => item.authorName)
 );
getAuthors(library);
//["Kyle Simpson", "David Flanagan"]</pre>

Confesso que, usando o pipe no dia a dia, às vezes é mais chatinho de entender. Ele cria a sequência de funções que você quiser, então entender a construção que cada dev faz pode ser complicado.
Um outro detalhe muito importante, o PIPE executa a composição da esquerda pra direita e o COMPOSE executa da direita pra esquerda. O COMPOSE é a mesma coisa do PIPE, porém em outro sentido de execução da composição.
Esses métodos são bem importantes, pois facilitam quando precisamos usar vários outros métodos ao mesmo tempo, compondo o que precisamos :D

<h3>MergeDeepRight</h3>

Como uma boa taurina que adora comer, sempre gosto de acrescentar mais uma coisinha no meu sanduíche.

<pre>//react component
import {mergeDeepRight} from 'ramda'
const sandwich = {
 bread: “normal”,
 cheese: “blue cheese”,
 meat: “knuckle”
}
const withSalad = mergeDeepRight(sandwich, {
 salad: ‘pickle’,
 });
mergeDeepRight(withSalada, sandwich)
//{"meat": "knuckle", "bread": "normal", "cheese": "blue cheese", "salad": "pickle"}</pre>

Em resumo, o Ramda é uma ferramenta muito legal, focada em obter desempenho.

Com ele, as implementações ficam mais simples e rápidas que com os métodos nativos. Além disso, ele trabalha o mantra DRY (don't repeat yourself). 

No geral, use-o para facilitar sua vida e trazer performance. ;)
Alguns links legais que achei pesquisando (infelizmente a maior parte está em inglês):

[Tutoriais legais no YouTube](https://www.youtube.com/watch?v=Cltoo-NJ2JM)
[Why I Fell in Love With Ramda](https://betterprogramming.pub/why-i-fell-in-love-with-ramda-and-functional-programming-in-javascript-797c070133b0)
[Why Ramda?](https://fr.umio.us/why-ramda/)
[A beginners guide to Ramda (Part 1)](https://itnext.io/a-beginners-guide-to-ramda-part-1-7e4a34972e97)
[A beginners guide to Ramda (Part 2)](https://itnext.io/a-beginners-guide-to-ramda-part-2-lenses-62bdd3993598)
[Functional Programming in JS with Ramda](https://medium.com/@arecvlohe/functional-programming-in-js-with-ramda-5ea226e76df1)

Espero que tenham gostado!

;*