open-typerep-0.1: src/Data/TypeRep/Sub.hs
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
-- | This module is only to limit the scope of the @OverlappingInstances@ flag
module Data.TypeRep.Sub where
import Data.Syntactic
import Data.TypeRep.Internal
-- | 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 SubUniverse t t
where
weakenUniverse = id
instance (SubUniverse sub sup', sup ~ (t :+: sup')) => SubUniverse sub sup
where
weakenUniverse = sugar . mapAST InjR . desugar . weakenUniverse