function sortWithFilter (pred, list) {
if (!list.length) return [];
var head = list.shift(), tail = list;
var lesser = tail.filter(function (e) { return e <= head; });
var greeter = tail.filter(function (e) { return e > head; });
return sortWithFilter(pred, lesser).concat(pred(head) ? [head] : []).concat(sortWithFilter(pred, greeter));
}
var a = [1,2,3,7,4,1,6,7,4,3,2,-3,-7,123];
var f = function (e) { return e > 0; };
console.log(sortWithFilter(f, a));
ZnVuY3Rpb24gc29ydFdpdGhGaWx0ZXIgKHByZWQsIGxpc3QpIHsKICAgIGlmICghbGlzdC5sZW5ndGgpIHJldHVybiBbXTsKICAgIHZhciBoZWFkID0gbGlzdC5zaGlmdCgpLCB0YWlsID0gbGlzdDsKICAgIHZhciBsZXNzZXIgPSB0YWlsLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSA8PSBoZWFkOyB9KTsKICAgIHZhciBncmVldGVyID0gdGFpbC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgPiBoZWFkOyB9KTsKICAgIHJldHVybiBzb3J0V2l0aEZpbHRlcihwcmVkLCBsZXNzZXIpLmNvbmNhdChwcmVkKGhlYWQpID8gW2hlYWRdIDogW10pLmNvbmNhdChzb3J0V2l0aEZpbHRlcihwcmVkLCBncmVldGVyKSk7Cn0KCnZhciBhID0gWzEsMiwzLDcsNCwxLDYsNyw0LDMsMiwtMywtNywxMjNdOwp2YXIgZiA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlID4gMDsgfTsKCmNvbnNvbGUubG9nKHNvcnRXaXRoRmlsdGVyKGYsIGEpKTs=