/ajax/libs/co/3.0.1/index.js
JavaScript | 313 lines | 166 code | 54 blank | 93 comment | 47 complexity | db1261f9e6c2a6d1286dd7ae2179468a MD5 | raw file
- !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.co=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
- /**
- * toString() reference.
- */
- var toString = Object.prototype.toString;
- /**
- * slice() reference.
- */
- var slice = Array.prototype.slice;
- /**
- * Expose `co`.
- */
- module.exports = co;
- /**
- * Wrap the given generator `fn` and
- * return a thunk.
- *
- * @param {Function} fn
- * @return {Function}
- * @api public
- */
- function co(fn) {
- var isGenFun = isGeneratorFunction(fn);
- return function (done) {
- var ctx = this;
- // in toThink() below we invoke co()
- // with a generator, so optimize for
- // this case
- var gen = fn;
- done = done || error;
- if (isGenFun) {
- // we only need to parse the arguments
- // if gen is a generator function.
- var args = slice.call(arguments);
- // no callback provided
- if (!args.length) done = error;
- // callback is the last argument
- else if ('function' == typeof args[args.length - 1]) done = args.pop();
- // arguments provided, but no callbacks
- else done = error;
- gen = fn.apply(this, args);
- }
- next();
- function next(err, res) {
- var ret;
- // multiple args
- if (arguments.length > 2) res = slice.call(arguments, 1);
- // error
- if (err) {
- try {
- ret = gen.throw(err);
- } catch (e) {
- return done(e);
- }
- }
- // ok
- if (!err) {
- try {
- ret = gen.next(res);
- } catch (e) {
- return done(e);
- }
- }
- // done
- if (ret.done) return done(null, ret.value);
- // normalize
- ret.value = toThunk(ret.value, ctx);
- // run
- if ('function' == typeof ret.value) {
- var called = false;
- try {
- ret.value.call(ctx, function(){
- if (called) return;
- called = true;
- next.apply(ctx, arguments);
- });
- } catch (e) {
- setImmediate(function(){
- if (called) return;
- called = true;
- next(e);
- });
- }
- return;
- }
- // invalid
- next(new Error('yield a function, promise, generator, array, or object'));
- }
- }
- }
- /**
- * Convert `obj` into a normalized thunk.
- *
- * @param {Mixed} obj
- * @param {Mixed} ctx
- * @return {Function}
- * @api private
- */
- function toThunk(obj, ctx) {
- var fn = obj;
- if (Array.isArray(obj)) fn = arrayToThunk.call(ctx, obj);
- if ('[object Object]' == toString.call(obj)) fn = objectToThunk.call(ctx, obj);
- if (isGeneratorFunction(obj)) obj = obj.call(ctx);
- if (isGenerator(obj)) fn = co(obj);
- if (isPromise(obj)) fn = promiseToThunk(obj);
- return fn;
- }
- /**
- * Convert an array of yieldables to a thunk.
- *
- * @param {Array}
- * @return {Function}
- * @api private
- */
- function arrayToThunk(fns) {
- var ctx = this;
- return function(done){
- var pending = fns.length;
- var results = new Array(pending);
- var finished;
- if (!pending) {
- setImmediate(function(){
- done(null, results);
- });
- return;
- }
- for (var i = 0; i < fns.length; i++) {
- run(fns[i], i);
- }
- function run(fn, i) {
- if (finished) return;
- try {
- fn = toThunk(fn, ctx);
- fn.call(ctx, function(err, res){
- if (finished) return;
- if (err) {
- finished = true;
- return done(err);
- }
- results[i] = res;
- --pending || done(null, results);
- });
- } catch (err) {
- finished = true;
- done(err);
- }
- }
- }
- }
- /**
- * Convert an object of yieldables to a thunk.
- *
- * @param {Object} obj
- * @return {Function}
- * @api private
- */
- function objectToThunk(obj){
- var ctx = this;
- return function(done){
- var keys = Object.keys(obj);
- var pending = keys.length;
- var results = {};
- var finished;
- if (!pending) {
- setImmediate(function(){
- done(null, results)
- });
- return;
- }
- for (var i = 0; i < keys.length; i++) {
- run(obj[keys[i]], keys[i]);
- }
- function run(fn, key) {
- if (finished) return;
- try {
- fn = toThunk(fn, ctx);
- if ('function' != typeof fn) {
- results[key] = fn;
- return --pending || done(null, results);
- }
- fn.call(ctx, function(err, res){
- if (finished) return;
- if (err) {
- finished = true;
- return done(err);
- }
- results[key] = res;
- --pending || done(null, results);
- });
- } catch (err) {
- finished = true;
- done(err);
- }
- }
- }
- }
- /**
- * Convert `promise` to a thunk.
- *
- * @param {Object} promise
- * @return {Function}
- * @api private
- */
- function promiseToThunk(promise) {
- return function(fn){
- promise.then(function(res) {
- fn(null, res);
- }, fn);
- }
- }
- /**
- * Check if `obj` is a promise.
- *
- * @param {Object} obj
- * @return {Boolean}
- * @api private
- */
- function isPromise(obj) {
- return obj && 'function' == typeof obj.then;
- }
- /**
- * Check if `obj` is a generator.
- *
- * @param {Mixed} obj
- * @return {Boolean}
- * @api private
- */
- function isGenerator(obj) {
- return obj && 'function' == typeof obj.next && 'function' == typeof obj.throw;
- }
- /**
- * Check if `obj` is a generator function.
- *
- * @param {Mixed} obj
- * @return {Boolean}
- * @api private
- */
- function isGeneratorFunction(obj) {
- return obj && obj.constructor && 'GeneratorFunction' == obj.constructor.name;
- }
- /**
- * Throw `err` in a new stack.
- *
- * This is used when co() is invoked
- * without supplying a callback, which
- * should only be for demonstrational
- * purposes.
- *
- * @param {Error} err
- * @api private
- */
- function error(err) {
- if (!err) return;
- setImmediate(function(){
- throw err;
- });
- }
- },{}]},{},[1])(1)
- });