#!/usr/bin/env runhaskell {-# LANGUAGE OverloadedStrings #-} import Control.Applicative import Data.Digest.Pure.SHA (sha1) import qualified Data.ByteString.Lazy.Char8 as L import Data.List import Data.Monoid import System.Path.Glob (glob) import System.FilePath ( () ) import System.Environment (<>) :: Monoid m => m -> m -> m (<>) = mappend nest :: Int -> L.ByteString -> L.ByteString nest n = L.unlines . map (L.replicate (fromIntegral n) ' ' <>) . L.lines onFiles :: [L.ByteString] -> L.ByteString onFiles [] = "Missing file!" onFiles [x] = x onFiles xs = "Too many files!\n\n" <> L.intercalate "\n---\n\n" (map (nest 2) xs) onDir :: FilePath -> IO () onDir dir = L.putStrLn . (("\n" <> L.pack dir <> ":\n") <>) . nest 2 <$> onFiles =<< mapM L.readFile =<< glob (dir "*") main :: IO () main = do [arg] <- getArgs dirs <- sort <$> glob (arg "*/") print . sha1 . L.pack . show $ dirs mapM_ onDir dirs