-- SPDX-FileCopyrightText: 2015 Yusuke Matsushita
-- SPDX-FileCopyrightText: 2023 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-BSD3-Yusuke-Matsushita
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | This is essentially [show-type](https://hackage.haskell.org/package/show-type) adapted to work
-- with GHC 9.4. The unfortunate thing is, GHC 9.4 conflates @Type@ and @Constraint@ for the purpose
-- of instance overlap, but not instance resolution, hence we have to use an overlappable
-- kind-polymorphic "catch-all" instance instead of the more specific @Constraint@-kinded one.
--
-- See <https://gitlab.haskell.org/ghc/ghc/-/issues/23446>,
-- <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0032-constraint-vs-type.rst>,
-- <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0518-type-vs-constraint.rst>
-- for more information.
--
-- There is an argument for eventually upstreaming this, but it's small enough to bundle in-tree,
-- and time constraints on our side are pretty tight at the time of writing.
module Morley.Util.ShowType (
    -- * Showtype
    Showtype(showtype, showtypesPrec), printtype
  ) where

import Data.Foldable (foldr1)
import Prelude hiding (foldr1, show)
import Text.Show (Show(..), showParen, showString)

import Data.Typeable (typeRep)
import GHC.TypeLits (KnownSymbol, Nat, Symbol, symbolVal)

-- | Conversion of types to readable 'String's. Analogous to 'Show'.
class Showtype (a :: k) where
  {-# MINIMAL showtype | showtypesPrec #-}
  -- | Convert a type @a@ to a readable 'String'. Analogous to 'show' in 'Show'.
  showtype :: proxy a -> String
  -- | Convert a type @a@ to a readable 'String' with additional arguments. Analogous to 'showsPrec' in 'Show'.
  showtypesPrec :: Int -> proxy a -> String -> String
  showtype proxy a
p = Int -> proxy a -> [Char] -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
Int -> proxy a -> [Char] -> [Char]
forall (proxy :: k -> *). Int -> proxy a -> [Char] -> [Char]
showtypesPrec Int
0 proxy a
p [Char]
""
  showtypesPrec Int
_ proxy a
p [Char]
s = proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype proxy a
p [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
s

printtype :: Showtype a => proxy a -> IO ()
printtype :: forall {k} (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> IO ()
printtype = [Char] -> IO ()
forall a (m :: * -> *). (Print a, MonadIO m) => a -> m ()
putStrLn ([Char] -> IO ()) -> (proxy a -> [Char]) -> proxy a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype

instance Showtype False where
  showtype :: forall (proxy :: Bool -> *). proxy 'False -> [Char]
showtype proxy 'False
_ = [Char]
"False"
instance Showtype True where
  showtype :: forall (proxy :: Bool -> *). proxy 'True -> [Char]
showtype proxy 'True
_ = [Char]
"True"

instance Showtype LT where
  showtype :: forall (proxy :: Ordering -> *). proxy 'LT -> [Char]
showtype proxy 'LT
_ = [Char]
"LT"
instance Showtype EQ where
  showtype :: forall (proxy :: Ordering -> *). proxy 'EQ -> [Char]
showtype proxy 'EQ
_ = [Char]
"EQ"
instance Showtype GT where
  showtype :: forall (proxy :: Ordering -> *). proxy 'GT -> [Char]
showtype proxy 'GT
_ = [Char]
"GT"

instance KnownNat n => Showtype (n :: Nat) where
  showtype :: forall (proxy :: Nat -> *). proxy n -> [Char]
showtype = Nat -> [Char]
forall a. Show a => a -> [Char]
show (Nat -> [Char]) -> (proxy n -> Nat) -> proxy n -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. proxy n -> Nat
forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal

instance KnownSymbol s => Showtype (s :: Symbol) where
  showtype :: forall (proxy :: Symbol -> *). proxy s -> [Char]
showtype = [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> (proxy s -> [Char]) -> proxy s -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. proxy s -> [Char]
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> [Char]
symbolVal

instance Showtype Nothing where
  showtype :: forall (proxy :: Maybe a -> *). proxy 'Nothing -> [Char]
showtype proxy 'Nothing
_ = [Char]
"Nothing"
instance Showtype a => Showtype (Just a) where
  showtypesPrec :: forall (proxy :: Maybe a -> *).
Int -> proxy ('Just a) -> [Char] -> [Char]
showtypesPrec Int
p proxy ('Just a)
_ = Bool -> ([Char] -> [Char]) -> [Char] -> [Char]
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (([Char] -> [Char]) -> [Char] -> [Char])
-> ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$
    [Char] -> [Char] -> [Char]
showString [Char]
"Just " ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Int -> Proxy a -> [Char] -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
Int -> proxy a -> [Char] -> [Char]
forall (proxy :: a -> *). Int -> proxy a -> [Char] -> [Char]
showtypesPrec Int
11 (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a)

instance Showtype a => Showtype (Left a) where
  showtypesPrec :: forall (proxy :: Either a b -> *).
Int -> proxy ('Left a) -> [Char] -> [Char]
showtypesPrec Int
p proxy ('Left a)
_ = Bool -> ([Char] -> [Char]) -> [Char] -> [Char]
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (([Char] -> [Char]) -> [Char] -> [Char])
-> ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$
    [Char] -> [Char] -> [Char]
showString [Char]
"Left " ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Int -> Proxy a -> [Char] -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
Int -> proxy a -> [Char] -> [Char]
forall (proxy :: a -> *). Int -> proxy a -> [Char] -> [Char]
showtypesPrec Int
11 (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a)
instance Showtype a => Showtype (Right a) where
  showtypesPrec :: forall (proxy :: Either a b -> *).
Int -> proxy ('Right a) -> [Char] -> [Char]
showtypesPrec Int
p proxy ('Right a)
_ = Bool -> ([Char] -> [Char]) -> [Char] -> [Char]
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (([Char] -> [Char]) -> [Char] -> [Char])
-> ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$
    [Char] -> [Char] -> [Char]
showString [Char]
"Right " ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Int -> Proxy a -> [Char] -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
Int -> proxy a -> [Char] -> [Char]
forall (proxy :: b -> *). Int -> proxy a -> [Char] -> [Char]
showtypesPrec Int
11 (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a)

instance Showtype '[] where
  showtype :: forall (proxy :: [k] -> *). proxy '[] -> [Char]
showtype proxy '[]
_ = [Char]
"[]"
instance (Showtype a, Showlisttype as) => Showtype (a ': as :: [k]) where
  showtype :: forall (proxy :: [k] -> *). proxy (a : as) -> [Char]
showtype proxy (a : as)
_ = [Char]
"[" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Proxy as -> [Char]
forall k (as :: [k]). Showlisttype as => Proxy as -> [Char]
showlisttype (Proxy as
forall {k} (t :: k). Proxy t
Proxy :: Proxy as)
class Showlisttype (as :: [k]) where
  showlisttype :: Proxy as -> String
instance Showlisttype '[] where
  showlisttype :: Proxy '[] -> [Char]
showlisttype Proxy '[]
_ = [Char]
"]"
instance (Showtype a, Showlisttype as) => Showlisttype (a ': as) where
  showlisttype :: Proxy (a : as) -> [Char]
showlisttype Proxy (a : as)
_ = [Char]
"," [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Proxy as -> [Char]
forall k (as :: [k]). Showlisttype as => Proxy as -> [Char]
showlisttype (Proxy as
forall {k} (t :: k). Proxy t
Proxy :: Proxy as)

showtuple, showtuple' :: [String] -> String
showtuple :: [[Char]] -> [Char]
showtuple [[Char]]
ss = [Char]
"(" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ ([Char] -> [Char] -> [Char]) -> [[Char]] -> [Char]
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (\[Char]
s [Char]
t -> [Char]
s [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"," [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
t) [[Char]]
ss [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")"
showtuple' :: [[Char]] -> [Char]
showtuple' [[Char]]
ss = [Char]
"'" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
showtuple [[Char]]
ss

instance Showtype '() where
  showtype :: forall (proxy :: () -> *). proxy '() -> [Char]
showtype proxy '()
_ = [Char]
"'()"
instance (Showtype a, Showtype b) => Showtype '(a,b) where
  showtype :: forall (proxy :: (k, k) -> *). proxy '(a, b) -> [Char]
showtype proxy '(a, b)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b)]
instance (Showtype a, Showtype b, Showtype c) => Showtype '(a,b,c) where
  showtype :: forall (proxy :: (k, k, k) -> *). proxy '(a, b, c) -> [Char]
showtype proxy '(a, b, c)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c)]
instance (Showtype a, Showtype b, Showtype c, Showtype d) => Showtype '(a,b,c,d) where
  showtype :: forall (proxy :: (k, k, k, k) -> *). proxy '(a, b, c, d) -> [Char]
showtype proxy '(a, b, c, d)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e) => Showtype '(a,b,c,d,e) where
  showtype :: forall (proxy :: (k, k, k, k, k) -> *).
proxy '(a, b, c, d, e) -> [Char]
showtype proxy '(a, b, c, d, e)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e, Showtype f) => Showtype '(a,b,c,d,e,f) where
  showtype :: forall (proxy :: (k, k, k, k, k, k) -> *).
proxy '(a, b, c, d, e, f) -> [Char]
showtype proxy '(a, b, c, d, e, f)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e),
    Proxy f -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy f -> [Char]
showtype (Proxy f
forall {k} (t :: k). Proxy t
Proxy :: Proxy f)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e, Showtype f, Showtype g) => Showtype '(a,b,c,d,e,f,g) where
  showtype :: forall (proxy :: (k, k, k, k, k, k, k) -> *).
proxy '(a, b, c, d, e, f, g) -> [Char]
showtype proxy '(a, b, c, d, e, f, g)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e),
    Proxy f -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy f -> [Char]
showtype (Proxy f
forall {k} (t :: k). Proxy t
Proxy :: Proxy f),
    Proxy g -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy g -> [Char]
showtype (Proxy g
forall {k} (t :: k). Proxy t
Proxy :: Proxy g)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e, Showtype f, Showtype g, Showtype h) => Showtype '(a,b,c,d,e,f,g,h) where
  showtype :: forall (proxy :: (k, k, k, k, k, k, k, k) -> *).
proxy '(a, b, c, d, e, f, g, h) -> [Char]
showtype proxy '(a, b, c, d, e, f, g, h)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e),
    Proxy f -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy f -> [Char]
showtype (Proxy f
forall {k} (t :: k). Proxy t
Proxy :: Proxy f),
    Proxy g -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy g -> [Char]
showtype (Proxy g
forall {k} (t :: k). Proxy t
Proxy :: Proxy g),
    Proxy h -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy h -> [Char]
showtype (Proxy h
forall {k} (t :: k). Proxy t
Proxy :: Proxy h)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e, Showtype f, Showtype g, Showtype h, Showtype i) => Showtype '(a,b,c,d,e,f,g,h,i) where
  showtype :: forall (proxy :: (k, k, k, k, k, k, k, k, k) -> *).
proxy '(a, b, c, d, e, f, g, h, i) -> [Char]
showtype proxy '(a, b, c, d, e, f, g, h, i)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e),
    Proxy f -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy f -> [Char]
showtype (Proxy f
forall {k} (t :: k). Proxy t
Proxy :: Proxy f),
    Proxy g -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy g -> [Char]
showtype (Proxy g
forall {k} (t :: k). Proxy t
Proxy :: Proxy g),
    Proxy h -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy h -> [Char]
showtype (Proxy h
forall {k} (t :: k). Proxy t
Proxy :: Proxy h),
    Proxy i -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy i -> [Char]
showtype (Proxy i
forall {k} (t :: k). Proxy t
Proxy :: Proxy i)]
instance (Showtype a, Showtype b, Showtype c, Showtype d, Showtype e, Showtype f, Showtype g, Showtype h, Showtype i, Showtype j) => Showtype '(a,b,c,d,e,f,g,h,i,j) where
  showtype :: forall (proxy :: (k, k, k, k, k, k, k, k, k, k) -> *).
proxy '(a, b, c, d, e, f, g, h, i, j) -> [Char]
showtype proxy '(a, b, c, d, e, f, g, h, i, j)
_ = [[Char]] -> [Char]
showtuple' [
    Proxy a -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy a -> [Char]
showtype (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a),
    Proxy b -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy b -> [Char]
showtype (Proxy b
forall {k} (t :: k). Proxy t
Proxy :: Proxy b),
    Proxy c -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy c -> [Char]
showtype (Proxy c
forall {k} (t :: k). Proxy t
Proxy :: Proxy c),
    Proxy d -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy d -> [Char]
showtype (Proxy d
forall {k} (t :: k). Proxy t
Proxy :: Proxy d),
    Proxy e -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy e -> [Char]
showtype (Proxy e
forall {k} (t :: k). Proxy t
Proxy :: Proxy e),
    Proxy f -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy f -> [Char]
showtype (Proxy f
forall {k} (t :: k). Proxy t
Proxy :: Proxy f),
    Proxy g -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy g -> [Char]
showtype (Proxy g
forall {k} (t :: k). Proxy t
Proxy :: Proxy g),
    Proxy h -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy h -> [Char]
showtype (Proxy h
forall {k} (t :: k). Proxy t
Proxy :: Proxy h),
    Proxy i -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy i -> [Char]
showtype (Proxy i
forall {k} (t :: k). Proxy t
Proxy :: Proxy i),
    Proxy j -> [Char]
forall k (a :: k) (proxy :: k -> *).
Showtype a =>
proxy a -> [Char]
forall (proxy :: k -> *). proxy j -> [Char]
showtype (Proxy j
forall {k} (t :: k). Proxy t
Proxy :: Proxy j)]

showtypesPrecAuto :: Typeable a => Int -> proxy a -> String -> String
showtypesPrecAuto :: forall {k} (a :: k) (proxy :: k -> *).
Typeable a =>
Int -> proxy a -> [Char] -> [Char]
showtypesPrecAuto Int
n proxy a
p [Char]
s = Int -> TypeRep -> [Char] -> [Char]
forall a. Show a => Int -> a -> [Char] -> [Char]
showsPrec Int
n (proxy a -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep proxy a
p) [Char]
s
{-# INLINE showtypesPrecAuto #-}

instance {-# overlappable #-} Typeable a => Showtype (a :: k) where
  showtypesPrec :: forall (proxy :: k -> *). Int -> proxy a -> [Char] -> [Char]
showtypesPrec = Int -> proxy a -> [Char] -> [Char]
forall {k} (a :: k) (proxy :: k -> *).
Typeable a =>
Int -> proxy a -> [Char] -> [Char]
showtypesPrecAuto