How do I replace while loops with a functional programming alternative without tail call optimization? : <p>I am experimenting with a more functional style in my JavaScript; therefore, I have replaced for loops with utility functions such as map and reduce.  However, I have not found a functional replacement for while loops since tail call optimization is generally not available for JavaScript.  (From what I understand ES6 prevents tail calls from overflowing the stack but does not optimize their performance.)</p>

<p>I explain what I have tried below, but the TLDR is:
If I don't have tail call optimization, what is the functional way to implement while loops?</p>

<p>What I have tried:</p>

<p>Creating a "while" utility function:</p>

<pre><code>function while(func, test, data) {
  const newData = func(data);
  if(test(newData)) {
    return newData;
  } else {
    return while(func, test, newData);
  }
}
</code></pre>

<p>Since tail call optimization isn't available I could rewrite this as:</p>

<pre><code>function while(func, test, data) {
  let newData = *copy the data somehow*
  while(test(newData)) {
    newData = func(newData);
  }
  return newData;
}
</code></pre>

<p>However at this point it feels like I have made my code more complicated/confusing for anyone else who uses it, since I have to lug around a custom utility function.  The only practical advantage that I see is that it forces me to make the loop pure; but it seems like it would be more straightforward to just use a regular while loop and make sure that I keep everything pure.</p>

<p>I also tried to figure out a way to create a generator function that mimics the effects of recursion/looping and then iterate over it using a utility function like find or reduce.  However, I haven't figured out an readable way to do that yet.</p>

<p>Finally, replacing for loops with utility functions makes it more apparent what I am trying to accomplish (e.g. do a thing to each element, check if each element passes a test, etc.).  However, it seems to me that a while loop already expresses what I am trying to accomplish (e.g. iterate until we find a prime number, iterate until the answer is sufficiently optimized, etc.).</p>

<p>So after all this, my overall question is: If I need a while loop, I am programming in a functional style, and I don't have access to tail call optimization, then what is the best strategy.</p>
