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