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

function CatchFilter(instances, callback, promise) {

this._instances = instances;
this._callback = callback;
this._promise = promise;

}

function safePredicate(predicate, e) {

var safeObject = {};
var retfilter = tryCatch(predicate).call(safeObject, e);

if (retfilter === errorObj) return retfilter;

var safeKeys = keys(safeObject);
if (safeKeys.length) {
    errorObj.e = new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a    See http://goo.gl/o84o68\u000a");
    return errorObj;
}
return retfilter;

}

CatchFilter.prototype.doFilter = function (e) {

var cb = this._callback;
var promise = this._promise;
var boundTo = promise._boundValue();
for (var i = 0, len = this._instances.length; i < len; ++i) {
    var item = this._instances[i];
    var itemIsErrorType = item === Error ||
        (item != null && item.prototype instanceof Error);

    if (itemIsErrorType && e instanceof item) {
        var ret = tryCatch(cb).call(boundTo, e);
        if (ret === errorObj) {
            NEXT_FILTER.e = ret.e;
            return NEXT_FILTER;
        }
        return ret;
    } else if (typeof item === "function" && !itemIsErrorType) {
        var shouldHandle = safePredicate(item, e);
        if (shouldHandle === errorObj) {
            e = errorObj.e;
            break;
        } else if (shouldHandle) {
            var ret = tryCatch(cb).call(boundTo, e);
            if (ret === errorObj) {
                NEXT_FILTER.e = ret.e;
                return NEXT_FILTER;
            }
            return ret;
        }
    }
}
NEXT_FILTER.e = e;
return NEXT_FILTER;

};

return CatchFilter; };