hindent-0.0: src/HIndent.hs
-- | Haskell indenter.
module HIndent
(-- * Formatting functions.
reformat
,prettyPrint
,parseMode
-- * Style
,styles
,chrisDone
,michaelSnoyman
,johanTibell
,fundamental
-- * Testing
,test)
where
import HIndent.Styles.ChrisDone
import HIndent.Styles.MichaelSnoyman
import HIndent.Styles.JohanTibell
import HIndent.Styles.Fundamental
import HIndent.Instances ()
import HIndent.Types
import Control.Monad.State
import Data.Monoid
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as T
import Data.Text.Lazy.Builder (Builder)
import qualified Data.Text.Lazy.Builder as T
import Language.Haskell.Exts.Extension
import Language.Haskell.Exts.Parser
-- | Format the given source.
reformat :: Config -> Style -> Text -> Either String Builder
reformat config style x =
case parseDeclWithComments parseMode
(T.unpack x) of
ParseOk (v,_comments) ->
Right (prettyPrint config style v)
ParseFailed _ e -> Left e
-- | Pretty print the given printable thing.
prettyPrint :: Pretty a => Config -> Style -> a -> Builder
prettyPrint config style a =
psOutput (execState (runPrinter (pretty a))
(case style of
Style _name _author _desc st extenders _defconfig ->
PrintState 0 mempty False 0 1 st extenders config))
-- | Parse mode, includes all extensions, doesn't assume any fixities.
parseMode :: ParseMode
parseMode =
defaultParseMode {extensions = allExtensions
,fixities = Nothing}
where allExtensions =
filter isDisabledExtention knownExtensions
isDisabledExtention (DisableExtension _) = False
isDisabledExtention _ = True
-- | Test with the given style, prints to stdout.
test :: Config -> Style -> Text -> IO ()
test config style =
either error (T.putStrLn . T.toLazyText) .
reformat config style
-- | Styles list, useful for programmatically choosing.
styles :: [Style]
styles =
[fundamental,chrisDone,michaelSnoyman,johanTibell]