HList-0.3.0: examples/broken/MainHugsTTypeable.hs
{-
(C) 2004, Oleg Kiselyov, Ralf Laemmel, Keean Schupke
This is a main module for exercising a model with generic cast
and TTypeable-based type equality. This module is prepared for use
with Hugs. This model works in principle also for GHC (see module
GHCTTypeable) perhaps modulo some slight differences in test cases.
-}
import Datatypes1
import Data.HList.CommonMain
import TypeEqTTypeable
import TypeEqBoolTTypeable
import Data.HList.TypeCastGeneric1
import Data.HList.Label2
{-----------------------------------------------------------------------------}
type Animal = HCons Key
(HCons Name
(HCons Breed
(HCons Price
HNil)))
angus :: Animal
angus = HCons (Key 42)
(HCons (Name "Angus")
(HCons Cow
(HCons (Price 75.5)
HNil)))
{-
HList> hFoldr (HSeq HShow) (return () :: IO ()) angus
Key 42
Name "Angus"
Cow
Price 75.5
HList> hAppend angus angus
HCons (Key 42) (HCons (Name "Angus") (HCons Cow (HCons (Price 75.5) (HCons (Key
42) (HCons (Name "Angus") (HCons Cow (HCons (Price 75.5) HNil)))))))
-}
testHArray = (myProj1,myProj2,myProj3,myProj4)
where
myProj1 = hProjectByHNats (HCons hZero (HCons hZero HNil)) angus
myProj2 = hProjectByHNats (HCons hZero (HCons (hSucc hZero) HNil)) angus
myProj3 = hProjectAwayByHNats (HCons hZero HNil) angus
myProj4 = hSplitByHNats (HCons hZero (HCons (hSucc hZero) HNil)) angus
{-
*HArray> myProj1
HCons (Key 42) (HCons (Key 42) HNil)
*HArray> myProj2
HCons (Key 42) (HCons Cow HNil)
*HArray> myProj3
HCons (Name "Angus") (HCons Cow (HCons (Price 75.5) HNil))
*HArray> myProj4
(HCons (Key 42) (HCons (Name "Angus") HNil),HCons Cow (HCons (Price 75.5) HNil)
-}
testHOccurs = (testHOccurs1,testHOccurs2,testHOccurs3,testHOccurs4)
where
testHOccurs1 = hOccurs angus :: Breed
testHOccurs2 = hOccurs (TIP (HCons 1 HNil))
testHOccurs3 = null $ hOccurs (TIP (HCons [] HNil))
testHOccurs4 = hProject angus :: (HCons Key (HCons Name HNil))
testTypeIndexed = ( typeIdx1
, ( typeIdx2
, ( typeIdx3
, ( typeIdx4
, ( typeIdx5
, ( typeIdx6 ))))))
where
typeIdx1 = hDeleteMany (proxy::Proxy Name) angus
typeIdx2 = hExtend BSE angus
typeIdx3 = hUpdateAtType Sheep typeIdx1
typeIdx4 = hDeleteAtProxy (proxy::Proxy Breed) typeIdx2
typeIdx5 = hProjectByProxies (HCons (proxy::Proxy Breed) HNil) angus
typeIdx6 = fst $ hSplitByProxies (HCons (proxy::Proxy Breed) HNil) angus
-- Test for tuple omitted.
-- Too fragile.
myTipyCow = TIP angus
animalKey :: (HOccurs Key l, SubType l (TIP Animal)) => l -> Key
animalKey = hOccurs
testTIP = [show testTIP1, show testTIP2, show testTIP3, show testTIP4]
where
testTIP1 = hOccurs myTipyCow :: Breed
testTIP2 = hExtend BSE myTipyCow
testTIP3 = hExtend Sheep $ tipyDelete (proxy::Proxy Breed) myTipyCow
testTIP4 = tipyUpdate Sheep myTipyCow
data MyNS = MyNS -- a name space for record labels
instance Show MyNS where show _ = "myNS"
testRecords = ( test1
, ( test2
, ( test3
, ( test4
, ( test5
, ( test6
))))))
where
key = firstLabel MyNS (undefined::DKey)
name = nextLabel key (undefined::DName)
breed = nextLabel name (undefined::DBreed)
price = nextLabel breed (undefined::DPrice)
test1 = mkRecord $ HCons (newF key (42::Integer))
$ HCons (newF name "Angus")
$ HCons (newF breed Cow)
$ HNil
test2 = hLookupByLabel breed test1
test3 = hDeleteAtLabel breed test1
test4 = hUpdateAtLabel breed Sheep test1
test5 = hExtend (newF price 8.8) test1
test6 = hProjectByLabels (HCons breed (HCons price HNil)) test5
data DKey; instance Show DKey where show _ = "key"
data DName; instance Show DName where show _ = "name"
data DBreed; instance Show DBreed where show _ = "breed"
data DPrice; instance Show DPrice where show _ = "price"
{-----------------------------------------------------------------------------}
main = print $ ( testHArray
, ( testHOccurs
, ( testTypeIndexed
, ( testTIP
, ( testRecords
)))))
{-----------------------------------------------------------------------------}