2023-08-31 21:19:21 +00:00
|
|
|
const { ArrayWithKey } = require("./array-with-key");
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Limit Queue
|
|
|
|
* The first element will be removed when the length exceeds the limit
|
|
|
|
*/
|
|
|
|
class LimitQueue extends ArrayWithKey {
|
|
|
|
|
2023-09-07 07:42:44 +00:00
|
|
|
/**
|
|
|
|
* The limit of the queue after which the first element will be removed
|
|
|
|
* @private
|
|
|
|
* @type {number}
|
|
|
|
*/
|
2023-08-31 21:19:21 +00:00
|
|
|
__limit;
|
2023-09-07 07:42:44 +00:00
|
|
|
/**
|
|
|
|
* The callback function when the queue exceeds the limit
|
|
|
|
* @private
|
|
|
|
* @callback onExceedCallback
|
|
|
|
* @param {{key:K,value:V}|nul} item
|
|
|
|
*/
|
2023-08-31 21:19:21 +00:00
|
|
|
__onExceed = null;
|
|
|
|
|
|
|
|
/**
|
2023-09-07 07:42:44 +00:00
|
|
|
* @param {number} limit The limit of the queue after which the first element will be removed
|
2023-08-31 21:19:21 +00:00
|
|
|
*/
|
|
|
|
constructor(limit) {
|
|
|
|
super();
|
|
|
|
this.__limit = limit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
push(key, value) {
|
|
|
|
super.push(key, value);
|
|
|
|
if (this.length() > this.__limit) {
|
|
|
|
let item = this.shift();
|
|
|
|
if (this.__onExceed) {
|
|
|
|
this.__onExceed(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
LimitQueue
|
|
|
|
};
|