# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.guiseek.dev/snippets/pipe.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
