module CLaSH.QuickCheck.Instances.Vec () where

import           Prelude ()

import           Data.Traversable

import           Control.Applicative

import qualified Test.QuickCheck
import           Test.QuickCheck hiding ((.&.))

import           Unsafe.Coerce (unsafeCoerce)

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


instance (KnownNat n, Arbitrary a) => Arbitrary (Vec n a) where
  arbitrary = sequence $ repeat arbitrary
  shrink x  = sequence $ shrink <$> x

instance (Ord a) => Ord (Vec n a) where
  compare x y = foldr f EQ $ zipWith compare x y
    where f EQ   keepGoing = keepGoing
          f done _         = done