Pipe

Concatenando funções

Quem programa está acostumado com o conceito de pipe, pois utilizamos pipes em diversos lugares, certo? Por exemplo, quando pegamos a saída de um comando e usamos como entrada para outro comando em no terminal.

history | grep x

Usamos o caractere pipe | para concatenar 2 comandos.

Quando trabalhamos com streaming de dados também vemos o uso de pipes, seja com a biblioteca rxjs ou nativamente com a api da web streams, ou ainda com a api web streams do nodejs.

Mas como eu posso concatenar funções, para que uma função receba como argumento o retorno da função anterior? E eu lhe digo, isso pode ser feito usando reduce!

Vamos primeiro implementar usando apenas JavaScript, para entender de forma simples o que é estritamente necessário para essa implementação.

function pipe(...[fn, ...fns]) {
  return (value) => fns.reduce((prev, curr) => curr(prev), fn(value))
}

Então podemos criar como exemplo uma função que calcula um valor ao quadrado.

const square = (value) => value * 2

Perceba que ela só precisa do valor que será trafegado entre as funções e nada mais, agora vamos criar outra função que calcula a porcentagem e desta vez precisamos informar quantos % queremos.

const percent = (n) => (value) => (n / 100) * value

Vamos concatenar os 2 exemplos.

const calculate = pipe(square, percent(10))

Agora temos uma função nomeada calculate, que recebe um parâmetro e processa o fluxo com ele, retornando o resultado final.

calculate(100) // 20

O que achou?

No próximo vou mostrar como escrever em TypeScript, facilitando a experiência de uso com tipagem estática.

Valeu, abraço

[]s

Last updated