Last active
October 9, 2018 21:38
-
-
Save Heimdell/13e31e896e6577cb50f3d9548ca862bf to your computer and use it in GitHub Desktop.
Whitespace / end line cleaner. Run `Nowsp path/to/project .hs .yml`. No warranty.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Control.Monad (when) | |
import Data.Foldable (for_) | |
import System.Directory (doesDirectoryExist, doesFileExist, listDirectory) | |
import System.FilePath ((</>), takeExtension) | |
import System.Environment (getArgs) | |
inode dirAction fileAction = go | |
where | |
go name = do | |
dirAction go name | |
fileAction name | |
directory action dirname = do | |
yes <- doesDirectoryExist dirname | |
when yes $ do | |
entries <- listDirectory dirname | |
for_ entries (action . (dirname </>)) | |
return yes | |
only pred action filename = do | |
if pred filename | |
then do | |
action filename | |
else do | |
return False | |
extIsOneOf exts filename = takeExtension filename `elem` exts | |
file filename = do | |
yes <- doesFileExist filename | |
when yes $ do | |
text <- readFile filename | |
putStr $ "Cleaning " ++ filename ++ "... " | |
length text `seq` return () | |
let ls = lines text | |
let cleaned = map noWsp ls | |
let lnTrimmed = trimLn cleaned | |
let finished = unlines lnTrimmed | |
if finished == text | |
then do | |
putStrLn "was clean" | |
else do | |
writeFile filename finished | |
putStrLn "cleaned!" | |
return yes | |
noWsp = reverse . dropWhile (' ' ==) . reverse | |
trimLn = reverse . dropWhile ("" ==) . reverse | |
main = do | |
start : exts <- getArgs | |
inode directory (only (extIsOneOf exts) file) start |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment