RosettaCodeData/Task/Permutations/JavaScript/permutations-4.js

36 lines
958 B
JavaScript
Raw Permalink Normal View History

2016-12-05 22:15:40 +01:00
(function () {
2017-09-23 10:01:46 +02:00
'use strict';
2016-12-05 22:15:40 +01:00
// permutations :: [a] -> [[a]]
2017-09-23 10:01:46 +02:00
var permutations = function (xs) {
return xs.length ? concatMap(function (x) {
return concatMap(function (ys) {
return [[x].concat(ys)];
}, permutations(delete_(x, xs)));
}, xs) : [[]];
};
2016-12-05 22:15:40 +01:00
2017-09-23 10:01:46 +02:00
// GENERIC FUNCTIONS
2016-12-05 22:15:40 +01:00
// concatMap :: (a -> [b]) -> [a] -> [b]
2017-09-23 10:01:46 +02:00
var concatMap = function (f, xs) {
2016-12-05 22:15:40 +01:00
return [].concat.apply([], xs.map(f));
2017-09-23 10:01:46 +02:00
};
2016-12-05 22:15:40 +01:00
2017-09-23 10:01:46 +02:00
// delete :: Eq a => a -> [a] -> [a]
var delete_ = function (x, xs) {
2016-12-05 22:15:40 +01:00
return deleteBy(function (a, b) {
return a === b;
}, x, xs);
2017-09-23 10:01:46 +02:00
};
2016-12-05 22:15:40 +01:00
// deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
2017-09-23 10:01:46 +02:00
var deleteBy = function (f, x, xs) {
return xs.length > 0 ? f(x, xs[0]) ? xs.slice(1) :
[xs[0]].concat(deleteBy(f, x, xs.slice(1))) : [];
};
2016-12-05 22:15:40 +01:00
2017-09-23 10:01:46 +02:00
// TEST
return permutations(['Aardvarks', 'eat', 'ants']);
2016-12-05 22:15:40 +01:00
})();