54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
// Lightweight linking of the modules.
|
|
// There are circular dependencies across the modules unfortunately, so we
|
|
// need a mechanism for letting them link to each other.
|
|
if (! this['plt']) { this['plt'] = {}; }
|
|
(function(scope) {
|
|
var link = {};
|
|
scope['link'] = link;
|
|
|
|
// link.ready: (string (string -> void)) -> void
|
|
// When the name announces that it's ready, calls the function f.
|
|
link.ready = function(name, f) {
|
|
readyWaiters[name] = readyWaiters[name] || [];
|
|
readyWaiters[name].push(f);
|
|
|
|
if (linkIsReady[name]) {
|
|
notifySingle(f, name);
|
|
}
|
|
};
|
|
|
|
// link.announceReady: string -> void
|
|
// Lets the world know that the name is ready.
|
|
link.announceReady = function(name) {
|
|
var i;
|
|
linkIsReady[name] = true;
|
|
notifyAll(name);
|
|
};
|
|
|
|
|
|
// notifyAll: string -> void
|
|
// Tell all listeners that the name is ready.
|
|
var notifyAll = function(name) {
|
|
var waiters = readyWaiters[name] || [], i;
|
|
for (i = 0 ; i < waiters.length; i++) {
|
|
notifySingle(waiters[i], name);
|
|
}
|
|
readyWaiters[name] = [];
|
|
};
|
|
|
|
|
|
// Tell a single listener that the name is ready.
|
|
var notifySingle = function(f, name) {
|
|
setTimeout(function() { f(name); },
|
|
0);
|
|
};
|
|
|
|
|
|
// linkIsReady: (Hashtable String Boolean)
|
|
var linkIsReady = {};
|
|
|
|
// readyWaiters: (Hashtable String (Arrayof (String -> Void)))
|
|
var readyWaiters = {};
|
|
|
|
|
|
})(this['plt']); |