{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Clif.Arbitrary
(
ascList, ascLists
, kBlade
) where
import Clif.Basis
import Clif.Internal
import Data.List (nub)
import Test.QuickCheck
instance Arbitrary a => Arbitrary (Euclidean a) where
arbitrary = E <$> arbitrary
shrink = genericShrink
instance Arbitrary a => Arbitrary (Lorentzian a) where
arbitrary = elements [T, S] <*> arbitrary
shrink = genericShrink
instance (Ord b, Arbitrary a, Arbitrary b) => Arbitrary (Clif b a) where
arbitrary = Clif <$> arbitrary
shrink = map Clif . shrink . unClif
ascList :: (Ord a, Arbitrary a) => Gen [a]
ascList = nub <$> orderedList
ascLists :: (Ord a, Arbitrary a) => Gen ([a], [a])
ascLists = do
xs <- ascList
split <- elements [0..length xs]
return $ splitAt split xs
kBlade :: (Eq a, Basis b a, Arbitrary a, Arbitrary b) => Int -> Gen (Clif b a)
kBlade k = blade <$> vector k <*> arbitrary