UNPKG

jsee

Version:

A simple control flow solution, easily create chainable functions

137 lines (112 loc) 2.94 kB
/*! * 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;