{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE ScopedTypeVariables #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Test.QuickCheck.HGeometryInstances where import Control.Lens import Data.BinaryTree import Data.Ext import Data.Geometry hiding (vector) import Data.Geometry.Box import Data.Geometry.SubLine import Data.OrdSeq (OrdSeq, fromListByOrd) import Data.Proxy import Data.Semigroup import qualified Data.Seq as Seq import qualified Data.Seq2 as S2 import GHC.TypeLits import Test.QuickCheck -------------------------------------------------------------------------------- -- instance Arbitrary a => Arbitrary (NonEmpty.NonEmpty a) where -- arbitrary = NonEmpty.fromList <$> listOf1 arbitrary instance (Arbitrary a, Ord a) => Arbitrary (OrdSeq a) where arbitrary = fromListByOrd <$> arbitrary instance Arbitrary a => Arbitrary (S2.Seq2 a) where arbitrary = S2.Seq2 <$> arbitrary <*> arbitrary <*> arbitrary instance Arbitrary a => Arbitrary (BinaryTree a) where arbitrary = sized f where f n | n <= 0 = pure Nil | otherwise = do l <- choose (0,n-1) Internal <$> f l <*> arbitrary <*> f (n-l-1) instance (Arbitrary a, Arbitrary v) => Arbitrary (BinLeafTree v a) where arbitrary = sized f where f n | n <= 0 = Leaf <$> arbitrary | otherwise = do l <- choose (0,n-1) Node <$> f l <*> arbitrary <*> f (n-l-1) instance (KnownNat n, Arbitrary a) => Arbitrary (Seq.LSeq n a) where arbitrary = (\s s' -> Seq.promise . Seq.fromList $ s <> s') <$> vector (fromInteger . natVal $ (Proxy :: Proxy n)) <*> arbitrary instance (Arbitrary r, Arity d) => Arbitrary (Vector d r) where arbitrary = vectorFromListUnsafe <$> infiniteList instance (Arbitrary r, Arity d) => Arbitrary (Point d r) where arbitrary = Point <$> arbitrary instance (Arbitrary r, Arity d, Num r, Eq r) => Arbitrary (Line d r) where arbitrary = do p <- arbitrary q <- suchThat arbitrary (/= p) return $ lineThrough p q instance (Arbitrary r, Arity d, Ord r) => Arbitrary (Box d () r) where arbitrary = (\p (q :: Point d r) -> boundingBoxList' [p,q]) <$> arbitrary <*> arbitrary instance Arbitrary r => Arbitrary (EndPoint r) where arbitrary = frequency [ (1, Open <$> arbitrary) , (9, Closed <$> arbitrary) ] instance (Arbitrary r, Ord r) => Arbitrary (Range r) where arbitrary = do l <- arbitrary r <- suchThat arbitrary (p l) return $ Range l r where p (Open l) r = l < r^.unEndPoint p (Closed l) r = l <= r^.unEndPoint instance (Arbitrary c, Arbitrary e) => Arbitrary (c :+ e) where arbitrary = (:+) <$> arbitrary <*> arbitrary instance (Arbitrary r, Arbitrary p, Ord r, Ord p) => Arbitrary (Interval p r) where arbitrary = GInterval <$> arbitrary instance (Arbitrary r, Arbitrary p, Arity d, Ord r, Ord p, Num r) => Arbitrary (SubLine d p r) where arbitrary = SubLine <$> arbitrary <*> arbitrary instance (Arbitrary r, Arbitrary p, Arity d) => Arbitrary (LineSegment d p r) where arbitrary = LineSegment <$> arbitrary <*> arbitrary