equal-files-0.0.1: src/EqualFiles.hs
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