{-|
Copyright : (C) 2021, QBayLogic B.V.
License : BSD2 (see the file LICENSE)
Maintainer : QBayLogic B.V. <devops@qbaylogic.com>
Random generation of RTree.
-}
{-# OPTIONS_GHC -fplugin=GHC.TypeLits.KnownNat.Solver #-}
{-# LANGUAGE GADTs #-}
module Clash.Hedgehog.Sized.RTree
( genRTree
, genNonEmptyRTree
, SomeRTree(..)
, genSomeRTree
) where
import GHC.Natural (Natural)
import GHC.TypeNats
import Hedgehog (MonadGen, Range)
import qualified Hedgehog.Gen as Gen
import Clash.Promoted.Nat
import Clash.Sized.RTree
genRTree :: (MonadGen m, KnownNat n) => m a -> m (RTree n a)
genRTree genElem = sequenceA (trepeat genElem)
genNonEmptyRTree :: (MonadGen m, KnownNat n, 1 <= n) => m a -> m (RTree n a)
genNonEmptyRTree = genRTree
data SomeRTree atLeast a where
SomeRTree :: SNat n -> RTree (atLeast + n) a -> SomeRTree atLeast a
genSomeRTree
:: (MonadGen m, KnownNat atLeast)
=> Range Natural
-> m a
-> m (SomeRTree atLeast a)
genSomeRTree rangeElems genElem = do
numExtra <- Gen.integral rangeElems
case someNatVal numExtra of
SomeNat proxy -> SomeRTree (snatProxy proxy) <$> genRTree genElem