class ModelCache {

	constructor(maxSize) {
		this.cache_ = [];
		this.maxSize_ = maxSize;
	}

	fromCache(ModelClass, id) {
		for (let i = 0; i < this.cache_.length; i++) {
			const c = this.cache_[i];
			if (c.id === id && c.modelType === ModelClass.modelType()) return c
		}
		return null;
	}

	cache(ModelClass, id, model) {
		if (this.fromCache(ModelClass, model.id)) return;
		this.cache_.push({
			id: id,
			model: model,
			modelType: ModelClass.modelType(),
		});

		if (this.cache_.length > this.maxSize_) {
			this.cache_.splice(0, 1);
		}
	}

	async load(ModelClass, id) {
		const cached = this.fromCache(ModelClass, id);
		if (cached) return cached.model;
		const output = await ModelClass.load(id);
		this.cache(ModelClass, id, output);
		return output;
	}

}

module.exports = ModelCache;