Source: check.js

var defineProperties = require('./defineProperties');
var deprecate = require('./deprecate');

/**
 * Checks if <var>value</var> looks like the other values.
 *
 * @namespace
 * @memberof just
 * @param {*} value - Comparison value.
 * @param {...*} [otherValues] - Values to check against.
 *
 * @example
 * just.check(null, {}, "null", []); // false. Neither is `null`.
 * just.check({}, [], {}); // true. {} is {}.
 *
 * @return {boolean} `true` if some other value looks like <var>value</var>.
 */
function check (value, otherValues) {

    var exceptFirstArg = [].slice.call(arguments, 1);

    return exceptFirstArg.some(function checkAgainst (arg) {

        return ([arg, value].some(function hasNoProps (v) { return v === null || v === void 0; })
            ? arg === value
            : arg.constructor === value.constructor
        );

    });

}

defineProperties(check, /** @lends just.check */{

    /**
     * A custom message to throw.
     *
     * @typedef {string} just.check~throwable_message
     */

    /**
     * A function that {@link just.check|checks} a value against others and
     * throws if the result is `false`.
     *
     * @function
     * @deprecated Since 1.0.0-rc.24
     * @this just.check~throwable_message
     * @param {*} value - Comparison value.
     * @param {...*} [otherValues] - Values to check against.
     *
     * @throws {TypeError} If <var>check</var> returns `false`.
     * @returns {value} <var>value</var> if <var>check</var> returns `true`.
     */
    'throwable': function (value, otherValues) {

        var args = [].slice.call(arguments);
        var throwableMessage = this;

        deprecate('.check.throwable()', 'warning', {
            'since': '1.0.0-rc.24'
        });

        if (!check.apply(this, args)) {

            if (!(throwableMessage instanceof String)) {

                throwableMessage = (value
                    + ' must be like one of the following values: '
                    + args.slice(1).map(function (v) { return v + ''; }).join(', ')
                );

            }

            throw new TypeError(throwableMessage);

        }

        return value;

    }

});

module.exports = check;