Executando verificação de segurança...
4

Usando callbacks fica mais simples:

const _for = (step) => (cond, cb, init = 0) => {
  const iterate = (i) => {
    if (cond(i)) return
    cb(i)
    iterate(step(i))
  }
  iterate(init)
}

const times = _for(i => i + 1)
const until = n => i => i >= n

times(until(10), i => times(until(10), j => console.log(i, j)))
Carregando publicação patrocinada...
2

Boa, a ideia de usar callbacks real ajuda mt, usei bastante pra compor a minha solução aki:

F = (s, e, T=(i)=>i, C=(i,e)=>i>=e, A=(i)=>++i) =>
	C(s, e) ? [] : [T(s), ...F(A(s), e, T, C, A)];

console.log(F(0,5));
console.log(F(100, 0, (i)=>i**2, (i,e)=>i<=e, (i)=>i-10));

Eu dei mais detalhes no outro comentário ali, é massa q chegamos em soluções parecidas em essência. O meme eh q a minha devolve um array no final, o que não eh mt necessário. Good job maninho(a)! 💪

1

Yo yo, a sua resolução é bastante interessante, gostei da implementação e da forma que fez a sua solução para esse desafio, mas senti falta de alguns pontos, como:

  1. Explicação de como chegou nesse resultado.
  2. Explicação de como funciona de fato essa função.

Só senti falta desses pontos, teria sido mais interessante os ter adicionado, mas realizou o desafio e de uma forma criativa, meus parabéns. ^-^