data-type-0.1.0: Data/Type/Test/Bool.hs
{-# LANGUAGE UndecidableInstances, OverlappingInstances, FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables, EmptyDataDecls, MultiParamTypeClasses #-}
{- LANGUAGE TypeOperators -}
{- Enable the above to compile with GHC >= 6.8 -}
{- 6.6 fails to even parse it -}
--
-- .$Header: c:/Source/Haskell/Type/Data/Type/Test/RCS/Bool.hs,v 1.2 2011/09/21 00:44:01 dosuser Exp dosuser $
module Data.Type.Test.Bool where
import Data.Type.Apply
import Data.Type.Bool
import Data.Type.Eq
import Data.Type.TList
t9 :: TTrue
t9 = tNot tFalse
t10 :: TFalse
t10 = tNot tTrue
data Test a
vtt :: Test TTrue
vtt = undefined
vtf :: Test TFalse
vtf = undefined
t11 :: TFalse
t11 = tNot vtt
t12 :: TTrue
t12 = tNot vtf
t1 :: TFalse
t1 = tAnd tFalse tFalse
t2 :: TFalse
t2 = tAnd tFalse tTrue
t3 :: TFalse
t3 = tAnd tTrue tFalse
t4 :: TTrue
t4 = tAnd tTrue tTrue
t13 :: TFalse
t13 = tAnd vtf vtf
t14 :: TFalse
t14 = tAnd vtf vtt
t15 :: TFalse
t15 = tAnd vtt vtf
t16 :: TTrue
t16 = tAnd vtt vtt
t5 :: TFalse
t5 = tOr tFalse tFalse
t6 :: TTrue
t6 = tOr tFalse tTrue
t7 :: TTrue
t7 = tOr tTrue tFalse
t8 :: TTrue
t8 = tOr tTrue tTrue
t17 :: TFalse
t17 = tOr vtf vtf
t18 :: TTrue
t18 = tOr vtf vtt
t19 :: TTrue
t19 = tOr vtt vtf
t20 :: TTrue
t20 = tOr vtt vtt
data Test2 a b
vt2ff :: Test2 TFalse TFalse
vt2ff = undefined
{-
t21 :: TTrue
t21 = cNot vt2ff
-}
data F = F
data C = C
data X = X
data Member s
member :: Member s
member = undefined
mNil :: Member TNil
mNil = member
mUnit :: a -> Member a
mUnit _ = member
mCons :: Member a -> Member b -> Member (a :*: b)
mCons _ _ = member
infixr 5 `mCons`
instance Apply (Member TNil) a TFalse
instance (TypeEq h a b1, Apply (Member t) a b2, TOr b1 b2 b) =>
Apply (Member (h :*: t)) a b
class TypeClassify s t where
typeClassify :: s -> t -> Bool
instance forall t a b. (Apply (Member t) a b, AsBool b) =>
TypeClassify (Member t) a
where
typeClassify _ _ = asBool (undefined :: b)
class AsBool b where
asBool :: b -> Bool
instance AsBool TTrue where
asBool _ = True
instance AsBool TFalse where
asBool _ = False
t22 :: TFalse
t22 = apply mNil F
t23 :: TTrue
t23 = apply (mUnit F `mCons` mNil) F
t24 :: TFalse
t24 = apply (mUnit F `mCons` mNil) C
t25 :: TFalse
t25 = apply (mUnit F `mCons` mUnit C `mCons` mNil) X
t26 :: TTrue
t26 = apply (mUnit F `mCons` mUnit C `mCons` mNil) F
t27 :: TTrue
t27 = apply (mUnit F `mCons` mUnit C `mCons` mNil) C
data Member' s
member' :: Member' s
member' = undefined
mNil' :: Member' TNil
mNil' = member'
mUnit' :: a -> Member' a
mUnit' _ = member'
mCons' :: Member' a -> Member' b -> Member' (a :*: b)
mCons' _ _ = member'
infixr 5 `mCons'`
instance Apply (Member' TNil) a TFalse
instance TypeEq s a b => Apply (Member' s) a b
-- instance TOr (TypeEq h a b1) (Apply (Member' t) a b2) b =>
instance (TypeEq h a b1, Apply (Member' t) a b2, TOr b1 b2 b) =>
Apply (Member' (h :*: t)) a b
t28 :: TFalse
t28 = apply mNil' F
t29 :: TTrue
t29 = apply (mUnit' F `mCons'` mNil') F
t30 :: TFalse
t30 = apply (mUnit' F `mCons'` mNil') C
t31 :: TFalse
t31 = apply (mUnit' F `mCons'` mUnit' C `mCons'` mNil') X
t32 :: TTrue
t32 = apply (mUnit' F `mCons'` mUnit' C `mCons'` mNil') F
t33 :: TTrue
t33 = apply (mUnit' F `mCons'` mUnit' C `mCons'` mNil') C
t34 :: TFalse
t34 = apply (mUnit' F) X
t35 :: TTrue
t35 = apply (mUnit' F) F
-- vim: expandtab:tabstop=4:shiftwidth=4