open-consul/ui-v2/app/utils/get-object-pool.js

53 lines
1.4 KiB
JavaScript
Raw Normal View History

export default function(dispose = function() {}, max, objects = []) {
return {
acquire: function(obj, id) {
// TODO: what should happen if an ID already exists
// should we ignore and release both? Or prevent from acquiring? Or generate a unique ID?
// what happens if we can't get an id via getId or .id?
// could potentially use Set
objects.push(obj);
if (typeof max !== 'undefined') {
if (objects.length > max) {
return dispose(objects.shift());
}
}
return id;
},
// release releases the obj from the pool but **doesn't** dispose it
release: function(obj) {
let index = -1;
let id;
if (typeof obj === 'string') {
id = obj;
} else {
id = obj.id;
}
objects.forEach(function(item, i) {
let itemId;
if (typeof item.getId === 'function') {
itemId = item.getId();
} else {
itemId = item.id;
}
if (itemId === id) {
index = i;
}
});
if (index !== -1) {
return objects.splice(index, 1)[0];
}
},
purge: function() {
let obj;
const objs = [];
while ((obj = objects.shift())) {
objs.push(dispose(obj));
}
return objs;
},
dispose: function(id) {
return dispose(this.release(id));
},
};
}