colorful-monoids-0.2.1.1: Styled console text output using ANSI escape sequences.

CopyrightDaniel Mendler (c) 2017
LicenseMIT (see the file LICENSE)
Maintainermail@daniel-mendler.de
Stabilityexperimental
Portabilityportable
Safe HaskellSafe
LanguageHaskell2010

Data.Monoid.Colorful

Contents

Description

This library provides styled text output using ANSI escape sequences. The colored text is modeled as nested Colored values, which form a Monoid. As a result the colored code has a relatively concise form.

For rendering, the Colored Monoid is flattended and then printed out. The library keeps track of a stack of the active styles internally, such that correct and minimal escape sequences are generated.

This library is used by wl-pprint-console, which is a pretty printer with support for annotations.

Warning: Windows support is currently not implemented, but is planned (by using ansi-terminal or the ffi).

Example:

basicExample :: IO ()
basicExample = do
  term <- getTerm
  printColoredS term $ Style Underline (Style Bold "Basic Example\n")
    <> Style Bold "Bold"
    <> Style Italic (Bg Red "Italic Red")
    <> Style Underline "Underline"
  putChar '\n'

For many more examples, see the example.hs file.

Synopsis

The Monoid

data Colored a Source #

Colored Monoid

Constructors

Nil 
Value a 
Style !Style (Colored a) 
Unstyle !Style (Colored a) 
Fg !Color (Colored a) 
Bg !Color (Colored a) 
Pair (Colored a) (Colored a) 

Instances

Monad Colored Source #

Free monad!

Methods

(>>=) :: Colored a -> (a -> Colored b) -> Colored b #

(>>) :: Colored a -> Colored b -> Colored b #

return :: a -> Colored a #

fail :: String -> Colored a #

Functor Colored Source # 

Methods

fmap :: (a -> b) -> Colored a -> Colored b #

(<$) :: a -> Colored b -> Colored a #

Applicative Colored Source #

Free monad!

Methods

pure :: a -> Colored a #

(<*>) :: Colored (a -> b) -> Colored a -> Colored b #

liftA2 :: (a -> b -> c) -> Colored a -> Colored b -> Colored c #

(*>) :: Colored a -> Colored b -> Colored b #

(<*) :: Colored a -> Colored b -> Colored a #

Foldable Colored Source # 

Methods

fold :: Monoid m => Colored m -> m #

foldMap :: Monoid m => (a -> m) -> Colored a -> m #

foldr :: (a -> b -> b) -> b -> Colored a -> b #

foldr' :: (a -> b -> b) -> b -> Colored a -> b #

foldl :: (b -> a -> b) -> b -> Colored a -> b #

foldl' :: (b -> a -> b) -> b -> Colored a -> b #

foldr1 :: (a -> a -> a) -> Colored a -> a #

foldl1 :: (a -> a -> a) -> Colored a -> a #

toList :: Colored a -> [a] #

null :: Colored a -> Bool #

length :: Colored a -> Int #

elem :: Eq a => a -> Colored a -> Bool #

maximum :: Ord a => Colored a -> a #

minimum :: Ord a => Colored a -> a #

sum :: Num a => Colored a -> a #

product :: Num a => Colored a -> a #

Traversable Colored Source # 

Methods

traverse :: Applicative f => (a -> f b) -> Colored a -> f (Colored b) #

sequenceA :: Applicative f => Colored (f a) -> f (Colored a) #

mapM :: Monad m => (a -> m b) -> Colored a -> m (Colored b) #

sequence :: Monad m => Colored (m a) -> m (Colored a) #

IsList (Colored a) Source # 

Associated Types

type Item (Colored a) :: * #

Methods

fromList :: [Item (Colored a)] -> Colored a #

fromListN :: Int -> [Item (Colored a)] -> Colored a #

toList :: Colored a -> [Item (Colored a)] #

Eq a => Eq (Colored a) Source # 

Methods

(==) :: Colored a -> Colored a -> Bool #

(/=) :: Colored a -> Colored a -> Bool #

Ord a => Ord (Colored a) Source # 

Methods

compare :: Colored a -> Colored a -> Ordering #

(<) :: Colored a -> Colored a -> Bool #

(<=) :: Colored a -> Colored a -> Bool #

(>) :: Colored a -> Colored a -> Bool #

(>=) :: Colored a -> Colored a -> Bool #

max :: Colored a -> Colored a -> Colored a #

min :: Colored a -> Colored a -> Colored a #

Read a => Read (Colored a) Source # 
Show a => Show (Colored a) Source # 

Methods

showsPrec :: Int -> Colored a -> ShowS #

show :: Colored a -> String #

showList :: [Colored a] -> ShowS #

IsString a => IsString (Colored a) Source # 

Methods

fromString :: String -> Colored a #

Generic (Colored a) Source # 

Associated Types

type Rep (Colored a) :: * -> * #

Methods

from :: Colored a -> Rep (Colored a) x #

to :: Rep (Colored a) x -> Colored a #

Semigroup (Colored a) Source # 

Methods

(<>) :: Colored a -> Colored a -> Colored a #

sconcat :: NonEmpty (Colored a) -> Colored a #

stimes :: Integral b => b -> Colored a -> Colored a #

Monoid (Colored a) Source # 

Methods

mempty :: Colored a #

mappend :: Colored a -> Colored a -> Colored a #

mconcat :: [Colored a] -> Colored a #

Generic1 * Colored Source # 

Associated Types

type Rep1 Colored (f :: Colored -> *) :: k -> * #

Methods

from1 :: f a -> Rep1 Colored f a #

to1 :: Rep1 Colored f a -> f a #

type Rep (Colored a) Source # 
type Rep (Colored a) = D1 * (MetaData "Colored" "Data.Monoid.Colorful.Nested" "colorful-monoids-0.2.1.1-H7DfojoPUMBLtHPcCEdKZf" False) ((:+:) * ((:+:) * (C1 * (MetaCons "Nil" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "Value" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * a))) (C1 * (MetaCons "Style" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Style)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a))))))) ((:+:) * ((:+:) * (C1 * (MetaCons "Unstyle" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Style)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a))))) (C1 * (MetaCons "Fg" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Color)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a)))))) ((:+:) * (C1 * (MetaCons "Bg" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Color)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a))))) (C1 * (MetaCons "Pair" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a))) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (Colored a))))))))
type Item (Colored a) Source # 
type Item (Colored a) = Colored a
type Rep1 * Colored Source # 
type Rep1 * Colored = D1 * (MetaData "Colored" "Data.Monoid.Colorful.Nested" "colorful-monoids-0.2.1.1-H7DfojoPUMBLtHPcCEdKZf" False) ((:+:) * ((:+:) * (C1 * (MetaCons "Nil" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "Value" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1)) (C1 * (MetaCons "Style" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Style)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored)))))) ((:+:) * ((:+:) * (C1 * (MetaCons "Unstyle" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Style)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored)))) (C1 * (MetaCons "Fg" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Color)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored))))) ((:+:) * (C1 * (MetaCons "Bg" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Color)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored)))) (C1 * (MetaCons "Pair" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 * Colored)))))))

data Style Source #

Rendering style

Constructors

Bold

Bold font

Italic

Italic font

Underline

Underlined text

Invert

Invert foreground and background color

Blink

Blinking

Instances

Bounded Style Source # 
Enum Style Source # 
Eq Style Source # 

Methods

(==) :: Style -> Style -> Bool #

(/=) :: Style -> Style -> Bool #

Ord Style Source # 

Methods

compare :: Style -> Style -> Ordering #

(<) :: Style -> Style -> Bool #

(<=) :: Style -> Style -> Bool #

(>) :: Style -> Style -> Bool #

(>=) :: Style -> Style -> Bool #

max :: Style -> Style -> Style #

min :: Style -> Style -> Style #

Read Style Source # 
Show Style Source # 

Methods

showsPrec :: Int -> Style -> ShowS #

show :: Style -> String #

showList :: [Style] -> ShowS #

Generic Style Source # 

Associated Types

type Rep Style :: * -> * #

Methods

from :: Style -> Rep Style x #

to :: Rep Style x -> Style #

type Rep Style Source # 
type Rep Style = D1 * (MetaData "Style" "Data.Monoid.Colorful.Color" "colorful-monoids-0.2.1.1-H7DfojoPUMBLtHPcCEdKZf" False) ((:+:) * ((:+:) * (C1 * (MetaCons "Bold" PrefixI False) (U1 *)) (C1 * (MetaCons "Italic" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "Underline" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "Invert" PrefixI False) (U1 *)) (C1 * (MetaCons "Blink" PrefixI False) (U1 *)))))

data Color Source #

Named colors, 256 and RGB colors for more capable terminals.

Constructors

DefaultColor

Default terminal color (terminal specific)

Black 
Red 
Green 
Yellow 
Blue 
Magenta 
Cyan 
White 
DullBlack 
DullRed 
DullGreen 
DullYellow 
DullBlue 
DullMagenta 
DullCyan 
DullWhite 
Color256 !Word8

Color from 256 color scheme. Color is automatically reduced to 8 colors for less capable terminals.

RGB !Word8 !Word8 !Word8

True color. Color is automatically reduced to 256 or 8 colors for less capable terminals.

Instances

Eq Color Source # 

Methods

(==) :: Color -> Color -> Bool #

(/=) :: Color -> Color -> Bool #

Ord Color Source # 

Methods

compare :: Color -> Color -> Ordering #

(<) :: Color -> Color -> Bool #

(<=) :: Color -> Color -> Bool #

(>) :: Color -> Color -> Bool #

(>=) :: Color -> Color -> Bool #

max :: Color -> Color -> Color #

min :: Color -> Color -> Color #

Read Color Source # 
Show Color Source # 

Methods

showsPrec :: Int -> Color -> ShowS #

show :: Color -> String #

showList :: [Color] -> ShowS #

Generic Color Source # 

Associated Types

type Rep Color :: * -> * #

Methods

from :: Color -> Rep Color x #

to :: Rep Color x -> Color #

type Rep Color Source # 
type Rep Color = D1 * (MetaData "Color" "Data.Monoid.Colorful.Color" "colorful-monoids-0.2.1.1-H7DfojoPUMBLtHPcCEdKZf" False) ((:+:) * ((:+:) * ((:+:) * ((:+:) * (C1 * (MetaCons "DefaultColor" PrefixI False) (U1 *)) (C1 * (MetaCons "Black" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "Red" PrefixI False) (U1 *)) (C1 * (MetaCons "Green" PrefixI False) (U1 *)))) ((:+:) * ((:+:) * (C1 * (MetaCons "Yellow" PrefixI False) (U1 *)) (C1 * (MetaCons "Blue" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "Magenta" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "Cyan" PrefixI False) (U1 *)) (C1 * (MetaCons "White" PrefixI False) (U1 *)))))) ((:+:) * ((:+:) * ((:+:) * (C1 * (MetaCons "DullBlack" PrefixI False) (U1 *)) (C1 * (MetaCons "DullRed" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "DullGreen" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "DullYellow" PrefixI False) (U1 *)) (C1 * (MetaCons "DullBlue" PrefixI False) (U1 *))))) ((:+:) * ((:+:) * (C1 * (MetaCons "DullMagenta" PrefixI False) (U1 *)) (C1 * (MetaCons "DullCyan" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "DullWhite" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "Color256" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Word8))) (C1 * (MetaCons "RGB" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Word8)) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Word8)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 * Word8))))))))))

Terminal type

data Term Source #

Terminal type. For less capable terminals the color depth is automatically reduced.

Constructors

TermDumb

Dumb terminal - no color output

Term8

8 colors supported

Term256

256 colors supported

TermRGB

True colors supported

TermWin

Windows terminal. Will use emulation (Not yet implemented).

Instances

Bounded Term Source # 
Enum Term Source # 

Methods

succ :: Term -> Term #

pred :: Term -> Term #

toEnum :: Int -> Term #

fromEnum :: Term -> Int #

enumFrom :: Term -> [Term] #

enumFromThen :: Term -> Term -> [Term] #

enumFromTo :: Term -> Term -> [Term] #

enumFromThenTo :: Term -> Term -> Term -> [Term] #

Eq Term Source # 

Methods

(==) :: Term -> Term -> Bool #

(/=) :: Term -> Term -> Bool #

Ord Term Source # 

Methods

compare :: Term -> Term -> Ordering #

(<) :: Term -> Term -> Bool #

(<=) :: Term -> Term -> Bool #

(>) :: Term -> Term -> Bool #

(>=) :: Term -> Term -> Bool #

max :: Term -> Term -> Term #

min :: Term -> Term -> Term #

Read Term Source # 
Show Term Source # 

Methods

showsPrec :: Int -> Term -> ShowS #

show :: Term -> String #

showList :: [Term] -> ShowS #

Generic Term Source # 

Associated Types

type Rep Term :: * -> * #

Methods

from :: Term -> Rep Term x #

to :: Rep Term x -> Term #

type Rep Term Source # 
type Rep Term = D1 * (MetaData "Term" "Data.Monoid.Colorful.Term" "colorful-monoids-0.2.1.1-H7DfojoPUMBLtHPcCEdKZf" False) ((:+:) * ((:+:) * (C1 * (MetaCons "TermDumb" PrefixI False) (U1 *)) (C1 * (MetaCons "Term8" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "Term256" PrefixI False) (U1 *)) ((:+:) * (C1 * (MetaCons "TermRGB" PrefixI False) (U1 *)) (C1 * (MetaCons "TermWin" PrefixI False) (U1 *)))))

hGetTerm :: Handle -> IO Term Source #

The action (hGetTerm handle) determines the terminal type of the file handle.

The terminal type is determined by checking if the file handle points to a device and by looking at the $TERM environment variable.

Colorful printing to file handle

hPrintColored :: (Handle -> a -> IO ()) -> Handle -> Term -> Colored a -> IO () Source #

printColored :: (a -> IO ()) -> Term -> Colored a -> IO () Source #

Show with ANSI escape sequences

showColored :: Monoid o => (a -> o) -> (SGRCode -> o) -> Term -> Colored a -> o Source #

showColoredM :: (Monad f, Monoid o) => (a -> f o) -> (SGRCode -> f o) -> Term -> Colored a -> f o Source #

Reexport from Data.Semigroup

(<>) :: Semigroup a => a -> a -> a infixr 6 #

An associative operation.

(a <> b) <> c = a <> (b <> c)

If a is also a Monoid we further require

(<>) = mappend