module Data.GenValidity.Tree where
import Data.GenValidity
import Test.QuickCheck
import Data.Tree
instance GenValidity a => GenValidity (Tree a) where
genUnchecked = genTreeOf genUnchecked
genValid = genTreeOf genValid
-- | There should be at least one invalid element, either it's here or it's
-- further down the tree.
genInvalid = oneof
[ Node <$> genInvalid <*> genUnchecked
, Node <$> genUnchecked <*> genInvalid
]
-- | Generate a tree of values that are generated as specified.
--
-- This takes the size parameter much better into account
genTreeOf :: Gen a -> Gen (Tree a)
genTreeOf func = sized $ \n -> -- Sized is the size of the trees.
case n of
0 -> Node <$> func <*> pure []
1 -> Node <$> func <*> pure []
m -> do
value <- func
forest <- resize (m - 1) $ genListOf $ genTreeOf func
return $ Node value forest