{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Ormolu.Config
( Config (..),
ColorMode (..),
RegionIndices (..),
RegionDeltas (..),
SourceType (..),
defaultConfig,
overapproximatedDependencies,
regionIndicesToDeltas,
DynOption (..),
dynOptionToLocatedStr,
PrinterOpts (..),
PrinterOptsPartial,
PrinterOptsTotal,
defaultPrinterOpts,
defaultPrinterOptsYaml,
fillMissingPrinterOpts,
CommaStyle (..),
FunctionArrowsStyle (..),
HaddockPrintStyle (..),
HaddockPrintStyleModule (..),
ImportExportStyle (..),
LetStyle (..),
InStyle (..),
Unicode (..),
ColumnLimit (..),
parsePrinterOptsCLI,
parsePrinterOptType,
loadConfigFile,
configFileName,
FourmoluConfig (..),
emptyConfig,
ConfigFileLoadResult (..),
)
where
import Control.Monad (forM)
import Data.Aeson ((.!=), (.:?))
import Data.Aeson qualified as Aeson
import Data.Aeson.Types qualified as Aeson
import Data.Functor.Identity (Identity (..))
import Data.Map.Strict qualified as Map
import Data.Set (Set)
import Data.Set qualified as Set
import Data.String (fromString)
import Data.Yaml qualified as Yaml
import Distribution.Types.PackageName (PackageName)
import GHC.Generics (Generic)
import GHC.Types.SrcLoc qualified as GHC
import Ormolu.Config.Gen
import Ormolu.Fixity
import Ormolu.Terminal (ColorMode (..))
import Ormolu.Utils.Fixity (parseFixityDeclarationStr, parseModuleReexportDeclarationStr)
import System.Directory
( XdgDirectory (XdgConfig),
findFile,
getXdgDirectory,
makeAbsolute,
)
import System.FilePath (splitPath, (</>))
data SourceType
=
ModuleSource
|
SignatureSource
deriving (SourceType -> SourceType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SourceType -> SourceType -> Bool
$c/= :: SourceType -> SourceType -> Bool
== :: SourceType -> SourceType -> Bool
$c== :: SourceType -> SourceType -> Bool
Eq, Int -> SourceType -> ShowS
[SourceType] -> ShowS
SourceType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SourceType] -> ShowS
$cshowList :: [SourceType] -> ShowS
show :: SourceType -> String
$cshow :: SourceType -> String
showsPrec :: Int -> SourceType -> ShowS
$cshowsPrec :: Int -> SourceType -> ShowS
Show)
data Config region = Config
{
forall region. Config region -> [DynOption]
cfgDynOptions :: ![DynOption],
forall region. Config region -> FixityOverrides
cfgFixityOverrides :: !FixityOverrides,
forall region. Config region -> ModuleReexports
cfgModuleReexports :: !ModuleReexports,
forall region. Config region -> Set PackageName
cfgDependencies :: !(Set PackageName),
forall region. Config region -> Bool
cfgUnsafe :: !Bool,
forall region. Config region -> Bool
cfgDebug :: !Bool,
forall region. Config region -> Bool
cfgCheckIdempotence :: !Bool,
forall region. Config region -> SourceType
cfgSourceType :: !SourceType,
forall region. Config region -> ColorMode
cfgColorMode :: !ColorMode,
forall region. Config region -> region
cfgRegion :: !region,
forall region. Config region -> PrinterOptsTotal
cfgPrinterOpts :: !PrinterOptsTotal
}
deriving (Config region -> Config region -> Bool
forall region. Eq region => Config region -> Config region -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Config region -> Config region -> Bool
$c/= :: forall region. Eq region => Config region -> Config region -> Bool
== :: Config region -> Config region -> Bool
$c== :: forall region. Eq region => Config region -> Config region -> Bool
Eq, Int -> Config region -> ShowS
forall region. Show region => Int -> Config region -> ShowS
forall region. Show region => [Config region] -> ShowS
forall region. Show region => Config region -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Config region] -> ShowS
$cshowList :: forall region. Show region => [Config region] -> ShowS
show :: Config region -> String
$cshow :: forall region. Show region => Config region -> String
showsPrec :: Int -> Config region -> ShowS
$cshowsPrec :: forall region. Show region => Int -> Config region -> ShowS
Show, forall a b. a -> Config b -> Config a
forall a b. (a -> b) -> Config a -> Config b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Config b -> Config a
$c<$ :: forall a b. a -> Config b -> Config a
fmap :: forall a b. (a -> b) -> Config a -> Config b
$cfmap :: forall a b. (a -> b) -> Config a -> Config b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall region x. Rep (Config region) x -> Config region
forall region x. Config region -> Rep (Config region) x
$cto :: forall region x. Rep (Config region) x -> Config region
$cfrom :: forall region x. Config region -> Rep (Config region) x
Generic)
data RegionIndices = RegionIndices
{
RegionIndices -> Maybe Int
regionStartLine :: !(Maybe Int),
RegionIndices -> Maybe Int
regionEndLine :: !(Maybe Int)
}
deriving (RegionIndices -> RegionIndices -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegionIndices -> RegionIndices -> Bool
$c/= :: RegionIndices -> RegionIndices -> Bool
== :: RegionIndices -> RegionIndices -> Bool
$c== :: RegionIndices -> RegionIndices -> Bool
Eq, Int -> RegionIndices -> ShowS
[RegionIndices] -> ShowS
RegionIndices -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegionIndices] -> ShowS
$cshowList :: [RegionIndices] -> ShowS
show :: RegionIndices -> String
$cshow :: RegionIndices -> String
showsPrec :: Int -> RegionIndices -> ShowS
$cshowsPrec :: Int -> RegionIndices -> ShowS
Show)
data RegionDeltas = RegionDeltas
{
RegionDeltas -> Int
regionPrefixLength :: !Int,
RegionDeltas -> Int
regionSuffixLength :: !Int
}
deriving (RegionDeltas -> RegionDeltas -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegionDeltas -> RegionDeltas -> Bool
$c/= :: RegionDeltas -> RegionDeltas -> Bool
== :: RegionDeltas -> RegionDeltas -> Bool
$c== :: RegionDeltas -> RegionDeltas -> Bool
Eq, Int -> RegionDeltas -> ShowS
[RegionDeltas] -> ShowS
RegionDeltas -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegionDeltas] -> ShowS
$cshowList :: [RegionDeltas] -> ShowS
show :: RegionDeltas -> String
$cshow :: RegionDeltas -> String
showsPrec :: Int -> RegionDeltas -> ShowS
$cshowsPrec :: Int -> RegionDeltas -> ShowS
Show)
defaultConfig :: Config RegionIndices
defaultConfig :: Config RegionIndices
defaultConfig =
Config
{ cfgDynOptions :: [DynOption]
cfgDynOptions = [],
cfgFixityOverrides :: FixityOverrides
cfgFixityOverrides = FixityOverrides
defaultFixityOverrides,
cfgModuleReexports :: ModuleReexports
cfgModuleReexports = ModuleReexports
defaultModuleReexports,
cfgDependencies :: Set PackageName
cfgDependencies = forall a. Set a
Set.empty,
cfgUnsafe :: Bool
cfgUnsafe = Bool
False,
cfgDebug :: Bool
cfgDebug = Bool
False,
cfgCheckIdempotence :: Bool
cfgCheckIdempotence = Bool
False,
cfgSourceType :: SourceType
cfgSourceType = SourceType
ModuleSource,
cfgColorMode :: ColorMode
cfgColorMode = ColorMode
Auto,
cfgRegion :: RegionIndices
cfgRegion =
RegionIndices
{ regionStartLine :: Maybe Int
regionStartLine = forall a. Maybe a
Nothing,
regionEndLine :: Maybe Int
regionEndLine = forall a. Maybe a
Nothing
},
cfgPrinterOpts :: PrinterOptsTotal
cfgPrinterOpts = PrinterOptsTotal
defaultPrinterOpts
}
overapproximatedDependencies :: Config region -> Set PackageName
overapproximatedDependencies :: forall region. Config region -> Set PackageName
overapproximatedDependencies Config {region
Bool
[DynOption]
Set PackageName
PrinterOptsTotal
ColorMode
ModuleReexports
FixityOverrides
SourceType
cfgPrinterOpts :: PrinterOptsTotal
cfgRegion :: region
cfgColorMode :: ColorMode
cfgSourceType :: SourceType
cfgCheckIdempotence :: Bool
cfgDebug :: Bool
cfgUnsafe :: Bool
cfgDependencies :: Set PackageName
cfgModuleReexports :: ModuleReexports
cfgFixityOverrides :: FixityOverrides
cfgDynOptions :: [DynOption]
cfgPrinterOpts :: forall region. Config region -> PrinterOptsTotal
cfgRegion :: forall region. Config region -> region
cfgColorMode :: forall region. Config region -> ColorMode
cfgSourceType :: forall region. Config region -> SourceType
cfgCheckIdempotence :: forall region. Config region -> Bool
cfgDebug :: forall region. Config region -> Bool
cfgUnsafe :: forall region. Config region -> Bool
cfgDependencies :: forall region. Config region -> Set PackageName
cfgModuleReexports :: forall region. Config region -> ModuleReexports
cfgFixityOverrides :: forall region. Config region -> FixityOverrides
cfgDynOptions :: forall region. Config region -> [DynOption]
..} =
forall a. Ord a => Set a -> Set a -> Set a
Set.union Set PackageName
cfgDependencies Set PackageName
potentialReexportTargets
where
potentialReexportTargets :: Set PackageName
potentialReexportTargets =
forall a. Ord a => [a] -> Set a
Set.fromList
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall {b} {b}. NonEmpty (Maybe b, b) -> [b]
toTargetPackages
forall a b. (a -> b) -> a -> b
$ forall k a. Map k a -> [a]
Map.elems (ModuleReexports
-> Map ModuleName (NonEmpty (Maybe PackageName, ModuleName))
unModuleReexports ModuleReexports
cfgModuleReexports)
toTargetPackages :: NonEmpty (Maybe b, b) -> [b]
toTargetPackages = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall a b. (a -> b) -> a -> b
$ \case
(Maybe b
Nothing, b
_) -> []
(Just b
x, b
_) -> [b
x]
regionIndicesToDeltas ::
Int ->
RegionIndices ->
RegionDeltas
regionIndicesToDeltas :: Int -> RegionIndices -> RegionDeltas
regionIndicesToDeltas Int
total RegionIndices {Maybe Int
regionEndLine :: Maybe Int
regionStartLine :: Maybe Int
regionEndLine :: RegionIndices -> Maybe Int
regionStartLine :: RegionIndices -> Maybe Int
..} =
RegionDeltas
{ regionPrefixLength :: Int
regionPrefixLength = forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (forall a. Num a => a -> a -> a
subtract Int
1) Maybe Int
regionStartLine,
regionSuffixLength :: Int
regionSuffixLength = forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int
total -) Maybe Int
regionEndLine
}
newtype DynOption = DynOption
{ DynOption -> String
unDynOption :: String
}
deriving (DynOption -> DynOption -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DynOption -> DynOption -> Bool
$c/= :: DynOption -> DynOption -> Bool
== :: DynOption -> DynOption -> Bool
$c== :: DynOption -> DynOption -> Bool
Eq, Eq DynOption
DynOption -> DynOption -> Bool
DynOption -> DynOption -> Ordering
DynOption -> DynOption -> DynOption
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: DynOption -> DynOption -> DynOption
$cmin :: DynOption -> DynOption -> DynOption
max :: DynOption -> DynOption -> DynOption
$cmax :: DynOption -> DynOption -> DynOption
>= :: DynOption -> DynOption -> Bool
$c>= :: DynOption -> DynOption -> Bool
> :: DynOption -> DynOption -> Bool
$c> :: DynOption -> DynOption -> Bool
<= :: DynOption -> DynOption -> Bool
$c<= :: DynOption -> DynOption -> Bool
< :: DynOption -> DynOption -> Bool
$c< :: DynOption -> DynOption -> Bool
compare :: DynOption -> DynOption -> Ordering
$ccompare :: DynOption -> DynOption -> Ordering
Ord, Int -> DynOption -> ShowS
[DynOption] -> ShowS
DynOption -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DynOption] -> ShowS
$cshowList :: [DynOption] -> ShowS
show :: DynOption -> String
$cshow :: DynOption -> String
showsPrec :: Int -> DynOption -> ShowS
$cshowsPrec :: Int -> DynOption -> ShowS
Show)
dynOptionToLocatedStr :: DynOption -> GHC.Located String
dynOptionToLocatedStr :: DynOption -> Located String
dynOptionToLocatedStr (DynOption String
o) = forall l e. l -> e -> GenLocated l e
GHC.L SrcSpan
GHC.noSrcSpan String
o
type PrinterOptsPartial = PrinterOpts Maybe
deriving instance Eq PrinterOptsPartial
deriving instance Show PrinterOptsPartial
instance Semigroup PrinterOptsPartial where
<> :: PrinterOptsPartial -> PrinterOptsPartial -> PrinterOptsPartial
(<>) = forall (f :: * -> *).
Applicative f =>
PrinterOptsPartial -> PrinterOpts f -> PrinterOpts f
fillMissingPrinterOpts
instance Monoid PrinterOptsPartial where
mempty :: PrinterOptsPartial
mempty = PrinterOptsPartial
emptyPrinterOpts
instance Aeson.FromJSON PrinterOptsPartial where
parseJSON :: Value -> Parser PrinterOptsPartial
parseJSON =
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"PrinterOpts" forall a b. (a -> b) -> a -> b
$ \Object
o ->
forall (f :: * -> *).
Applicative f =>
(forall a. PrinterOptsFieldType a => String -> f (Maybe a))
-> f PrinterOptsPartial
parsePrinterOptsJSON (forall a. FromJSON a => Object -> String -> Parser (Maybe a)
parseField Object
o)
where
parseField :: (Aeson.FromJSON a) => Aeson.Object -> String -> Aeson.Parser (Maybe a)
parseField :: forall a. FromJSON a => Object -> String -> Parser (Maybe a)
parseField Object
o String
keyName = do
let key :: Key
key = forall a. IsString a => String -> a
fromString String
keyName
Maybe Value
mValue <- Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Aeson..:? Key
key
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe Value
mValue forall a b. (a -> b) -> a -> b
$ \Value
value ->
forall a. FromJSON a => Value -> Parser a
Aeson.parseJSON Value
value forall a. Parser a -> JSONPathElement -> Parser a
Aeson.<?> Key -> JSONPathElement
Aeson.Key Key
key
type PrinterOptsTotal = PrinterOpts Identity
deriving instance Eq PrinterOptsTotal
deriving instance Show PrinterOptsTotal
data FourmoluConfig = FourmoluConfig
{ FourmoluConfig -> PrinterOptsPartial
cfgFilePrinterOpts :: PrinterOptsPartial,
FourmoluConfig -> FixityOverrides
cfgFileFixities :: FixityOverrides,
FourmoluConfig -> ModuleReexports
cfgFileReexports :: ModuleReexports
}
deriving (FourmoluConfig -> FourmoluConfig -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FourmoluConfig -> FourmoluConfig -> Bool
$c/= :: FourmoluConfig -> FourmoluConfig -> Bool
== :: FourmoluConfig -> FourmoluConfig -> Bool
$c== :: FourmoluConfig -> FourmoluConfig -> Bool
Eq, Int -> FourmoluConfig -> ShowS
[FourmoluConfig] -> ShowS
FourmoluConfig -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FourmoluConfig] -> ShowS
$cshowList :: [FourmoluConfig] -> ShowS
show :: FourmoluConfig -> String
$cshow :: FourmoluConfig -> String
showsPrec :: Int -> FourmoluConfig -> ShowS
$cshowsPrec :: Int -> FourmoluConfig -> ShowS
Show)
instance Aeson.FromJSON FourmoluConfig where
parseJSON :: Value -> Parser FourmoluConfig
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"FourmoluConfig" forall a b. (a -> b) -> a -> b
$ \Object
o -> do
PrinterOptsPartial
cfgFilePrinterOpts <- forall a. FromJSON a => Value -> Parser a
Aeson.parseJSON (Object -> Value
Aeson.Object Object
o)
[String]
rawFixities <- Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"fixities" forall a. Parser (Maybe a) -> a -> Parser a
.!= []
FixityOverrides
cfgFileFixities <-
case forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM String -> Either String [(OpName, FixityInfo)]
parseFixityDeclarationStr [String]
rawFixities of
Right [[(OpName, FixityInfo)]]
fixities -> forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map OpName FixityInfo -> FixityOverrides
FixityOverrides forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall a b. (a -> b) -> a -> b
$ [[(OpName, FixityInfo)]]
fixities
Left String
e -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
e
[String]
rawReexports <- Object
o forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"reexports" forall a. Parser (Maybe a) -> a -> Parser a
.!= []
ModuleReexports
cfgFileReexports <-
case forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM String
-> Either
String (ModuleName, NonEmpty (Maybe PackageName, ModuleName))
parseModuleReexportDeclarationStr [String]
rawReexports of
Right [(ModuleName, NonEmpty (Maybe PackageName, ModuleName))]
reexports -> forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map ModuleName (NonEmpty (Maybe PackageName, ModuleName))
-> ModuleReexports
ModuleReexports forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ [(ModuleName, NonEmpty (Maybe PackageName, ModuleName))]
reexports
Left String
e -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
e
return FourmoluConfig {PrinterOptsPartial
ModuleReexports
FixityOverrides
cfgFileReexports :: ModuleReexports
cfgFileFixities :: FixityOverrides
cfgFilePrinterOpts :: PrinterOptsPartial
cfgFileReexports :: ModuleReexports
cfgFileFixities :: FixityOverrides
cfgFilePrinterOpts :: PrinterOptsPartial
..}
emptyConfig :: FourmoluConfig
emptyConfig :: FourmoluConfig
emptyConfig =
FourmoluConfig
{ cfgFilePrinterOpts :: PrinterOptsPartial
cfgFilePrinterOpts = forall a. Monoid a => a
mempty,
cfgFileFixities :: FixityOverrides
cfgFileFixities = Map OpName FixityInfo -> FixityOverrides
FixityOverrides forall a. Monoid a => a
mempty,
cfgFileReexports :: ModuleReexports
cfgFileReexports = Map ModuleName (NonEmpty (Maybe PackageName, ModuleName))
-> ModuleReexports
ModuleReexports forall a. Monoid a => a
mempty
}
loadConfigFile :: FilePath -> IO ConfigFileLoadResult
loadConfigFile :: String -> IO ConfigFileLoadResult
loadConfigFile String
path = do
String
root <- String -> IO String
makeAbsolute String
path
String
xdg <- XdgDirectory -> String -> IO String
getXdgDirectory XdgDirectory
XdgConfig String
""
let dirs :: [String]
dirs = forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ String
xdg forall a. a -> [a] -> [a]
: forall a. (a -> a -> a) -> [a] -> [a]
scanl1 String -> ShowS
(</>) (String -> [String]
splitPath String
root)
[String] -> String -> IO (Maybe String)
findFile [String]
dirs String
configFileName forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe String
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [String] -> ConfigFileLoadResult
ConfigNotFound [String]
dirs
Just String
file ->
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> ParseException -> ConfigFileLoadResult
ConfigParseError String
file) (String -> FourmoluConfig -> ConfigFileLoadResult
ConfigLoaded String
file)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. FromJSON a => String -> IO (Either ParseException a)
Yaml.decodeFileEither String
file
data ConfigFileLoadResult
= ConfigLoaded FilePath FourmoluConfig
| ConfigParseError FilePath Yaml.ParseException
| ConfigNotFound [FilePath]
deriving (Int -> ConfigFileLoadResult -> ShowS
[ConfigFileLoadResult] -> ShowS
ConfigFileLoadResult -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ConfigFileLoadResult] -> ShowS
$cshowList :: [ConfigFileLoadResult] -> ShowS
show :: ConfigFileLoadResult -> String
$cshow :: ConfigFileLoadResult -> String
showsPrec :: Int -> ConfigFileLoadResult -> ShowS
$cshowsPrec :: Int -> ConfigFileLoadResult -> ShowS
Show)
configFileName :: FilePath
configFileName :: String
configFileName = String
"fourmolu.yaml"