function MemoryCache() {
    this.cache = {};
    this.size = 0;
}

MemoryCache.prototype.add = function (key, value, time, timeoutCallback) {
    let old = this.cache[key];
    let instance = this;

    let entry = {
        value: value,
        expire: time + Date.now(),
        timeout: setTimeout(function () {
            instance.delete(key);
            return timeoutCallback && typeof timeoutCallback === "function" && timeoutCallback(value, key);
        }, time)
    };

    this.cache[key] = entry;
    this.size = Object.keys(this.cache).length;

    return entry;
};

MemoryCache.prototype.delete = function (key) {
    let entry = this.cache[key];

    if (entry) {
        clearTimeout(entry.timeout);
    }

    delete this.cache[key];

    this.size = Object.keys(this.cache).length;

    return null;
};

MemoryCache.prototype.get = function (key) {
    let entry = this.cache[key];

    return entry;
};

MemoryCache.prototype.getValue = function (key) {
    let entry = this.get(key);

    return entry && entry.value;
};

MemoryCache.prototype.clear = function () {
    Object.keys(this.cache).forEach(function (key) {
        this.delete(key);
    }, this);

    return true;
};

module.exports = MemoryCache;