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