{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeSynonymInstances #-} module Render.Class ( Render (..), -- RenderTCM (..), renderM, renderP, renderA, renderATop, ) where import Agda.Syntax.Fixity (Precedence (TopCtx)) import qualified Agda.Syntax.Translation.AbstractToConcrete as A import qualified Agda.TypeChecking.Monad.Base as A import Agda.Utils.List1 (List1) import Agda.Utils.List2 (List2) import Agda.Utils.Pretty (Doc) import qualified Agda.Utils.Pretty as Doc import Data.Int (Int32) import GHC.Exts ( IsList(toList) ) import Render.RichText -------------------------------------------------------------------------------- -- | Typeclass for rendering Inlines class Render a where render :: a -> Inlines renderPrec :: Int -> a -> Inlines render = renderPrec 0 renderPrec = const render -- | Rendering undersome context -- class RenderTCM a where -- renderTCM :: a -> Agda.TCM Inlines -- | Simply "pure . render" renderM :: (Applicative m, Render a) => a -> m Inlines renderM = pure . render -- | Render instances of Pretty renderP :: (Applicative m, Doc.Pretty a) => a -> m Inlines renderP = pure . text . Doc.render . Doc.pretty -- | like 'prettyA' renderA :: (Render c, A.ToConcrete a, A.ConOfAbs a ~ c) => a -> A.TCM Inlines renderA x = render <$> A.abstractToConcrete_ x -- | like 'prettyATop' renderATop :: (Render c, A.ToConcrete a, A.ConOfAbs a ~ c) => a -> A.TCM Inlines renderATop x = render <$> A.abstractToConcreteCtx TopCtx x -------------------------------------------------------------------------------- -- | Other instances of Render instance Render Int where render = text . show instance Render Int32 where render = text . show instance Render Integer where render = text . show instance Render Bool where render = text . show instance Render Doc where render = text . Doc.render instance Render a => Render [a] where render xs = "[" <> fsep (punctuate "," (fmap render xs)) <> "]" instance Render a => Render (List1 a) where render = render . toList instance Render a => Render (List2 a) where render = render . toList