module CLaSH.QuickCheck.Instances.BitVector () where

import           Prelude ()

import           Data.Bits
import           Data.Traversable

import qualified Test.QuickCheck
import           Test.QuickCheck

import           CLaSH.Prelude hiding (sequence, lift)
import           CLaSH.Sized.Vector
import           CLaSH.Promoted.Nat

import qualified CLaSH.Sized.Vector as V


iso1 :: Bool -> Bit
iso1 = \case False -> 0
             True  -> 1

iso2 :: Bit -> Bool
iso2 = \case 0 -> False
             _ -> True

instance KnownNat n => Arbitrary (BitVector n) where
  arbitrary = fmap pack $ sequence $ V.repeat $ iso1 <$> arbitrary
  shrink v  = fmap pack x
    where x :: [Vec n Bit]
          x = (fmap . fmap) iso1 $ sequence $ shrink <$> iso2 <$> unpack v