packages feed

data-debruijn-0.1.0.0: src-arbitrary/Data/DeBruijn/Index/Arbitrary.hs

{-# LANGUAGE DerivingStrategies #-}

module Data.DeBruijn.Index.Arbitrary (
  SomeIxRep (..),
) where

import Data.DeBruijn.Index.Fast (IxRep, snatRepToIxRep)
import Data.Type.Nat.Singleton.Fast (SNatRep)
import Test.QuickCheck.Arbitrary (Arbitrary (..))
import Test.QuickCheck.Extra (chooseSizedBoundedIntegral)
import Test.QuickCheck.Gen (Gen)
import Test.QuickCheck.Modifiers (Positive (..))

data SomeIxRep = SomeIxRep !SNatRep !IxRep
  deriving stock (Eq, Show)

instance Arbitrary SomeIxRep where
  arbitrary :: Gen SomeIxRep
  arbitrary = do
    nRep <- getPositive <$> arbitrary
    iRep <- chooseSizedBoundedIntegral (0, snatRepToIxRep (nRep - 1))
    pure $ SomeIxRep nRep iRep