/
disorder.fragment.js
54 lines (48 loc) · 1.62 KB
/
disorder.fragment.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
disorder.fragment = (function (fragment) {
var definitions = {};
var fragments = {};
var define = function (definition, args, ondefine) {
var name = definition.name;
fragments[name] = definition.fn.apply(null, args);
ondefine && ondefine(fragments[name]);
};
var fragmenter = function (resolver, name, use, error) {
var definition = definitions[name];
var dependencies = definition.dependencies;
var args = [];
var loop = function () {
if (args.length == dependencies.length)
define(definition, args, use);
else
fragment.using(resolver, dependencies[args.length], function (d) {
args.push(d); loop();
}, error);
};
loop();
};
/** define a fragment */
fragment.wire = function (name, dependencies, definition) {
if (definitions[name])
throw "multiple declaration for module [" + name + "]";
definitions[name] = {
name: name,
dependencies: dependencies,
fn: definition
};
};
/** use a fragment */
fragment.using = function (resolver, name, use, error) {
if (!definitions[name])
resolver(name, function () {
if (definitions[name])
fragment.using(resolver, name, use, error);
else
error();
}, error);
else if (!fragments[name])
fragmenter(resolver, name, use, error);
else
use(fragments[name]);
};
return fragment;
}({}))