Skip to content

Instantly share code, notes, and snippets.

@Heimdell
Last active October 9, 2018 21:38
Show Gist options
  • Save Heimdell/13e31e896e6577cb50f3d9548ca862bf to your computer and use it in GitHub Desktop.
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.
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