Add a Cache module compatible with the Async monad
This commit is contained in:
parent
adb5d145cb
commit
f05459ef80
1 changed files with 54 additions and 0 deletions
54
cache.js
Normal file
54
cache.js
Normal file
|
@ -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)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue