loop-once
v1.0.4
Published
A safer loop for sync or async unique use cases
Downloads
14
Maintainers
Readme
loop-once
Social Media Photo by Kier in Sight Archives on Unsplash
A safer loop to iterate synchronously or asynchronously any unique identifier.
import loopOnce from 'loop-once';
// create a function that will iterate
// over whatever iterable is passed along
// and arbitrary pass your own Set or WeakSet
// as once would be otherwise created automatically.
const unique = loopOnce();
// given a list of references
// or primitives if a Set is passed along ...
const iterable = [
Promise.resolve('a'),
Promise.resolve('b'),
Promise.resolve('c')
];
// no matter how many times this will be called
// or how long it would take per each promise
// to resolve ...
const log = async () => {
// the following loop will log once resolved promises
for (const p of unique(iterable))
console.log(await p);
};
// try it!
log();
log();
log().then(log);
setTimeout(log, 1000);
// the output will be
// "a"
// "b"
// "c"
// and that's it 🥳
What exact problem does this module solve?
The TL;DR story here is that too many times I ended up writing code as such:
const visited = new WeakSet;
const bootstrap = async () => {
for (const thing of things) {
if (visited.has(thing)) {
visited.add(thing);
await init(thing);
}
}
};
Now I can use a single utility all over the place to do the same:
import loopOnce from 'loop-once';
const unique = loopOnce();
// every time I need to do the same ...
const bootstrap = async () => {
for (const thing of unique(things))
await init(thing);
};
That's it: I don't need to remember or worry about the fact bootstrap
could be called many times while still executing and that thing
should never be initialized twice.
I hope this explanation reasons well with you too 👋