Sha256: 5c52eb40601e0716dafff9759cf28d8d4af3e2fc2e2c96384f43dbfd0f7370b5

Contents?: true

Size: 2 KB

Versions: 57

Compression:

Stored size: 2 KB

Contents

'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var toStr = Object.prototype.toString;
var max = Math.max;
var funcType = '[object Function]';

var concatty = function concatty(a, b) {
    var arr = [];

    for (var i = 0; i < a.length; i += 1) {
        arr[i] = a[i];
    }
    for (var j = 0; j < b.length; j += 1) {
        arr[j + a.length] = b[j];
    }

    return arr;
};

var slicy = function slicy(arrLike, offset) {
    var arr = [];
    for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
        arr[j] = arrLike[i];
    }
    return arr;
};

var joiny = function (arr, joiner) {
    var str = '';
    for (var i = 0; i < arr.length; i += 1) {
        str += arr[i];
        if (i + 1 < arr.length) {
            str += joiner;
        }
    }
    return str;
};

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slicy(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                concatty(args, arguments)
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        }
        return target.apply(
            that,
            concatty(args, arguments)
        );

    };

    var boundLength = max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs[i] = '$' + i;
    }

    bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

Version data entries

57 entries across 57 versions & 4 rubygems

Version Path
rapid_stack-0.1.1 templates/FrontEnd/node_modules/function-bind/implementation.js
rapid_stack-0.1.0 templates/FrontEnd/node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.62 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.61 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.60 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.59 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.58 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.57 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.56 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.55 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.54 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.53 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.52 node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.51 node_modules/function-bind/implementation.js
clapton-0.0.26 lib/clapton/javascripts/node_modules/function-bind/implementation.js
clapton-0.0.25 lib/clapton/javascripts/node_modules/function-bind/implementation.js
immosquare-cleaner-0.1.50 node_modules/function-bind/implementation.js
clapton-0.0.24 lib/clapton/javascripts/node_modules/function-bind/implementation.js
clapton-0.0.23 lib/clapton/javascripts/node_modules/function-bind/implementation.js
clapton-0.0.22 lib/clapton/javascripts/node_modules/function-bind/implementation.js