export default class IrregularStack { constructor (config) { this._stack = []; const _config = config || {}; this._strongCompare = _config.strongCompare || this._compare; this._weakCompare = _config.weakCompare || this._compare; } _compare (obj1, obj2) { if (typeof obj1 === 'object' && typeof obj2 === 'object' && window.JSON) return window.JSON.stringify(obj1) === window.JSON.stringify(obj2); return obj1 === obj2; }; _indexOf (obj, compare) { for (let i = this._stack.length - 1; i >= 0; i--) { if (compare(this._stack[i], obj)) return i; } return -1; } push (obj) { this._stack.push(obj); } pop (obj) { const index = this._indexOf(obj, this._strongCompare); if (index !== -1) { const removed = this._stack.splice(index, 1); return removed[0]; } return undefined; } get (obj) { const index = this._indexOf(obj, this._weakCompare); if (index !== -1) { return this._stack[index]; } return undefined; } exist (obj) { return !(this._indexOf(obj, this._strongCompare) < 0); } }