{-# LANGUAGE UndecidableInstances #-}
module TypeLevelShow.Utils where
import GHC.TypeLits
import Singleraeh.Symbol ( sConsSymbol )
type ShowParen :: Bool -> Symbol -> Symbol
type family ShowParen b p where
ShowParen False p = p
ShowParen True p = ConsSymbol '(' p `AppendSymbol` ")"
type ShowParenIfGt :: Natural -> Natural -> Symbol -> Symbol
type ShowParenIfGt n d p = ShowParen (OrderingGT (CmpNat d n)) p
type family OrderingGT (a :: Ordering) :: Bool where
OrderingGT LT = False
OrderingGT EQ = False
OrderingGT GT = True
type ShowChar ch = ConsSymbol ch ""
sShowChar :: SChar ch -> SSymbol (ShowChar ch)
sShowChar :: forall (ch :: Char). SChar ch -> SSymbol (ShowChar ch)
sShowChar SChar ch
ch = SChar ch -> SSymbol "" -> SSymbol (ConsSymbol ch "")
forall (ch :: Char) (str :: Symbol).
SChar ch -> SSymbol str -> SSymbol (ConsSymbol ch str)
sConsSymbol SChar ch
ch SSymbol ""
forall (n :: Symbol). KnownSymbol n => SSymbol n
symbolSing
type l ++ r = AppendSymbol l r
type l > r = OrderingGT (CmpNat l r)