{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances #-}

#ifndef MIN_VERSION_GLASGOW_HASKELL
#define MIN_VERSION_GLASGOW_HASKELL(a,b,c,d) 0
#endif
  -- MIN_VERSION_GLASGOW_HASKELL was introduced in GHC 7.10

#if MIN_VERSION_GLASGOW_HASKELL(7,10,0,0)
#else
{-# LANGUAGE OverlappingInstances #-}
#endif

-- | This module is only to limit the scope of the @OverlappingInstances@ flag

module Data.TypeRep.Sub where

-- TODO Merge this module with `Data.TypeRep.Representation` when support for < 7.10 is dropped



import Language.Syntactic

import Data.TypeRep.Representation



-- | Sub-universe relation
--
-- In general, a universe @t@ is a sub-universe of @u@ if @u@ has the form
--
-- > t1 :+: t2 :+: ... :+: t
class SubUniverse sub sup
  where
    -- | Cast a type representation to a larger universe
    weakenUniverse :: TypeRep sub a -> TypeRep sup a


instance {-# OVERLAPPING #-} SubUniverse t t
  where
    weakenUniverse = id

instance {-# OVERLAPPING #-} (SubUniverse sub sup', sup ~ (t :+: sup')) => SubUniverse sub sup
  where
    weakenUniverse = sugar . mapAST InjR . desugar . weakenUniverse