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