Pipe operator em JavaScript com o Babel
…ou como ter um fluxo decente e legível ao trabalhar com funções
Quando trabalhamos diretamente com funções em JavaScript, é comum nos perdermos em meio à complexa pilha de chamadas encadeadas e dezenas de parênteses um tanto confusos. O operador de pipe é comum nas linguagens funcionais, como LiveScript, OCaml, Elixir e F#, e ajuda a modelar o fluxo de uma forma mais humana do que a composição direta.
Se você usa o Babel, deve saber que o compilador possui uma extensividade tremenda. No Rung, utilizamos amplamente a extensibilidade do compilador para modelar soluções para nossos problemas; normalmente através de plugins para o compilador.
Há a proposta do operador de pipe |>
para JavaScript, mas ela possui diversas limitações (como não permitir corretamente parcialização), e dificulta o trabalho com algumas bibliotecas, como a Ramda. No entanto, não nos limitaremos. Podemos sobrecarregar o operador |
para trabalhar com funções.
Configure o Babel
O processo é relativamente simples. O plugin está disponível no GitHub. Tudo que precisamos fazer é instalá-lo como dependência de desenvolvimento e adicionar sua configuração ao .babelrc
:
npm install --save-dev babel-plugin-pipe-operator-curry
E no .babelrc
:
"plugins": ["pipe-operator-curry"]
Então, toda ocorrência de x | f(y)
será substituída por f(y)(x)
.
Isso nos permite simplificar grandemente séries de transformações:
Se você trabalha amplamente com funções, outra utilidade pode ser o babel-plugin-function-composition, que sobrecarrega o operador &
para compor funções e retornar funções mais complexas a partir disso. Dessa maneira, poderíamos modelar o exemplo acima por composição, criando uma função isolada e usando tacit programming, também conhecida como programação point-free, onde funções são criadas mesmo com os argumentos omitidos:
Nessa situação, getValue
será não um valor literal, mas uma função, que quando aplicada a uma lista sequenciará as computações. Utilizamos ali uma técnica conhecida como aplicação parcial.
Não tenha medo do compilador
O Babel é seu amigo. Não tenha medo dele. A sua extensibilidade permite adaptar a linguagem da maneira que melhor resolve seu problema, e existem diversos plugins excelentes para ele. Aproveite sem medo 😄!