module Music.Theory.Permutations.List where
import Data.List
import qualified Math.Combinatorics.Multiset as C
import qualified Music.Theory.Permutations as P
permutations :: [a] -> [[a]]
permutations i =
let f p = P.apply_permutation p i
in map f (P.permutations_n (length i))
multiset_permutations :: (Ord a) => [a] -> [[a]]
multiset_permutations = C.permutations . C.fromList
factorial :: (Enum a, Num a) => a -> a
factorial n = product [1..n]
multiset_permutations_n :: Ord a => [a] -> Int
multiset_permutations_n x =
let occ = map length . group . sort
n = factorial (length x)
d = product $ map factorial $ occ x
in n `div` d