-- | List permutation functions. module Music.Theory.Permutations.List where import qualified Math.Combinatorics.Multiset as C import qualified Music.Theory.Permutations as P -- | Generate all permutations. -- -- > permutations [0,3] == [[0,3],[3,0]] -- > length (permutations [1..5]) == P.n_permutations 5 permutations :: (Eq a) => [a] -> [[a]] permutations i = let f p = P.apply_permutation p i in map f (P.permutations_n (length i)) -- | Generate all distinct permutations of a multi-set. -- -- > multiset_permutations [0,1,1] == [[0,1,1],[1,1,0],[1,0,1]] multiset_permutations :: (Ord a) => [a] -> [[a]] multiset_permutations = C.permutations . C.fromList