{-# LANGUAGE AllowAmbiguousTypes #-}

module Prologue.Text.Show.Styled where

import Prelude

import Data.Text (Text)



-------------------
-- === Class === --
-------------------

-- === Definition === --

type family StyledShowOutput style

class StyledShow  style a where 
    styledShow :: style -> a -> StyledShowOutput style

class StyledShow1 style a where
    styledShow1 ::  t1. style -> a t1 -> StyledShowOutput style

class StyledShow2 style a where
    styledShow2 ::  t1 t2. style -> a t1 t2 -> StyledShowOutput style


-- === Redirect instances === --

instance {-# OVERLAPPABLE #-} StyledShow1 style a 
    => StyledShow style (a t) where
    styledShow = styledShow1 ; {-# INLINE styledShow #-}

instance {-# OVERLAPPABLE #-} StyledShow2 style a 
    => StyledShow1 style (a t) where
    styledShow1 = styledShow2 ; {-# INLINE styledShow1 #-}



--------------------
-- === Styles === --
--------------------

-- === Pretty === --

data Pretty = Pretty deriving (Show)
type PrettyShow  = StyledShow  Pretty
type PrettyShow1 = StyledShow1 Pretty
type instance StyledShowOutput Pretty = Text

prettyShow  :: PrettyShow  a => a    -> Text
prettyShow1 :: PrettyShow1 a => a t1 -> Text
prettyShow  = styledShow  Pretty ; {-# INLINE prettyShow  #-}
prettyShow1 = styledShow1 Pretty ; {-# INLINE prettyShow1 #-}