flat-0.6: test/Test/Data.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-
A collection of data types used for testing.
-}
module Test.Data where
import Data.Data
import Data.Int
import Data.Word
import GHC.Generics
import qualified Test.Data2 as D2
-- import Test.Tasty.QuickCheck
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, Bounded)
-- 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)