{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wall #-}
module Test.QuickCheck.Classes.Ix
( ixLaws
) where
import Data.Ix (Ix(..))
import Data.Proxy (Proxy)
import Test.QuickCheck hiding ((.&.))
import Test.QuickCheck.Property (Property)
import Test.QuickCheck.Classes.Common (Laws(..))
ixLaws :: (Ix a, Arbitrary a, Show a) => Proxy a -> Laws
ixLaws p = Laws "Ix"
[ ("InRange", ixInRange p)
, ("RangeIndex", ixRangeIndex p)
, ("MapIndexRange", ixMapIndexRange p)
, ("RangeSize", ixRangeSize p)
]
ixInRange :: forall a. (Show a, Ix a, Arbitrary a) => Proxy a -> Property
ixInRange _ = property $ \(l :: a) (u :: a) (i :: a) -> (l <= u) ==> do
inRange (l,u) i == elem i (range (l,u))
ixRangeIndex :: forall a. (Show a, Ix a, Arbitrary a) => Proxy a -> Property
ixRangeIndex _ = property $ \(l :: a) (u :: a) (i :: a) -> ((l <= u) && (i >= l && i <= u)) ==> do
range (l,u) !! index (l,u) i == i
ixMapIndexRange :: forall a. (Show a, Ix a, Arbitrary a) => Proxy a -> Property
ixMapIndexRange _ = property $ \(l :: a) (u :: a) -> (l <= u) ==> do
map (index (l,u)) (range (l,u)) == [0 .. rangeSize (l,u) - 1]
ixRangeSize :: forall a. (Show a, Ix a, Arbitrary a) => Proxy a -> Property
ixRangeSize _ = property $ \(l :: a) (u :: a) -> (l <= u) ==> do
rangeSize (l,u) == length (range (l,u))