@@ -1,9 +1,5 @@
1−{-# LANGUAGE OverloadedStrings #-}
1+{-# LANGUAGE OverloadedStrings, DeriveGeneric, TypeApplications, NoImplicitPrelude #-}
2−{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE DeriveAnyClass, LambdaCase, ScopedTypeVariables, RecordWildCards #-}
3−{-# LANGUAGE TypeApplications #-}
4−{-# LANGUAGE DeriveGeneric #-}
5−{-# LANGUAGE DeriveAnyClass #-}
6−{-# LANGUAGE RecordWildCards #-}
8module Control.Hext.Processor
4module Control.Hext.Processor
9 ( processFiles
5 ( processFiles
@@ -11,9 +7,11 @@ module Control.Hext.Processor
12import Relude
8import Relude
14−import Data.List hiding (unlines)
10+import Control.Hext.Config
15−import System.Directory.Tree
16import Data.Haskell.Parser
11import Data.Haskell.Parser
12+import Data.List hiding (head, unlines)
13+import qualified Data.Text as T
14+import System.Directory.Tree
18getFiles :: FilePath -> IO [FilePath]
16getFiles :: FilePath -> IO [FilePath]
19getFiles dir = do
17getFiles dir = do
@@ -29,18 +27,40 @@ getFiles dir = do
29 getHs (Dir name paths) | not $ "." `isPrefixOf` name = paths >>= getHs
27 getHs (Dir name paths) | not $ "." `isPrefixOf` name = paths >>= getHs
30 getHs _ = []
28 getHs _ = []
32−processFile :: [Text] -> Text -> Text
30+processFile :: Maybe LineLimit -> Text -> Text -> Text
33−processFile extensions file =
31+processFile limit extensions file =
34− (unlines . fmap wrapExtension) extensions
32+ extensions
36 <> withoutExtensions file
34 <> withoutExtensions file
38− wrapExtension :: Text -> Text
39− wrapExtension e = "{-# LANGUAGE " <> e <> " #-}"
36+wrapExtension :: Text -> Text
37+wrapExtension ee = "{-# LANGUAGE " <> ee <> " #-}"
40+baseLength = T.length $ wrapExtension ""
41−processFiles :: [Text] -> FilePath -> IO ()
42+processFiles :: Maybe LineLimit -> [Text] -> FilePath -> IO ()
42−processFiles extensions 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 extensions $ contents
47+ writeFileText file . processFile limit (wrapExtensions extensions) $ contents
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
55+ let emptyExtra = ([], ee, baseLength + T.length e)
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))
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