hmt-0.1: Music/Theory/Set.hs
module Music.Theory.Set where
import Control.Monad
import Data.List
-- | Remove duplicate elements and sort.
set :: (Ord a) => [a] -> [a]
set = sort . nub
-- | Powerset, ie. set of all all subsets.
powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])
-- | Two element subsets (cf [2] . powerset).
dyads :: [a] -> [(a,a)]
dyads [] = []
dyads (x:xs) = dyads xs ++ [ (x,y) | y <- xs ]
-- | Set expansion
se :: (Ord a) => Int -> [a] -> [[a]]
se n xs = if length xs == n
then [xs]
else nub (concatMap (se n) [sort (y : xs) | y <- xs])