"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;
|
};
|