1.0.4 • Published 3 months ago

loop-once v1.0.4

Weekly downloads
-
License
MIT
Repository
-
Last release
3 months ago

loop-once

Coverage Status

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 👋

1.0.4

3 months ago

1.0.3

3 months ago

1.0.2

3 months ago

1.0.1

3 months ago

1.0.0

3 months ago

0.1.1

3 months ago

0.1.0

3 months ago

0.0.0

3 months ago