module Main where import System.Environment (getArgs, ) import Data.List (groupBy, sort, intersperse, ) groupEqualElems :: (Ord key, Ord elem) => [(elem, key)] -> [[key]] groupEqualElems xs = map (map snd) (groupBy (\x y -> fst x == fst y) (sort xs)) {- | Only return sub-lists with more than one element. -} clusterEqualElems :: (Ord key, Ord elem) => [(elem, key)] -> [[key]] clusterEqualElems xs = filter (not . null . tail) (groupEqualElems xs) clusterEqualFiles :: [FilePath] -> IO [[FilePath]] clusterEqualFiles fileNames = do files <- mapM readFile fileNames return (clusterEqualElems (zip files fileNames)) -- output results in a quoted way that might be accessible to further shell scripts main :: IO () main = mapM_ (putStrLn . concat . intersperse " " . map show) =<< clusterEqualFiles =<< getArgs