{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# LANGUAGE LambdaCase #-}
module Language.Cimple.PrettyCommon where

import           Data.Text                     (Text)
import qualified Data.Text                     as Text
import qualified Data.Text.Lazy                as TL
import           Language.Cimple               (AssignOp (..), BinaryOp (..),
                                                Comment, CommentF (..),
                                                CommentStyle (..), Lexeme (..),
                                                LexemeClass (..), Node,
                                                NodeF (..), Nullability (..),
                                                Scope (..), UnaryOp (..),
                                                lexemeLine, lexemeText)
import           Language.Cimple.PrettyColor   (dullcyan, dullgreen, dullred,
                                                dullyellow)
import           Prettyprinter
import           Prettyprinter.Render.Terminal (AnsiStyle)
import qualified Prettyprinter.Render.Terminal as Term

kwBitwise :: Doc AnsiStyle
kwBitwise         = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"bitwise"
kwBreak :: Doc AnsiStyle
kwBreak           = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"break"
kwCase :: Doc AnsiStyle
kwCase            = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"case"
kwConst :: Doc AnsiStyle
kwConst           = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"const"
kwContinue :: Doc AnsiStyle
kwContinue        = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"continue"
kwDefault :: Doc AnsiStyle
kwDefault         = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"default"
kwDo :: Doc AnsiStyle
kwDo              = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"do"
kwElse :: Doc AnsiStyle
kwElse            = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"else"
kwEnum :: Doc AnsiStyle
kwEnum            = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"enum"
kwExtern :: Doc AnsiStyle
kwExtern          = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"extern"
kwFor :: Doc AnsiStyle
kwFor             = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"for"
kwForce :: Doc AnsiStyle
kwForce           = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"force"
kwGnuPrintf :: Doc AnsiStyle
kwGnuPrintf       = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"GNU_PRINTF"
kwGoto :: Doc AnsiStyle
kwGoto            = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"goto"
kwIf :: Doc AnsiStyle
kwIf              = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"if"
kwNonnull :: Doc AnsiStyle
kwNonnull         = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"_Nonnull"
kwNullable :: Doc AnsiStyle
kwNullable        = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"_Nullable"
kwOwner :: Doc AnsiStyle
kwOwner           = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"owner"
kwReturn :: Doc AnsiStyle
kwReturn          = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"return"
kwSizeof :: Doc AnsiStyle
kwSizeof          = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"sizeof"
kwStaticAssert :: Doc AnsiStyle
kwStaticAssert    = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"static_assert"
kwStatic :: Doc AnsiStyle
kwStatic          = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"static"
kwStruct :: Doc AnsiStyle
kwStruct          = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"struct"
kwSwitch :: Doc AnsiStyle
kwSwitch          = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"switch"
kwTypedef :: Doc AnsiStyle
kwTypedef         = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"typedef"
kwUnion :: Doc AnsiStyle
kwUnion           = Doc AnsiStyle -> Doc AnsiStyle
dullgreen (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"union"
kwWhile :: Doc AnsiStyle
kwWhile           = Doc AnsiStyle -> Doc AnsiStyle
dullred   (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"while"

kwDocAttention :: Doc AnsiStyle
kwDocAttention    = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@attention"
kwDocBrief :: Doc AnsiStyle
kwDocBrief        = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@brief"
kwDocDeprecated :: Doc AnsiStyle
kwDocDeprecated   = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@deprecated"
kwDocFile :: Doc AnsiStyle
kwDocFile         = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@file"
kwDocExtends :: Doc AnsiStyle
kwDocExtends      = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@extends"
kwDocImplements :: Doc AnsiStyle
kwDocImplements   = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@implements"
kwDocParam :: Doc AnsiStyle
kwDocParam        = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@param"
kwDocPrivate :: Doc AnsiStyle
kwDocPrivate      = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@private"
kwDocRef :: Doc AnsiStyle
kwDocRef          = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@ref"
kwDocReturn :: Doc AnsiStyle
kwDocReturn       = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@return"
kwDocRetval :: Doc AnsiStyle
kwDocRetval       = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@retval"
kwDocP :: Doc AnsiStyle
kwDocP            = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@p"
kwDocSee :: Doc AnsiStyle
kwDocSee          = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@see"
kwDocSecurityRank :: Doc AnsiStyle
kwDocSecurityRank = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@security_rank"
kwDocNote :: Doc AnsiStyle
kwDocNote         = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@note"
kwDocSection :: Doc AnsiStyle
kwDocSection      = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@section"
kwDocSubsection :: Doc AnsiStyle
kwDocSubsection   = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@subsection"
kwDocCode :: Doc AnsiStyle
kwDocCode         = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@code"
kwDocEndCode :: Doc AnsiStyle
kwDocEndCode      = Doc AnsiStyle -> Doc AnsiStyle
dullcyan (Doc AnsiStyle -> Doc AnsiStyle) -> Doc AnsiStyle -> Doc AnsiStyle
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"@endcode"

ppAssignOp :: AssignOp -> Doc AnsiStyle
ppAssignOp :: AssignOp -> Doc AnsiStyle
ppAssignOp = \case
    AssignOp
AopEq     -> Doc AnsiStyle
forall ann. Doc ann
equals
    AssignOp
AopMul    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"*="
    AssignOp
AopDiv    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"/="
    AssignOp
AopPlus   -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"+="
    AssignOp
AopMinus  -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"-="
    AssignOp
AopBitAnd -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"&="
    AssignOp
AopBitOr  -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"|="
    AssignOp
AopBitXor -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"^="
    AssignOp
AopMod    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"%="
    AssignOp
AopLsh    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
">>="
    AssignOp
AopRsh    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"<<="

ppBinaryOp :: BinaryOp -> Doc AnsiStyle
ppBinaryOp :: BinaryOp -> Doc AnsiStyle
ppBinaryOp = \case
    BinaryOp
BopNe     -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"!="
    BinaryOp
BopEq     -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"=="
    BinaryOp
BopOr     -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"||"
    BinaryOp
BopBitXor -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'^'
    BinaryOp
BopBitOr  -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'|'
    BinaryOp
BopAnd    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"&&"
    BinaryOp
BopBitAnd -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'&'
    BinaryOp
BopDiv    -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'/'
    BinaryOp
BopMul    -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'*'
    BinaryOp
BopMod    -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'%'
    BinaryOp
BopPlus   -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'+'
    BinaryOp
BopMinus  -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'-'
    BinaryOp
BopLt     -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'<'
    BinaryOp
BopLe     -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"<="
    BinaryOp
BopLsh    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"<<"
    BinaryOp
BopGt     -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'>'
    BinaryOp
BopGe     -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
">="
    BinaryOp
BopRsh    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
">>"

ppUnaryOp :: UnaryOp -> Doc AnsiStyle
ppUnaryOp :: UnaryOp -> Doc AnsiStyle
ppUnaryOp = \case
    UnaryOp
UopNot     -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'!'
    UnaryOp
UopNeg     -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'~'
    UnaryOp
UopMinus   -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'-'
    UnaryOp
UopAddress -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'&'
    UnaryOp
UopDeref   -> Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'*'
    UnaryOp
UopIncr    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"++"
    UnaryOp
UopDecr    -> [Char] -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty [Char]
"--"

cmtPrefix :: Doc AnsiStyle
cmtPrefix :: Doc AnsiStyle
cmtPrefix = Doc AnsiStyle -> Doc AnsiStyle
dullyellow (Char -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty Char
'*')

ppLexeme :: Pretty a => Lexeme a -> Doc AnsiStyle
ppLexeme :: Lexeme a -> Doc AnsiStyle
ppLexeme = a -> Doc AnsiStyle
forall a ann. Pretty a => a -> Doc ann
pretty (a -> Doc AnsiStyle)
-> (Lexeme a -> a) -> Lexeme a -> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lexeme a -> a
forall text. Lexeme text -> text
lexemeText

commaSep :: [Doc AnsiStyle] -> Doc AnsiStyle
commaSep :: [Doc AnsiStyle] -> Doc AnsiStyle
commaSep = [Doc AnsiStyle] -> Doc AnsiStyle
forall ann. [Doc ann] -> Doc ann
hsep ([Doc AnsiStyle] -> Doc AnsiStyle)
-> ([Doc AnsiStyle] -> [Doc AnsiStyle])
-> [Doc AnsiStyle]
-> Doc AnsiStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> [Doc AnsiStyle] -> [Doc AnsiStyle]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc AnsiStyle
forall ann. Doc ann
comma

plain :: Doc ann -> Doc xxx
plain :: Doc ann -> Doc xxx
plain = Doc ann -> Doc xxx
forall ann xxx. Doc ann -> Doc xxx
unAnnotate

renderSmart :: Float -> Int -> Doc AnsiStyle -> SimpleDocStream AnsiStyle
renderSmart :: Float -> Int -> Doc AnsiStyle -> SimpleDocStream AnsiStyle
renderSmart Float
ribbonFraction Int
widthPerLine
    = LayoutOptions -> Doc AnsiStyle -> SimpleDocStream AnsiStyle
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutSmart LayoutOptions :: PageWidth -> LayoutOptions
LayoutOptions
        { layoutPageWidth :: PageWidth
layoutPageWidth = Int -> Double -> PageWidth
AvailablePerLine Int
widthPerLine (Float -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
ribbonFraction) }

renderS :: Doc AnsiStyle -> String
renderS :: Doc AnsiStyle -> [Char]
renderS = Text -> [Char]
Text.unpack (Text -> [Char])
-> (Doc AnsiStyle -> Text) -> Doc AnsiStyle -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Text
render

render :: Doc AnsiStyle -> Text
render :: Doc AnsiStyle -> Text
render = Text -> Text
TL.toStrict (Text -> Text) -> (Doc AnsiStyle -> Text) -> Doc AnsiStyle -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SimpleDocStream AnsiStyle -> Text
Term.renderLazy (SimpleDocStream AnsiStyle -> Text)
-> (Doc AnsiStyle -> SimpleDocStream AnsiStyle)
-> Doc AnsiStyle
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Int -> Doc AnsiStyle -> SimpleDocStream AnsiStyle
renderSmart Float
1 Int
120