{-# OPTIONS_HADDOCK ignore-exports #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE CPP #-}
module XPrelude.PP (
  module Exports
  , PrettyError (..)
  , ppline
  , pplines
  , pptext
  , ppstring
)
where

import           Protolude

import           Data.Scientific
import           Data.Semigroup as Sem
import           Data.String
import qualified Data.Text                    as Text
import           Text.PrettyPrint.ANSI.Leijen as Exports hiding (bool, cat,
                                                          char, double, empty,
                                                          float, group, int,
                                                          integer, rational,
                                                          string, text, (<$>))

import           Text.PrettyPrint.ANSI.Leijen (string, text)

newtype PrettyError = PrettyError
  { getError :: Doc
  } deriving Show

instance Sem.Semigroup PrettyError where
  a <> b = PrettyError $ align (vsep [getError a, getError b])

instance Monoid PrettyError where
  mempty = PrettyError mempty
#if !(MIN_VERSION_base(4,11,0))
  mappend = (Sem.<>)
#endif

instance IsString PrettyError where
  fromString = PrettyError . string

instance Pretty PrettyError where
  pretty = getError

instance Pretty Scientific where
  pretty = text . show


-- | pretty print multiple lines of text.
pplines :: Text -> Doc
pplines = string . Text.unpack

-- | pretty print a single line of text.
ppline :: Text -> Doc
ppline = text . Text.unpack

-- | pretty print multiple lines of string.
ppstring :: String -> Doc
ppstring = string

-- | pretty print one line of string
pptext :: String -> Doc
pptext = text