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 subsets.
powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])

-- | Two element subsets (cf [2] . powerset).
dyads :: [a] -> [(a,a)]
dyads [] = []
dyads (x:xs) = [(x,y) | y <- xs] ++ dyads 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])