I've tried that, but once you pass in blocks as arguments, the whole thing becomes a lot harder to read. I have no clue how to indent
[[array filter:^BOOL (id obj) {
return [obj passesTest];
}]
map:^id (id obj) {
return [obj transformedObject]
}];
Edit: Also, it's good practice to prefix your categories methods so they don't clash with other category's, so you'd have something like us_map:, us_filter:, reducing readability even further.