-- |
--
-- Module:      Language.Egison.Pretty.Pattern.Prim
-- Description: Primitive printers
-- Stability:   experimental
--
-- Primitive printers.
--
-- Note that all dependencies on printer library are in this module.

module Language.Egison.Pretty.Pattern.Prim
  ( Doc
  , renderDoc
  , text
  -- * Re-exports
  , module X
  )
where

-- re-exports
import           Data.Text.Prettyprint.Doc     as X
                                                ( parens
                                                , hsep
                                                , list
                                                , tupled
                                                , (<+>)
                                                )

-- main
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