module Cardano.CLI.Pretty
  ( putLn
  , hPutLn
  -- Re-exported functions from Cardano.Api related to pretty-printing
  , black
  , blue
  , cyan
  , docToLazyText
  , docToString
  , docToText
  , green
  , magenta
  , prettyException
  , pshow
  , red
  , white
  , yellow
  , (<+>)
  , hsep
  , vsep
  , MonadIO (..)
  , Ann
  , ShowOf (..)
  , Doc
  , Pretty (..)
  )
where

import           Cardano.Api (Ann, Doc, MonadIO (..), Pretty (..), ShowOf (..), black, blue, cyan,
                   docToLazyText, docToString, docToText, green, hsep, magenta, prettyException,
                   pshow, red, vsep, white, yellow, (<+>))

import qualified Control.Concurrent.QSem as IO
import           Control.Exception (bracket_)
import qualified Data.Text.Lazy.IO as TextLazy
import           Prettyprinter.Render.Terminal
import qualified System.IO as IO
import qualified System.IO.Unsafe as IO

sem :: IO.QSem
sem :: QSem
sem = IO QSem -> QSem
forall a. IO a -> a
IO.unsafePerformIO (IO QSem -> QSem) -> IO QSem -> QSem
forall a b. (a -> b) -> a -> b
$ Int -> IO QSem
IO.newQSem Int
1
{-# NOINLINE sem #-}

consoleBracket :: IO a -> IO a
consoleBracket :: forall a. IO a -> IO a
consoleBracket = IO () -> IO () -> IO a -> IO a
forall a b c. IO a -> IO b -> IO c -> IO c
bracket_ (QSem -> IO ()
IO.waitQSem QSem
sem) (QSem -> IO ()
IO.signalQSem QSem
sem)

putLn :: MonadIO m => Doc AnsiStyle -> m ()
putLn :: forall (m :: * -> *). MonadIO m => Doc AnsiStyle -> m ()
putLn = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> IO ()
forall a. IO a -> IO a
consoleBracket (IO () -> IO ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> IO ()
TextLazy.putStrLn (Text -> IO ())
-> (Doc AnsiStyle -> Text) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Text
docToLazyText

hPutLn :: MonadIO m => IO.Handle -> Doc AnsiStyle -> m ()
hPutLn :: forall (m :: * -> *). MonadIO m => Handle -> Doc AnsiStyle -> m ()
hPutLn Handle
h = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> IO ()
forall a. IO a -> IO a
consoleBracket (IO () -> IO ())
-> (Doc AnsiStyle -> IO ()) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> Text -> IO ()
TextLazy.hPutStr Handle
h (Text -> IO ())
-> (Doc AnsiStyle -> Text) -> Doc AnsiStyle -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Text
docToLazyText