Composição de funções

A composição de funções permite concatenar sucessivas definições de funções a fim de gerar uma única função representativa desse "pipeline".

Uma função de composição pode ser definida seguindo o template a seguir.

const composicao =
    (...fns) =>
        (valor) => fns.reduce((acc, fn) => fn(acc, valor))

O operador ... se chama spread, e serve para permitir expandir uma expressão em um local que receba múltiplos argumentos ou elementos.

Exemplo

Crie um programa para contar o número de caracteres de cada palavra de uma lista, multiplicar esse valor por 3 e depois gerar uma lista crescente dessa lista resultante. Você deve compor as funções de contagem, de triplicação e de ordenação em uma única função.

const contagem = (lista) => lista.map((texto) => texto.length)
const triplo = (lista) => lista.map((x) => 3 * x)
const ordena = (lista) => lista.sort((a, b) => a - b)

const composicao = (...fns) => (lista) => fns.reduce((acc, fn) => fn(acc), lista)

const geraResultado = composicao(
    contagem,
    triplo,
    ordena
)

const nomes = ['Ana Beatriz', 'Bia', 'Guilherme', 'João', 'Rafael']

console.log(geraResultado(nomes))

[ 9, 12, 18, 27, 33 ]