-- | 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