> For the complete documentation index, see [llms.txt](https://docs.guiseek.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.guiseek.dev/snippets/pipe.md).

# Pipe

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.

```bash
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](https://rxjs.dev) ou nativamente com a api da web [streams](https://streams.spec.whatwg.org), ou ainda com a api [web streams](https://nodejs.org/api/webstreams.html) 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](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)!

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

```javascript
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.

```javascript
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.

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

Vamos concatenar os 2 exemplos.

```javascript
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.

```javascript
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
