module Language.Egison.Pretty.Pattern.Prim
( Doc
, renderDoc
, text
, module X
)
where
import Data.Text.Prettyprint.Doc as X
( parens
, hsep
, list
, tupled
, (<+>)
)
import Data.Void ( Void )
import Data.Text ( Text )
import qualified Data.Text.Prettyprint.Doc as PP
( Doc
, PageWidth(..)
, LayoutOptions(..)
, pretty
, layoutPretty
)
import qualified Data.Text.Prettyprint.Doc.Render.Text
as PP
( renderStrict )
import Language.Egison.Pretty.Pattern.PrintMode
( PrintMode(..)
, PageMode(..)
)
type Doc = PP.Doc Void
text :: Text -> Doc
text :: Text -> Doc
text = Text -> Doc
forall a ann. Pretty a => a -> Doc ann
PP.pretty
renderDoc :: PrintMode n v e -> Doc -> Text
renderDoc :: PrintMode n v e -> Doc -> Text
renderDoc PrintMode { Maybe PageMode
$sel:pageMode:PrintMode :: forall n v e. PrintMode n v e -> Maybe PageMode
pageMode :: Maybe PageMode
pageMode } Doc
doc = SimpleDocStream Void -> Text
forall ann. SimpleDocStream ann -> Text
PP.renderStrict SimpleDocStream Void
stream
where
stream :: SimpleDocStream Void
stream = LayoutOptions -> Doc -> SimpleDocStream Void
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
PP.layoutPretty LayoutOptions
layoutOptions Doc
doc
layoutOptions :: LayoutOptions
layoutOptions = LayoutOptions :: PageWidth -> LayoutOptions
PP.LayoutOptions { PageWidth
layoutPageWidth :: PageWidth
layoutPageWidth :: PageWidth
PP.layoutPageWidth }
layoutPageWidth :: PageWidth
layoutPageWidth = case Maybe PageMode
pageMode of
Just PageMode { Int
$sel:lineLength:PageMode :: PageMode -> Int
lineLength :: Int
lineLength, Double
$sel:ribbonsPerLine:PageMode :: PageMode -> Double
ribbonsPerLine :: Double
ribbonsPerLine } ->
Int -> Double -> PageWidth
PP.AvailablePerLine Int
lineLength Double
ribbonsPerLine
Maybe PageMode
Nothing -> PageWidth
PP.Unbounded