@dpaskhin/unique
Version:
Ensures unique values by rejecting duplicates.
63 lines (62 loc) • 1.82 kB
JavaScript
// 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
};