From f05459ef800205e8b5a45861ee6a8b5c92774730 Mon Sep 17 00:00:00 2001 From: Tissevert Date: Thu, 14 Feb 2019 21:59:19 +0100 Subject: [PATCH] Add a Cache module compatible with the Async monad --- cache.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 cache.js diff --git a/cache.js b/cache.js new file mode 100644 index 0000000..ec53101 --- /dev/null +++ b/cache.js @@ -0,0 +1,54 @@ +function Cache() { + function Cache(loader) { + this.loader = loader; + this.loaded = {}; + this.loading = {}; + } + + Cache.prototype.get = function(key) { + return function(f) { + if(this.loaded[key] != undefined) { + f(this.loaded[key]); + } else { + this.startLoading(key); + this.loading[key].push(f); + this.loader(key)(this.store(key)); + } + }.bind(this); + }; + + Cache.prototype.warmUp = function(key) { + if(this.loaded[key] == undefined) { + this.startLoading(key); + this.loader(key)(this.store(key)); + } + }; + + Cache.prototype.startLoading = function(key) { + if(this.loading[key] == undefined) { + this.loading[key] = []; + } + }; + + Cache.prototype.store = function(key) { + return function(value) { + this.loaded[key] = value; + for(var i = 0; i < this.loading[key].length; i++) { + this.loading[key][i](value); + } + this.loading[key] = null; + }.bind(this); + }; + + return { + make: make + }; + + function make(loader) { + var cache = new Cache(loader); + return { + get: cache.get.bind(cache), + warmUp: cache.warmUp.bind(cache) + }; + } +}