{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}

{-
   The HList library

   (C) 2004, Oleg Kiselyov, Ralf Laemmel, Keean Schupke

   An implementation of a type equality predicate in terms
   of type-level type representations and their comparison.
   This approach works for GHC and Hugs.
-}

module TypeEqTTypeable where

import Data.HList.FakePrelude
import TTypeable


-- Generic implementation of the type equality predicate
instance ( TTypeable t tt
         , TTypeable t' tt'
         , HEq tt tt' b
         )
      =>   TypeEq t t' b


-- For conciseness
type Integer3 = Integer->Integer->Integer

testTTypeable :: [String]
testTTypeable
    = [
        show$ typeEq not (&&),
        show$ typeEq not not,

{-
    We got this:
     Context reduction stack overflow; size = 21
     Use -fcontext-stack20 to increase stack size to (e.g.) 20
    So we reduced the test suite a bit.

-}

--        show$ typeEq (&&) (||),
--        show$ typeEq ((+)::Integer3) ((-)::Integer3),
--        show$ typeEq ((*)::Integer3) ((*)::Integer3),
--        show$ typeEq ((*)::Integer3) not,
--        show$ typeEq True False,
        show$ typeEq (1::Integer) True,
        show$ typeEq False ((+)::Integer3),
        show$ typeEq (||) ((+)::Integer3),
        show$ typeEq (undefined::Fix Maybe) True,
        show$ typeEq (undefined::Fix Maybe) (undefined::Fix []),
        show$ typeEq (undefined::Fix Maybe) (undefined::Fix Maybe)
       ]
