module Main.Gens where import Prelude hiding (choose, index) import Test.QuickCheck.Gen import Focus (Focus(..)) import Main.Transaction (Transaction) import Data.Primitive import qualified Main.Transaction as Transaction import qualified PrimitiveExtras.By6Bits as By6Bits element :: Gen Int element = choose (0, 999) index :: Gen Int index = choose (0, 9) lookupTransaction :: (Show element, Eq element) => Gen (Transaction element) lookupTransaction = Transaction.lookup <$> index setTransaction :: Gen (Transaction Int) setTransaction = Transaction.set <$> index <*> element focusInsertTransaction :: Gen (Transaction Int) focusInsertTransaction = Transaction.focusInsert <$> index <*> element focusDeleteTransaction :: Gen (Transaction Int) focusDeleteTransaction = Transaction.focusDelete <$> index unsetTransaction :: Gen (Transaction element) unsetTransaction = Transaction.unset <$> index unfoldlTransaction :: (Show element, Eq element) => Gen (Transaction element) unfoldlTransaction = pure Transaction.elementsUnfoldl transaction :: Gen (Transaction Int) transaction = frequency [ (9, lookupTransaction), (9, setTransaction), (9, unsetTransaction), (9, focusInsertTransaction), (9, focusDeleteTransaction) ] maybeList :: Gen [Maybe Int] maybeList = replicateM (finiteBitSize (undefined :: Int)) $ frequency $ [ (4, fmap Just element), (1, pure Nothing) ] sparseSmallArray :: Gen (By6Bits.By6Bits Int) sparseSmallArray = By6Bits.maybeList <$> maybeList primArray :: Prim a => Gen a -> Gen (PrimArray a) primArray aGen = do list <- listOf aGen return (primArrayFromList list)