Add a cache module
This commit is contained in:
parent
cb1a20546f
commit
75417035f6
4 changed files with 67 additions and 2 deletions
|
@ -7,6 +7,7 @@
|
|||
<script src="js/session.js"></script>
|
||||
<script src="js/async.js"></script>
|
||||
<script src="js/dom.js"></script>
|
||||
<script src="js/cache.js"></script>
|
||||
<script src="js/screen.js"></script>
|
||||
<script src="js/buttons.js"></script>
|
||||
<script src="js/messaging.js"></script>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
function Automaton(async, dom, messaging, screen, session, ui) {
|
||||
function Automaton(async, cache, dom, messaging, screen, session, ui) {
|
||||
var menus = {
|
||||
start: {
|
||||
entries: [
|
||||
|
@ -56,6 +56,15 @@ function Automaton(async, dom, messaging, screen, session, ui) {
|
|||
name: 'textSpeed'
|
||||
}
|
||||
};
|
||||
var areas = new cache.make(function(key) {
|
||||
messaging.send({tag: 'Load', area: key});
|
||||
return async.bind(
|
||||
messaging.receive(function(message) {
|
||||
return message.tag == 'Area';
|
||||
}),
|
||||
function(message) { return async.wrap(message.contents); }
|
||||
);
|
||||
});
|
||||
var game = session.get('game');
|
||||
if(game != undefined) {
|
||||
menus.start.entries.unshift(
|
||||
|
|
54
src/js/cache.js
Normal file
54
src/js/cache.js
Normal file
|
@ -0,0 +1,54 @@
|
|||
function Cache(async) {
|
||||
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)
|
||||
};
|
||||
}
|
||||
}
|
|
@ -4,7 +4,8 @@ window.addEventListener('load', function() {
|
|||
dom = Dom();
|
||||
screen = Screen(dom);
|
||||
session = Session(async);
|
||||
cache = Cache(async);
|
||||
buttons = Buttons(session);
|
||||
ui = UI(async, buttons, dom, screen, session);
|
||||
automaton = Automaton(async, dom, messaging, screen, session, ui);
|
||||
automaton = Automaton(async, cache, dom, messaging, screen, session, ui);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue