UNPKG

@dpaskhin/unique

Version:

Ensures unique values by rejecting duplicates.

63 lines (62 loc) 1.82 kB
// src/main/index.ts function uniqueFactory(fn, options = {}) { let { store = /* @__PURE__ */ new Set(), maxRetries = 50, maxTime = 50, exclude = [], stringifier = JSON.stringify } = options; return exclude = exclude.map((value) => stringifier(value)), function(...args) { let result, currentIterations = 0, startTime = Date.now(); for (; ; ) { let duration = Date.now() - startTime; if (duration >= maxTime) throw new UniqueError( `Exceeded maxTime (${maxTime})`, store.size, duration, currentIterations ); if (currentIterations >= maxRetries) throw new UniqueError( `Exceeded maxTries (${maxRetries})`, store.size, duration, currentIterations ); result = fn.apply(null, args); let tmpResult = stringifier(result); if (currentIterations++, !store.has(tmpResult) && !exclude.includes(tmpResult)) { store.add(tmpResult); break; } } return result; }; } var GLOBAL_STORE = /* @__PURE__ */ new Set(); function unique(fnOrValue, argsOrOptions, options = {}) { return typeof fnOrValue == "function" ? uniqueFactory( fnOrValue, Object.assign({}, options, { store: options.store || GLOBAL_STORE }) ).apply(null, argsOrOptions || []) : uniqueFactory( () => fnOrValue, Object.assign({}, argsOrOptions || (argsOrOptions = {}), { store: argsOrOptions.store || GLOBAL_STORE, maxRetries: 1 }) )(); } var UniqueError = class extends Error { constructor(code, size, duration, iterations) { super( `${code} - store size: ${size}, retried: ${iterations}, duration: ${duration}ms` ), this.name = "UniqueError"; } }; export { GLOBAL_STORE, unique, uniqueFactory };