module Main (main) where
import Data.Foldable (toList)
import Data.List (intercalate)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.Map as M
import Data.Word (Word64)
import Options.Applicative (execParser)
import Parallel
import Parser
displayPaths :: NonEmpty FilePath -> String
displayPaths = intercalate ", " . toList
displayHash :: NonEmpty FilePath -> Word64 -> String
displayHash fps h = show h ++ " " ++ displayPaths fps
filterDup :: M.Map Word64 (NonEmpty FilePath) -> M.Map Word64 (NonEmpty FilePath)
filterDup = M.filter p
where p :: NonEmpty FilePath -> Bool
p (_ :| (_:_)) = True
p _ = False
displayDebug :: M.Map Word64 (NonEmpty FilePath) -> String
displayDebug hashes = intercalate "\n" (mkLine <$> M.toList hashes)
where mkLine (h, fps) = displayHash fps h
displayAll :: M.Map a (NonEmpty FilePath) -> String
displayAll fps = intercalate "\n" (displayPaths <$> toList fps)
main :: IO ()
main = run =<< execParser wrapper
run :: ([FilePath], Bool) -> IO ()
run (fps, debug) = do
let displayF = if debug
then displayDebug
else displayAll . filterDup
putStrLn . displayF =<< pathMaps fps