26 lines
701 B
Haskell
26 lines
701 B
Haskell
import Data.List (intersperse, intercalate)
|
|
import qualified Data.Set as S
|
|
|
|
consolidate
|
|
:: Ord a
|
|
=> [S.Set a] -> [S.Set a]
|
|
consolidate = foldr comb []
|
|
where
|
|
comb s_ [] = [s_]
|
|
comb s_ (s:ss)
|
|
| S.null (s `S.intersection` s_) = s : comb s_ ss
|
|
| otherwise = comb (s `S.union` s_) ss
|
|
|
|
-- TESTS -------------------------------------------------
|
|
main :: IO ()
|
|
main =
|
|
(putStrLn . unlines)
|
|
((intercalate ", and " . fmap showSet . consolidate) . fmap S.fromList <$>
|
|
[ ["ab", "cd"]
|
|
, ["ab", "bd"]
|
|
, ["ab", "cd", "db"]
|
|
, ["hik", "ab", "cd", "db", "fgh"]
|
|
])
|
|
|
|
showSet :: S.Set Char -> String
|
|
showSet = flip intercalate ["{", "}"] . intersperse ',' . S.elems
|