jsee
Version:
A simple control flow solution, easily create chainable functions
137 lines (112 loc) • 2.94 kB
JavaScript
/*!
* jsee
*
* A simple control flow solution, easily create chainable functions
* enjoy your javascript development simple, easy and effective
*
* Copyright (c) 2013 Cloudsoar Loong <i@beShy.net>
*
*/
var jsee=(function(){
var class2type = (function () {
var arr = "Boolean Number String Function Array Date RegExp Object".split(" "),
re = {};
for (var i = arr.length - 1; i >= 0; i--)
re["[object " + arr[i] + "]"] = arr[i].toLowerCase();
return re;
})(),
type = function (obj) {
return obj == null ? String(obj) : class2type[Object.prototype.toString.call(obj)] || "object";
},
slice = Array.prototype.slice,
undefined;
return function(){
var fns = slice.call(arguments);
var f=function () {
var parent = this;
var p=function(){
if (arguments.length)
p.nodes.push(slice.call(arguments));
p.run();
return p;
};
p.offset=0;
p.running=false;
// set arguments
p.args=[slice.call(arguments)];
// set nodes
p.nodes=f.nodes.slice();
p.rawLength = p.nodes.length;
p.run=function(){
var idx=p.offset;
if (idx>=p.nodes.length) {
p.offset=p.nodes.length;
if (parent && 'object' == type(parent) && 'function' == type(parent.next)) {
parent.next(p.args[p.offset]);
}
return false;
}
if (p.running)
return false;
p.running=true;
var fns=p.nodes[idx];
p.args[idx+1]=[];
if (type(fns)!='array')
fns=[fns];
var fns_complete={};
var fns_complete_count=0;
for (var i = 0, l = fns.length; i < l; i++) {
(function(i, fns){
var fn=fns[i];
if (type(fn)!='function') {
p.args[idx+1][i]=fn;
fns_complete[i]=1;
fns_complete_count++;
if (p.offset==idx && fns_complete_count==fns.length) {
p.offset++;
p.running=false;
p.run();
}
} else {
var t={
thread: p
, process: p
, completed: false
, next: function(r){
p.args[idx+1][i]=r;
if (fns_complete[i]!==1) {
fns_complete_count++;
fns_complete[i]=1;
}
if (p.offset==idx && fns_complete_count==fns.length) {
p.offset++;
p.running=false;
p.run();
}
}
, end: function () {
p.args[p.rawLength]=arguments;
fns_complete_count = fns.length;
p.offset = p.rawLength;
p.running=false;
p.run();
}
}
// exec function
fn.apply(t, p.args[idx]);
}
})(i, fns);
};
};
p.run();
return p;
};
f.nodes = slice.call(arguments);
// extends nodes
f.jsee=function(){
f.nodes.concat(slice.call(arguments));
};
return f;
};
})();
module.exports = jsee;