“use strict”; module.exports = function(NEXT_FILTER) { var util = require(“./util”); var getKeys = require(“./es5”).keys; var tryCatch = util.tryCatch; var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {

return function(e) {
    var boundTo = promise._boundValue();
    predicateLoop: for (var i = 0; i < instances.length; ++i) {
        var item = instances[i];

        if (item === Error ||
            (item != null && item.prototype instanceof Error)) {
            if (e instanceof item) {
                return tryCatch(cb).call(boundTo, e);
            }
        } else if (typeof item === "function") {
            var matchesPredicate = tryCatch(item).call(boundTo, e);
            if (matchesPredicate === errorObj) {
                return matchesPredicate;
            } else if (matchesPredicate) {
                return tryCatch(cb).call(boundTo, e);
            }
        } else if (util.isObject(e)) {
            var keys = getKeys(item);
            for (var j = 0; j < keys.length; ++j) {
                var key = keys[j];
                if (item[key] != e[key]) {
                    continue predicateLoop;
                }
            }
            return tryCatch(cb).call(boundTo, e);
        }
    }
    return NEXT_FILTER;
};

}

return catchFilter; };