• limit-queue.js
  • const { ArrayWithKey } = require("./array-with-key");
    
    /**
     * Limit Queue
     * The first element will be removed when the length exceeds the limit
     */
    class LimitQueue extends ArrayWithKey {
    
        /**
         * The limit of the queue after which the first element will be removed
         * @private
         * @type {number}
         */
        __limit;
        /**
         * The callback function when the queue exceeds the limit
         * @private
         * @callback onExceedCallback
         * @param {{key:K,value:V}|nul} item
         */
        __onExceed = null;
    
        /**
         * @param {number} limit The limit of the queue after which the first element will be removed
         */
        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
    };