UNPKG

@silverwind/ioredis-mock

Version:

This library emulates ioredis by performing all operations in-memory.

52 lines (39 loc) 1.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.spop = spop; var _lodash = _interopRequireDefault(require("lodash")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const safeCount = count => { const result = count !== undefined ? parseInt(count, 10) : 1; if (Number.isNaN(result) || result < 0) { throw new Error('ERR value is not an integer or out of range'); } return result; }; function spop(key, count) { if (this.data.has(key) && !(this.data.get(key) instanceof Set)) { throw new Error(`Key ${key} does not contain a set`); } const want = safeCount(count); const set = this.data.get(key) || new Set(); const total = set.size; if (want === 0) return undefined; if (total === 0) return null; const values = _lodash.default.chain(set).toArray(); let result; if (want === 1) { result = values.sample().value(); set.delete(result); } else if (total <= want) { result = values.value(); set.clear(); } else { values.shuffle(); // Randomize take result = values.take(want).value(); result.map(item => set.delete(item)); } this.data.set(key, set); return result; }