{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module RIO.PrettyPrint
(
HasTerm (..)
, HasStylesUpdate (..)
, displayPlain
, displayWithColor
, prettyDebug
, prettyDebugL
, prettyDebugS
, prettyInfo
, prettyInfoL
, prettyInfoS
, prettyNote
, prettyNoteL
, prettyNoteS
, prettyWarn
, prettyWarnL
, prettyWarnS
, prettyWarnNoIndent
, prettyWarnNoIndentL
, prettyWarnNoIndentS
, prettyError
, prettyErrorL
, prettyErrorS
, prettyErrorNoIndent
, prettyErrorNoIndentL
, prettyErrorNoIndentS
, prettyGeneric
, prettyWith
, style
, displayMilliseconds
, logLevelToStyle
, blankLine
, bulletedList
, spacedBulletedList
, mkBulletedList
, mkNarrativeList
, debugBracket
, Pretty (..)
, StyleDoc (..)
, StyleAnn (..)
, nest
, line
, linebreak
, group
, softline
, softbreak
, align
, hang
, indent
, encloseSep
, (<+>)
, hsep
, vsep
, fillSep
, sep
, hcat
, vcat
, fillCat
, cat
, punctuate
, fill
, fillBreak
, enclose
, squotes
, dquotes
, parens
, angles
, braces
, brackets
, string
, indentAfterLabel
, wordDocs
, flow
, Style (..)
) where
import Data.List ( intersperse )
import RIO
import RIO.PrettyPrint.StylesUpdate ( HasStylesUpdate (..) )
import RIO.PrettyPrint.Types ( Style (..) )
import Text.PrettyPrint.Leijen.Extended
( Pretty (pretty), StyleAnn (..), StyleDoc, (<+>), align
, angles, braces, brackets, cat, displayAnsi, displayPlain
, dquotes, enclose, encloseSep, fill, fillBreak, fillCat
, fillSep, group, hang, hcat, hsep, indent, line, linebreak
, nest, parens, punctuate, sep, softbreak, softline, squotes
, string, styleAnn, vcat, vsep
)
class (HasLogFunc env, HasStylesUpdate env) => HasTerm env where
useColorL :: Lens' env Bool
termWidthL :: Lens' env Int
displayWithColor ::
(HasTerm env, Pretty a, MonadReader env m, HasCallStack)
=> a
-> m Utf8Builder
displayWithColor :: forall env a (m :: * -> *).
(HasTerm env, Pretty a, MonadReader env m, HasCallStack) =>
a -> m Utf8Builder
displayWithColor a
x = do
Bool
useAnsi <- forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view forall env. HasTerm env => Lens' env Bool
useColorL
Int
termWidth <- forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view forall env. HasTerm env => Lens' env Int
termWidthL
(if Bool
useAnsi then forall a env (m :: * -> *).
(Pretty a, HasLogFunc env, HasStylesUpdate env, MonadReader env m,
HasCallStack) =>
Int -> a -> m Utf8Builder
displayAnsi else forall a env (m :: * -> *).
(Pretty a, HasLogFunc env, HasStylesUpdate env, MonadReader env m,
HasCallStack) =>
Int -> a -> m Utf8Builder
displayPlain) Int
termWidth a
x
prettyGeneric ::
(HasTerm env, HasCallStack, Pretty b, MonadReader env m, MonadIO m)
=> LogLevel
-> b
-> m ()
prettyGeneric :: forall env b (m :: * -> *).
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> b -> m ()
prettyGeneric LogLevel
level = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
level forall a. a -> a
id
prettyWith ::
(HasTerm env, HasCallStack, Pretty b, MonadReader env m, MonadIO m)
=> LogLevel
-> (a -> b)
-> a
-> m ()
prettyWith :: forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
level a -> b
f = forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasLogFunc env, HasCallStack) =>
LogSource -> LogLevel -> Utf8Builder -> m ()
logGeneric LogSource
"" LogLevel
level forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Display a => a -> Utf8Builder
RIO.display forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall env a (m :: * -> *).
(HasTerm env, Pretty a, MonadReader env m, HasCallStack) =>
a -> m Utf8Builder
displayWithColor forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f
prettyDebugWith, prettyInfoWith, prettyNoteWith, prettyWarnWith, prettyErrorWith, prettyWarnNoIndentWith, prettyErrorNoIndentWith
:: (HasCallStack, HasTerm env, MonadReader env m, MonadIO m)
=> (a -> StyleDoc) -> a -> m ()
prettyDebugWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyDebugWith = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelDebug
prettyInfoWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyInfoWith = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelInfo
prettyNoteWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyNoteWith a -> StyleDoc
f = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelInfo
((StyleDoc
line forall a. Semigroup a => a -> a -> a
<>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> StyleDoc -> StyleDoc
style Style
Good StyleDoc
"Note:" StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
StyleDoc -> StyleDoc
indentAfterLabel forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> StyleDoc
f)
prettyWarnWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnWith a -> StyleDoc
f = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelWarn
((StyleDoc
line forall a. Semigroup a => a -> a -> a
<>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> StyleDoc -> StyleDoc
style Style
Warning StyleDoc
"Warning:" StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
StyleDoc -> StyleDoc
indentAfterLabel forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> StyleDoc
f)
prettyErrorWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorWith a -> StyleDoc
f = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelError
((StyleDoc
line forall a. Semigroup a => a -> a -> a
<>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> StyleDoc -> StyleDoc
style Style
Error StyleDoc
"Error:" StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
StyleDoc -> StyleDoc
indentAfterLabel forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> StyleDoc
f)
prettyWarnNoIndentWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnNoIndentWith a -> StyleDoc
f = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelWarn
((StyleDoc
line forall a. Semigroup a => a -> a -> a
<>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> StyleDoc -> StyleDoc
style Style
Warning StyleDoc
"Warning:" StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> StyleDoc
f)
prettyErrorNoIndentWith :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorNoIndentWith a -> StyleDoc
f = forall env b (m :: * -> *) a.
(HasTerm env, HasCallStack, Pretty b, MonadReader env m,
MonadIO m) =>
LogLevel -> (a -> b) -> a -> m ()
prettyWith LogLevel
LevelError
((StyleDoc
line forall a. Semigroup a => a -> a -> a
<>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> StyleDoc -> StyleDoc
style Style
Error StyleDoc
"Error:" StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> StyleDoc
f)
prettyDebug, prettyInfo, prettyNote, prettyWarn, prettyError, prettyWarnNoIndent, prettyErrorNoIndent
:: (HasCallStack, HasTerm env, MonadReader env m, MonadIO m)
=> StyleDoc -> m ()
prettyDebug :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyDebug = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyDebugWith forall a. a -> a
id
prettyInfo :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyInfo = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyInfoWith forall a. a -> a
id
prettyNote :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyNote = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyNoteWith forall a. a -> a
id
prettyWarn :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyWarn = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnWith forall a. a -> a
id
prettyError :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyError = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorWith forall a. a -> a
id
prettyWarnNoIndent :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyWarnNoIndent = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnNoIndentWith forall a. a -> a
id
prettyErrorNoIndent :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
StyleDoc -> m ()
prettyErrorNoIndent = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorNoIndentWith forall a. a -> a
id
prettyDebugL, prettyInfoL, prettyNoteL, prettyWarnL, prettyErrorL, prettyWarnNoIndentL, prettyErrorNoIndentL
:: (HasCallStack, HasTerm env, MonadReader env m, MonadIO m)
=> [StyleDoc] -> m ()
prettyDebugL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyDebugL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyDebugWith [StyleDoc] -> StyleDoc
fillSep
prettyInfoL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyInfoL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyInfoWith [StyleDoc] -> StyleDoc
fillSep
prettyNoteL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyNoteL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyNoteWith [StyleDoc] -> StyleDoc
fillSep
prettyWarnL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyWarnL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnWith [StyleDoc] -> StyleDoc
fillSep
prettyErrorL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyErrorL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorWith [StyleDoc] -> StyleDoc
fillSep
prettyWarnNoIndentL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyWarnNoIndentL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnNoIndentWith [StyleDoc] -> StyleDoc
fillSep
prettyErrorNoIndentL :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
[StyleDoc] -> m ()
prettyErrorNoIndentL = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorNoIndentWith [StyleDoc] -> StyleDoc
fillSep
prettyDebugS, prettyInfoS, prettyNoteS, prettyWarnS, prettyErrorS, prettyWarnNoIndentS, prettyErrorNoIndentS
:: (HasCallStack, HasTerm env, MonadReader env m, MonadIO m)
=> String -> m ()
prettyDebugS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyDebugS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyDebugWith String -> StyleDoc
flow
prettyInfoS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyInfoS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyInfoWith String -> StyleDoc
flow
prettyNoteS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyNoteS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyNoteWith String -> StyleDoc
flow
prettyWarnS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyWarnS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnWith String -> StyleDoc
flow
prettyErrorS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyErrorS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorWith String -> StyleDoc
flow
prettyWarnNoIndentS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyWarnNoIndentS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyWarnNoIndentWith String -> StyleDoc
flow
prettyErrorNoIndentS :: forall env (m :: * -> *).
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
String -> m ()
prettyErrorNoIndentS = forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m) =>
(a -> StyleDoc) -> a -> m ()
prettyErrorNoIndentWith String -> StyleDoc
flow
indentAfterLabel :: StyleDoc -> StyleDoc
indentAfterLabel :: StyleDoc -> StyleDoc
indentAfterLabel = StyleDoc -> StyleDoc
align
wordDocs :: String -> [StyleDoc]
wordDocs :: String -> [StyleDoc]
wordDocs = forall a b. (a -> b) -> [a] -> [b]
map forall a. IsString a => String -> a
fromString forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words
flow :: String -> StyleDoc
flow :: String -> StyleDoc
flow = [StyleDoc] -> StyleDoc
fillSep forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [StyleDoc]
wordDocs
blankLine :: StyleDoc
blankLine :: StyleDoc
blankLine = StyleDoc
line forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
debugBracket :: (HasCallStack, HasTerm env, MonadReader env m,
MonadIO m, MonadUnliftIO m) => StyleDoc -> m a -> m a
debugBracket :: forall env (m :: * -> *) a.
(HasCallStack, HasTerm env, MonadReader env m, MonadIO m,
MonadUnliftIO m) =>
StyleDoc -> m a -> m a
debugBracket StyleDoc
msg m a
f = do
let output :: StyleDoc -> m ()
output = forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasLogFunc env, HasCallStack) =>
Utf8Builder -> m ()
logDebug forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Display a => a -> Utf8Builder
RIO.display forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall env a (m :: * -> *).
(HasTerm env, Pretty a, MonadReader env m, HasCallStack) =>
a -> m Utf8Builder
displayWithColor
StyleDoc -> m ()
output forall a b. (a -> b) -> a -> b
$ StyleDoc
"Start: " forall a. Semigroup a => a -> a -> a
<> StyleDoc
msg
Double
start <- forall (m :: * -> *). MonadIO m => m Double
getMonotonicTime
a
x <- m a
f forall (m :: * -> *) e a.
(MonadUnliftIO m, Exception e) =>
m a -> (e -> m a) -> m a
`catch` \SomeException
ex -> do
Double
end <- forall (m :: * -> *). MonadIO m => m Double
getMonotonicTime
let diff :: Double
diff = Double
end forall a. Num a => a -> a -> a
- Double
start
StyleDoc -> m ()
output forall a b. (a -> b) -> a -> b
$
StyleDoc
"Finished with exception in"
StyleDoc -> StyleDoc -> StyleDoc
<+> Double -> StyleDoc
displayMilliseconds Double
diff forall a. Semigroup a => a -> a -> a
<> StyleDoc
":"
StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
msg
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
forall a. Semigroup a => a -> a -> a
<> StyleDoc
"Exception thrown: "
forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show SomeException
ex)
forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a
throwIO (SomeException
ex :: SomeException)
Double
end <- forall (m :: * -> *). MonadIO m => m Double
getMonotonicTime
let diff :: Double
diff = Double
end forall a. Num a => a -> a -> a
- Double
start
StyleDoc -> m ()
output forall a b. (a -> b) -> a -> b
$ StyleDoc
"Finished in" StyleDoc -> StyleDoc -> StyleDoc
<+> Double -> StyleDoc
displayMilliseconds Double
diff forall a. Semigroup a => a -> a -> a
<> StyleDoc
":" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
msg
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
style :: Style -> StyleDoc -> StyleDoc
style :: Style -> StyleDoc -> StyleDoc
style = Style -> StyleDoc -> StyleDoc
styleAnn
displayMilliseconds ::
Double
-> StyleDoc
displayMilliseconds :: Double -> StyleDoc
displayMilliseconds Double
t = Style -> StyleDoc -> StyleDoc
style Style
Good forall a b. (a -> b) -> a -> b
$
forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show (forall a b. (RealFrac a, Integral b) => a -> b
round (Double
t forall a. Num a => a -> a -> a
* Double
1000) :: Int)) forall a. Semigroup a => a -> a -> a
<> StyleDoc
"ms"
bulletedList :: [StyleDoc] -> StyleDoc
bulletedList :: [StyleDoc] -> StyleDoc
bulletedList = Bool -> Char -> [StyleDoc] -> StyleDoc
mkBulletedList Bool
False Char
'*'
mkBulletedList ::
Bool
-> Char
-> [StyleDoc]
-> StyleDoc
mkBulletedList :: Bool -> Char -> [StyleDoc] -> StyleDoc
mkBulletedList Bool
isSpaced Char
bullet =
forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> [a] -> [a]
intersperse StyleDoc
spacer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map ((forall a. IsString a => String -> a
fromString [Char
bullet] StyleDoc -> StyleDoc -> StyleDoc
<+>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. StyleDoc -> StyleDoc
align)
where
spacer :: StyleDoc
spacer = if Bool
isSpaced then StyleDoc
line forall a. Semigroup a => a -> a -> a
<> StyleDoc
line else StyleDoc
line
mkNarrativeList ::
Pretty a
=> Maybe Style
-> Bool
-> [a]
-> [StyleDoc]
mkNarrativeList :: forall a. Pretty a => Maybe Style -> Bool -> [a] -> [StyleDoc]
mkNarrativeList Maybe Style
_ Bool
_ [] = []
mkNarrativeList Maybe Style
mStyle Bool
_ [a
x] = [forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id Style -> StyleDoc -> StyleDoc
style Maybe Style
mStyle (forall a. Pretty a => a -> StyleDoc
pretty a
x) forall a. Semigroup a => a -> a -> a
<> StyleDoc
"."]
mkNarrativeList Maybe Style
mStyle Bool
useSerialComma [a
x1, a
x2] =
StyleDoc -> StyleDoc
mStyle' (forall a. Pretty a => a -> StyleDoc
pretty a
x1) forall a. Semigroup a => a -> a -> a
<> (if Bool
useSerialComma then StyleDoc
"," else forall a. Monoid a => a
mempty)
forall a. a -> [a] -> [a]
: StyleDoc
"and"
forall a. a -> [a] -> [a]
: forall a. Pretty a => Maybe Style -> Bool -> [a] -> [StyleDoc]
mkNarrativeList Maybe Style
mStyle Bool
useSerialComma [a
x2]
where
mStyle' :: StyleDoc -> StyleDoc
mStyle' = forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id Style -> StyleDoc -> StyleDoc
style Maybe Style
mStyle
mkNarrativeList Maybe Style
mStyle Bool
useSerialComma (a
x:[a]
xs) =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id Style -> StyleDoc -> StyleDoc
style Maybe Style
mStyle (forall a. Pretty a => a -> StyleDoc
pretty a
x) forall a. Semigroup a => a -> a -> a
<> StyleDoc
","
forall a. a -> [a] -> [a]
: forall a. Pretty a => Maybe Style -> Bool -> [a] -> [StyleDoc]
mkNarrativeList Maybe Style
mStyle Bool
useSerialComma [a]
xs
spacedBulletedList :: [StyleDoc] -> StyleDoc
spacedBulletedList :: [StyleDoc] -> StyleDoc
spacedBulletedList = Bool -> Char -> [StyleDoc] -> StyleDoc
mkBulletedList Bool
True Char
'*'
logLevelToStyle :: LogLevel -> Style
logLevelToStyle :: LogLevel -> Style
logLevelToStyle LogLevel
level = case LogLevel
level of
LogLevel
LevelDebug -> Style
Debug
LogLevel
LevelInfo -> Style
Info
LogLevel
LevelWarn -> Style
Warning
LogLevel
LevelError -> Style
Error
LevelOther LogSource
_ -> Style
OtherLevel