{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.QuickCheck.Instances.These () where
import Prelude ()
import Prelude.Compat
import Test.QuickCheck
import Data.Functor.These (These1 (..))
import Data.These (These (..))
instance Arbitrary2 These where
liftArbitrary2 arbA arbB = oneof
[ This <$> arbA
, That <$> arbB
, These <$> arbA <*> arbB
]
liftShrink2 shrA _shrB (This x) = This <$> shrA x
liftShrink2 _shrA shrB (That y) = That <$> shrB y
liftShrink2 shrA shrB (These x y) =
[This x, That y] ++ [These x' y' | (x', y') <- liftShrink2 shrA shrB (x, y)]
instance (Arbitrary a) => Arbitrary1 (These a) where
liftArbitrary = liftArbitrary2 arbitrary
liftShrink = liftShrink2 shrink
instance (Arbitrary a, Arbitrary b) => Arbitrary (These a b) where
arbitrary = arbitrary1
shrink = shrink1
instance (Function a, Function b) => Function (These a b) where
function = functionMap g f
where
g (This a) = Left a
g (That b) = Right (Left b)
g (These a b) = Right (Right (a, b))
f (Left a) = This a
f (Right (Left b)) = That b
f (Right (Right (a, b))) = These a b
instance (CoArbitrary a, CoArbitrary b) => CoArbitrary (These a b)
instance (Arbitrary1 f, Arbitrary1 g) => Arbitrary1 (These1 f g) where
liftArbitrary arb = oneof
[ This1 <$> liftArbitrary arb
, That1 <$> liftArbitrary arb
, These1 <$> liftArbitrary arb <*> liftArbitrary arb
]
liftShrink shr (This1 x) = This1 <$> liftShrink shr x
liftShrink shr (That1 y) = That1 <$> liftShrink shr y
liftShrink shr (These1 x y) =
[ This1 x, That1 y ] ++
[ These1 x' y'
| (x', y') <- liftShrink2 (liftShrink shr) (liftShrink shr) (x, y)
]
instance (Arbitrary1 f, Arbitrary1 g, Arbitrary a) => Arbitrary (These1 f g a) where
arbitrary = arbitrary1
shrink = shrink1