{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module MutualRecData where import Test.SmartCheck import Test.QuickCheck hiding (Result) import Data.Tree import Control.Monad.State import Data.Typeable import GHC.Generics -------------------------------------------------------------------------------- data M = M N N Int | P deriving (Typeable, Show, Eq, Read, Generic) instance SubTypes M data N = N M Int String deriving (Typeable, Show, Eq, Read, Generic) instance SubTypes N -------------------------------------------------------------------------------- instance Arbitrary M where arbitrary = sized $ \n -> if n == 0 then return P else oneof [ return P , liftM3 M (resize (n-1) arbitrary) (resize (n-1) arbitrary) arbitrary ] instance Arbitrary N where arbitrary = liftM3 N arbitrary arbitrary arbitrary -------------------------------------------------------------------------------- prop0 :: M -> Bool prop0 (M _ _ a) = a < 100 prop0 _ = True mutRecTest :: IO () mutRecTest = smartCheck args prop0 where args = scStdArgs { qcArgs = stdArgs {maxSuccess = 1000} } -------------------------------------------------------------------------------- xx :: M xx = M (N (M (N P 1 "goo") (N P 7 "foo") 8) 3 "hi") (N P 4 "bye") 6 yy :: Forest Int yy = [Node 0 [Node 1 [], Node 2 []], Node 3 [Node 4 [], Node 5 [Node 6 []]]] --------------------------------------------------------------------------------