{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE UndecidableInstances #-}

module JVM.Data.Pretty (showPretty, tracePrettyId, Pretty (..), (<+>), hsep) where

import Data.String
import Data.Text (unpack)
import Debug.Trace (trace)
import Prettyprinter
import Prettyprinter.Render.Text (renderStrict)

showPretty :: (IsString s) => (Pretty a) => a -> s
showPretty :: forall s a. (IsString s, Pretty a) => a -> s
showPretty = String -> s
forall a. IsString a => String -> a
fromString (String -> s) -> (a -> String) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack (Text -> String) -> (a -> Text) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SimpleDocStream (ZonkAny 0) -> Text
forall ann. SimpleDocStream ann -> Text
renderStrict (SimpleDocStream (ZonkAny 0) -> Text)
-> (a -> SimpleDocStream (ZonkAny 0)) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutOptions -> Doc (ZonkAny 0) -> SimpleDocStream (ZonkAny 0)
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutPretty LayoutOptions
defaultLayoutOptions (Doc (ZonkAny 0) -> SimpleDocStream (ZonkAny 0))
-> (a -> Doc (ZonkAny 0)) -> a -> SimpleDocStream (ZonkAny 0)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc (ZonkAny 0)
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty

instance Pretty (Doc a) where
    pretty :: forall ann. Doc a -> Doc ann
pretty = Doc a -> Doc ann
forall a ann. Doc a -> Doc ann
unAnnotate


tracePrettyId :: (Pretty a) => a -> a
tracePrettyId :: forall a. Pretty a => a -> a
tracePrettyId a
a = String -> a -> a
forall a. String -> a -> a
trace (a -> String
forall s a. (IsString s, Pretty a) => a -> s
showPretty a
a) a
a