{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE MultiParamTypeClasses ,DeriveGeneric ,DeriveDataTypeable ,ScopedTypeVariables ,GADTs ,NoMonomorphismRestriction ,DeriveGeneric ,DefaultSignatures ,TemplateHaskell ,TypeFamilies ,FlexibleContexts ,FlexibleInstances ,EmptyDataDecls #-} {- A collection of data types used for testing. -} module Test.Data where import Control.Exception import Data.Char import Data.Int import Data.Word import Data.Typeable import Data.Data import GHC.Generics import Data.Data import qualified Test.Data2 as D2 import Data.Foldable import GHC.Exts hiding (toList) data Void deriving Generic data X = X X deriving Generic data Unit = Unit deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Un = Un {un::Bool} deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data D2 = D2 Bool N deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data D4 = D4 Bool N Unit N3 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- Enumeration data N3 = N1 | N2 | N3 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic,Enum) data N = One | Two | Three | Four | Five deriving (Eq, Ord, Read, Show, Typeable, Data, Generic, Enum) -- toForestD :: Forest a -> ForestD (Tr2 a) -- toForestD (Forest lt) = undefined -- Forest2 (ForestD (map (\t -> let Tr2 tt = treeConv t in tt) . toList $ lt)) -- toForestD (Forest lt) = undefined -- Forest2 (ForestD (map (\t -> let Tr2 tt = treeConv t in tt) . toList $ lt)) toForest2 :: Forest a -> Forest2 a toForest2 (Forest f) = Forest2 (ForestD $ fmap toTr f) toTr :: Tr a -> TrD (Forest2 a) a toTr (Tr a f) = TrD a (toForest2 f) toTr2 :: Tr a -> Tr2 a toTr2 (Tr a (Forest f)) = Tr2 (TrD a (ForestD $ fmap toTr2 f)) -- tying the recursive knot, equivalent to Forest/Tree data Forest2 a = Forest2 (ForestD (TrD (Forest2 a) a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Tr2 a = Tr2 (TrD (ForestD (Tr2 a)) a) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- First-order non mutually recursive data ForestD t = ForestD (List t) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data TrD f a = TrD a f deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- Explicit mutually recursive data Forest a = Forest (List (Tr a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Tr a = Tr a (Forest a) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Words = Words Word8 Word16 Word32 Word64 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Ints = Ints Int8 Int16 Int32 Int64 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- non-recursive data type data Various = V1 (Maybe Bool) -- | V2 Bool (Either Bool (Maybe Bool)) (N,N,N) | V2 Bool (Either Bool (Maybe Bool)) | VF Float Double Double | VW Word Word8 Word16 Word32 Word64 | VI Int Int8 Int16 Int32 Int64 | VII Integer Integer Integer deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- Phantom type data Phantom a = Phantom deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- Recursive data types data RR a b c = RN {rna::a, rnb::b ,rnc::c} | RA a (RR a a c) b | RAB a (RR c b a) b deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Expr = ValB Bool | Or Expr Expr | If Expr Expr Expr deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data List a = C a (List a) | N deriving (Eq, Ord, Read, Show, Typeable, Traversable, Data, Generic ,Generic1,Functor,Foldable) data ListS a = Nil | Cons a (ListS a) deriving (Eq, Ord, Read, Show, Typeable, Functor, Foldable, Traversable, Data, Generic ,Generic1) -- non-regular Haskell datatypes like: -- Binary instances but no Model data Nest a = NilN | ConsN (a, Nest (a, a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data TN a = LeafT a | BranchT (TN (a,a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Bush a = NilB | ConsB (a, Bush (Bush a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- Perfectly balanced binary tree data Perfect a = ZeroP a | SuccP (Perfect (Fork a)) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Fork a = Fork a a deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- non regular with higher-order kind parameters -- no Binary/Model instances data PerfectF f α = NilP | ConsP α (PerfectF f (f α)) deriving (Typeable,Generic) -- No Data data Pr f g a = Pr (f a (g a)) data Higher f a = Higher (f a) deriving (Typeable,Generic,Data) -- data Pr2 (f :: * -> *) a = Pr2 (f ) data Free f a = Pure a | Roll (f (Free f a)) deriving (Typeable,Generic) -- mutual references data A = A B | AA Int deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data B = B A | BB Char deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- recursive sets: -- Prob: ghc will just explode on this -- data MM1 = MM1 MM2 MM4 MM0 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM0 = MM0 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM2 = MM2 MM3 Bool deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM3 = MM3 MM4 Bool deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM4 = MM4 MM4 MM2 MM5 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM5 = MM5 Unit MM6 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) -- data MM6 = MM6 MM5 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data A0 = A0 B0 B0 D0 Bool | A1 (List Bool) (List Unit) (D2.List Bool) (D2.List Bool) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data B0 = B0 C0 | B1 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data C0 = C0 A0 | C1 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data D0 = D0 E0 | D1 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data E0 = E0 D0 | E1 deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Even = Zero | SuccE Odd data Odd = SuccO Even -- Existential types -- data Fold a b = forall x. Fold (x -> a -> x) x (x -> b) -- data Some :: (* -> *) -> * where -- Some :: f a -> Some f -- data Dict (c :: Constraint) where -- Dict :: c => Dict c data Direction = North | South | Center | East | West deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Stream a = Stream a (Stream a) deriving (Eq, Ord, Read, Show, Typeable, Data, Generic,Functor,Foldable,Traversable) data Tree a = Node (Tree a) (Tree a) | Leaf a deriving (Eq, Ord, Read, Show, Typeable, Data, Generic, Foldable) -- Example schema from: http://mechanical-sympathy.blogspot.co.uk/2014/05/simple-binary-encoding.html data Car = Car { serialNumber::Word64 ,modelYear::Word16 ,available::Bool ,code::CarModel ,someNumbers::[Int32] ,vehicleCode::String ,extras::[OptionalExtra] ,engine::Engine ,fuelFigures::[Consumption] ,performanceFigures :: [(OctaneRating,[Acceleration])] ,make::String ,carModel::String } deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Acceleration = Acceleration {mph::Word16,seconds::Float} deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) type OctaneRating = Word8 -- minValue="90" maxValue="110" data Consumption = Consumption {cSpeed::Word16,cMpg::Float} deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data CarModel = ModelA | ModelB | ModelC deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data OptionalExtra = SunRoof | SportsPack | CruiseControl deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) data Engine = Engine { capacity :: Word16 ,numCylinders:: Word8 ,maxRpm:: Word16 -- constant 9000 ,manufacturerCode :: String ,fuel::String -- constant Petrol } deriving (Eq, Ord, Read, Show, Typeable, Data, Generic)