module Inferno.Utils.Prettyprinter where

import Control.Monad.IO.Class (MonadIO (..))
import qualified Data.Text as Text (Text)
import qualified Data.Text.IO as Text (putStrLn)
import Prettyprinter
  ( Doc,
    LayoutOptions (LayoutOptions),
    PageWidth (AvailablePerLine),
    Pretty (..),
    layoutSmart,
  )
import Prettyprinter.Render.Text (renderStrict)

renderDoc :: Doc ann -> Text.Text
renderDoc :: forall ann. Doc ann -> Text
renderDoc = forall ann. SimpleDocStream ann -> Text
renderStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutSmart (PageWidth -> LayoutOptions
LayoutOptions (Int -> Double -> PageWidth
AvailablePerLine Int
80 Double
1))

renderPretty :: Pretty a => a -> Text.Text
renderPretty :: forall a. Pretty a => a -> Text
renderPretty = forall ann. Doc ann -> Text
renderDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty

showPretty :: MonadIO m => Pretty a => a -> m ()
showPretty :: forall (m :: * -> *) a. (MonadIO m, Pretty a) => a -> m ()
showPretty = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> IO ()
Text.putStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Pretty a => a -> Text
renderPretty