packages feed

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