[](https://github.com/jacobbubu/looper/actions?query=workflow%3A%22Build+and+Release%22) [


> Rewritten looper in TypeScript.
Normally, if mightBeAsync calls it's cb immediately
this would RangeError:
`` js`
let l = 100000
;(function next () {
if(--l) mightBeAsync(next)
})
looper detects that case, and falls back to a while loop,
in computer science something like this is called a trampoline)
this module is simpler than other trampoline libraries such as tail-call
because it does not preserve arguments. But this is still useful
for looping when async recursion is sometimes sync.
This is about 10 times faster than using setImmediate
` js
import looper from 'looper'
let l = 100000
const next = looper(function () {
if(--l) probablySync(next)
})
next()
`
when you want to stop looping, don't call next.looper` checks if each callback is sync or not,
so you can even mix sync and async calls!
MIT