HList-0.5.4.0: Data/HList/TypeEqO.hs
{-# LANGUAGE CPP #-}
#if (__GLASGOW_HASKELL__ < 709)
{-# LANGUAGE OverlappingInstances #-}
{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
#endif
{- |
The HList library
(C) 2004, Oleg Kiselyov, Ralf Laemmel, Keean Schupke
Generic type equality predicate:
The implementation based on overlapping instances
The only place where overlapping instances are really used
besides Label5
-}
module Data.HList.TypeEqO where
import Data.HList.FakePrelude
#if !NEW_TYPE_EQ
instance {-# OVERLAPPING #-} HEq x x True
instance {-# OVERLAPPABLE #-} False ~ b => HEq x y b
-- instance TypeEq x y HFalse -- would violate functional dependency
#endif
class TupleType (t :: *) (b :: Bool) | t -> b
instance {-# OVERLAPPING #-} TupleType () True
instance {-# OVERLAPPING #-} TupleType (x,y) True
instance {-# OVERLAPPING #-} TupleType (x,y,z) True
-- Continue for a while
instance {-# OVERLAPPABLE #-} False ~ b => TupleType x b
-- instance TupleType x HFalse -- would violate functional dependency
-- overlaps an instance Show (Proxy t) for convenience
instance {-# OVERLAPPING #-} Show (Proxy True) where show _ = "HTrue"
instance {-# OVERLAPPING #-} Show (Proxy False) where show _ = "HFalse"
instance {-# OVERLAPPING #-} HNat2Integral n => Show (Proxy (n :: HNat)) where
show n = "H" ++ show (hNat2Integral n :: Integer)
instance {-# OVERLAPPABLE #-} hZero ~ HZero => ArityFwd f hZero
instance {-# OVERLAPPING #-} Arity f n => ArityFwd (x -> f) (HSucc n)
-- | All our keywords must be registered
class IsKeyFN (t :: *) (flag :: Bool) | t-> flag
-- | overlapping/fallback case
instance {-# OVERLAPPABLE #-} (False ~ flag) => IsKeyFN t flag