{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}

-- | Wrapper for Data.Typeable, plus convenience functions
module Cardano.Base.Typeable (
  module X,
  TypeName (..),
) where

import Data.String (IsString (fromString))
import Data.Typeable as X

data TypeName a where
  TypeNameString :: String -> TypeName a
  TypeName :: Typeable a => TypeName a

instance IsString (TypeName a) where
  fromString :: String -> TypeName a
fromString = String -> TypeName a
forall a. String -> TypeName a
TypeNameString

instance Show (TypeName a) where
  show :: TypeName a -> String
show = \case
    TypeNameString String
name -> String
name
    t :: TypeName a
t@(TypeName {}) -> TypeRep -> String
forall a. Show a => a -> String
show (TypeName a -> TypeRep
forall {k} (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep TypeName a
t)