{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Prettyprinting STG elements in various formats.
module Stg.Language.Prettyprint (
    Pretty(..),
    prettyprint,
    prettyprintPlain,
) where



import           Data.Text                    (Text)
import qualified Data.Text                    as T
import           Prelude                      hiding ((<$>))
import           Text.PrettyPrint.ANSI.Leijen



-- | Prettyprint a value as 'Text', including styles such as colours.
prettyprint :: Pretty a => a -> Text
prettyprint = prettyprintModified id

-- | Prettyprint a value as 'Text', stripped off all style information such as
-- colours.
prettyprintPlain :: Pretty a => a -> Text
prettyprintPlain = prettyprintModified plain

prettyprintModified :: Pretty a => (Doc -> Doc) -> a -> Text
prettyprintModified modifier input =
    T.pack (displayS (renderPretty 0.4 1000 (modifier (pretty input))) "")