simple visitor API and code to figure out scope and references
This commit is contained in:
35
lib/utils.js
35
lib/utils.js
@@ -62,3 +62,38 @@ function defaults(args, defs) {
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
function noop() {};
|
||||
|
||||
var MAP = (function(){
|
||||
function MAP(a, f, o) {
|
||||
var ret = [], top = [], i;
|
||||
function doit() {
|
||||
var val = f.call(o, a[i], i);
|
||||
if (val instanceof AtTop) {
|
||||
val = val.v;
|
||||
if (val instanceof Splice) {
|
||||
top.push.apply(top, val.v);
|
||||
} else {
|
||||
top.push(val);
|
||||
}
|
||||
}
|
||||
else if (val !== skip) {
|
||||
if (val instanceof Splice) {
|
||||
ret.push.apply(ret, val.v);
|
||||
} else {
|
||||
ret.push(val);
|
||||
}
|
||||
}
|
||||
};
|
||||
if (a instanceof Array) for (i = 0; i < a.length; ++i) doit();
|
||||
else for (i in a) if (HOP(a, i)) doit();
|
||||
return top.concat(ret);
|
||||
};
|
||||
MAP.at_top = function(val) { return new AtTop(val) };
|
||||
MAP.splice = function(val) { return new Splice(val) };
|
||||
var skip = MAP.skip = {};
|
||||
function AtTop(val) { this.v = val };
|
||||
function Splice(val) { this.v = val };
|
||||
return MAP;
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user