@@ -1,35 +1,34 @@
1−{-# LANGUAGE OverloadedStrings, DeriveGeneric, TypeApplications, NoImplicitPrelude #-}
1+{-# LANGUAGE DeriveAnyClass, DeriveGeneric, LambdaCase, NoImplicitPrelude, OverloadedStrings #-}
2−{-# LANGUAGE DeriveAnyClass, LambdaCase, ScopedTypeVariables, RecordWildCards #-}
2+{-# LANGUAGE RecordWildCards, ScopedTypeVariables, TypeApplications #-}
4module Control.Hext.Processor
4module Control.Hext.Processor
5− ( processFiles
5+ ( processFiles,
10import Control.Hext.Config
9import Control.Hext.Config
11import Data.Haskell.Parser
10import Data.Haskell.Parser
12import Data.List hiding (head, unlines)
11import Data.List hiding (head, unlines)
13import qualified Data.Text as T
12import qualified Data.Text as T
14import System.Directory.Tree
14import System.Directory.Tree
16getFiles :: FilePath -> IO [FilePath]
16getFiles :: FilePath -> IO [FilePath]
17getFiles dir = do
17getFiles dir = do
18− (_ :/ tree) <- readDirectoryWith return dir
18+ (_ :/ tree) <- readDirectoryWith return dir
19− return . (>>= getHs) . unwrapDir $ tree
19+ return . (>>= getHs) . unwrapDir $ tree
21− unwrapDir :: DirTree a -> [DirTree a]
21+ unwrapDir :: DirTree a -> [DirTree a]
22− unwrapDir (Dir _ paths) = paths
22+ unwrapDir (Dir _ paths) = paths
23− unwrapDir _ = []
23+ unwrapDir _ = []
25− getHs :: DirTree FilePath -> [FilePath]
24+ getHs :: DirTree FilePath -> [FilePath]
26− getHs (File _ path) | ".hs" `isSuffixOf` path = pure path
25+ getHs (File _ path) | ".hs" `isSuffixOf` path = pure path
27− getHs (Dir name paths) | not $ "." `isPrefixOf` name = paths >>= getHs
26+ getHs (Dir name paths) | not $ "." `isPrefixOf` name = paths >>= getHs
28− getHs _ = []
27+ getHs _ = []
30−processFile :: Maybe LineLimit -> Text -> Text -> Text
29+processFile :: Text -> Text -> Text
31−processFile limit extensions file =
30+processFile extensions file =
32− extensions
31+ extensions
34 <> withoutExtensions file
33 <> withoutExtensions file
@@ -40,27 +39,31 @@ baseLength :: Int
40baseLength = T.length $ wrapExtension ""
39baseLength = T.length $ wrapExtension ""
42processFiles :: Maybe LineLimit -> [Text] -> FilePath -> IO ()
41processFiles :: Maybe LineLimit -> [Text] -> FilePath -> IO ()
43−processFiles limit extensions dir = do
42+processFiles limit allExtensions dir = do
44− files <- getFiles dir
43+ files <- getFiles dir
45− forM_ files $ \file -> do
44+ forM_ files $ \file -> do
46− contents <- readFileText file
45+ contents <- readFileText file
47− writeFileText file . processFile limit (wrapExtensions extensions) $ contents
46+ writeFileText file . processFile (wrapExtensions allExtensions) $ contents
49− wrapExtensions :: [Text] -> Text
48+ wrapExtensions :: [Text] -> Text
50− wrapExtensions [] = ""
49+ wrapExtensions [] = ""
51− wrapExtensions extensions@(e:ee) = case limit of
50+ wrapExtensions extensions@(e : ee) = case limit of
52− Nothing -> unlines . fmap wrapExtension $ extensions
51+ Nothing -> unlines . fmap wrapExtension $ extensions
53− Just Unlimited -> unlines . pure . wrapExtension . mconcat . intersperse ", " $ extensions
52+ Just Unlimited -> unlines . pure . wrapExtension . mconcat . intersperse ", " $ extensions
54− Just (Limited n) ->
53+ Just (Limited n) ->
55− let emptyExtra = ([], ee, baseLength + T.length e)
54+ let emptyExtra = ([], ee, baseLength + T.length e)
56− ee' = unfoldr (\case
56+ unfoldr
57− Nothing -> Nothing
58+ Nothing -> Nothing
58− (Just current@(_, [], _)) -> Just (current, Nothing)
59+ (Just current@(_, [], _)) -> Just (current, Nothing)
59− (Just current@(soFar, ne:next, l)) ->
60+ (Just current@(soFar, ne : next, l)) ->
60− let thing = (ne:soFar, next, l + T.length ne + 2)
61+ let thing = (ne : soFar, next, l + T.length ne + 2)
61− in Just (current, Just thing))
62+ in Just (current, Just thing)
62− (Just emptyExtra)
64+ (Just emptyExtra)
63− (extraExtensions, eLeft, _) =
65+ (extraExtensions, eLeft, _) =
64− fromMaybe emptyExtra . viaNonEmpty head . reverse . filter (\(_, _, n') -> n' <= n) $ ee'
66+ fromMaybe emptyExtra . viaNonEmpty head . reverse . filter (\(_, _, n') -> n' <= n) $ ee'
65− in (wrapExtension . mconcat . intersperse ", " $ e:extraExtensions)
67+ in (wrapExtension . mconcat . intersperse ", " $ e : reverse extraExtensions)
66− <> "\n" <> wrapExtensions eLeft
69+ <> wrapExtensions eLeft