{-# OPTIONS_GHC -Wno-orphans #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE StandaloneDeriving #-} module ArbitraryOrphans () where import Test.QuickCheck (Arbitrary (..), arbitraryBoundedEnum, elements, frequency, oneof) import Test.QuickCheck.Gen (Gen (MkGen)) import Test.QuickCheck.Instances () import Test.QuickCheck.Random (mkQCGen) import CRDT.Cm.Counter (Counter (..)) import CRDT.Cm.GSet (GSet (..)) import qualified CRDT.Cm.ORSet as CmORSet import qualified CRDT.Cm.RGA as CmRGA import qualified CRDT.Cm.TwoPSet as CmTwoPSet import CRDT.Cv.GCounter (GCounter (..)) import CRDT.Cv.LwwElementSet (LwwElementSet (..)) import qualified CRDT.Cv.ORSet as CvORSet import CRDT.Cv.PNCounter (PNCounter (..)) import qualified CRDT.Cv.RGA as CvRGA import qualified CRDT.Cv.TwoPSet as CvTwoPSet import CRDT.LamportClock (LamportTime (..), Pid (..)) import CRDT.LWW (LWW (..)) import Data.MultiMap (MultiMap (..)) import Util (pattern (:-)) instance Arbitrary (Counter a) where arbitrary = arbitraryBoundedEnum instance Arbitrary a => Arbitrary (LWW a) where arbitrary = do time <- arbitrary value <- seeded (hash time) arbitrary pure LWW{value, time} where hash (LamportTime t (Pid p)) = fromIntegral t * 997 + fromIntegral p deriving instance Arbitrary a => Arbitrary (GSet a) deriving instance (Arbitrary k, Ord k, Arbitrary v, Ord v) => Arbitrary (MultiMap k v) instance Arbitrary a => Arbitrary (CmORSet.Intent a) where arbitrary = elements [CmORSet.Add, CmORSet.Remove] <*> arbitrary instance Arbitrary a => Arbitrary (CmORSet.ORSet a) where arbitrary = oneof [ CmORSet.OpAdd <$> arbitrary <*> arbitrary , CmORSet.OpRemove <$> arbitrary <*> arbitrary ] instance (Arbitrary a, Ord a) => Arbitrary (CmORSet.Payload a) where arbitrary = CmORSet.Payload <$> arbitrary <*> arbitrary instance Arbitrary CmORSet.Tag where arbitrary = CmORSet.Tag <$> arbitrary <*> arbitrary instance Arbitrary a => Arbitrary (CmRGA.RGA a) where arbitrary = oneof [ CmRGA.OpAddAfter <$> arbitrary <*> arbitrary <*> arbitrary , CmRGA.OpRemove <$> arbitrary ] instance Arbitrary a => Arbitrary (CmRGA.RgaIntent a) where arbitrary = frequency [ 10 :- CmRGA.AddAfter <$> arbitrary <*> arbitrary , 1 :- CmRGA.Remove <$> arbitrary ] instance (Arbitrary a, Ord a) => Arbitrary (CmRGA.RgaPayload a) where arbitrary = CmRGA.load <$> arbitrary instance Arbitrary a => Arbitrary (CmTwoPSet.TwoPSet a) where arbitrary = elements [CmTwoPSet.Add, CmTwoPSet.Remove] <*> arbitrary deriving instance Arbitrary a => Arbitrary (GCounter a) deriving instance (Arbitrary a, Ord a) => Arbitrary (CvORSet.ORSet a) deriving instance (Arbitrary a, Ord a) => Arbitrary (LwwElementSet a) instance Arbitrary a => Arbitrary (PNCounter a) where arbitrary = PNCounter <$> arbitrary <*> arbitrary deriving instance Arbitrary a => Arbitrary (CvRGA.RGA a) deriving instance (Ord a, Arbitrary a) => Arbitrary (CvTwoPSet.TwoPSet a) instance Arbitrary LamportTime where arbitrary = LamportTime <$> arbitrary <*> arbitrary deriving instance Arbitrary Pid -- | Generate deterministically seeded :: Int -> Gen a -> Gen a seeded s (MkGen g) = MkGen $ \_ n -> g (mkQCGen s) n