    {-# LANGUAGE CPP #-}
    {-# OPTIONS_GHC -fno-warn-orphans #-}
    module Test.QuickCheck.Instances.Semigroup () where

    import Prelude ()
    import Test.QuickCheck.Instances.CustomPrelude

    import Control.Applicative (liftA2)
    import Data.List.NonEmpty  (NonEmpty (..), nonEmpty)
    import Data.Maybe          (mapMaybe)

    import Test.QuickCheck

    import qualified Data.Semigroup as Semi

    -------------------------------------------------------------------------------
    -- semigroups
    -------------------------------------------------------------------------------

    instance Arbitrary1 NonEmpty where
      liftArbitrary :: forall a. Gen a -> Gen (NonEmpty a)
    liftArbitrary Gen a
    arb = (a -> [a] -> NonEmpty a) -> Gen a -> Gen [a] -> Gen (NonEmpty a)
    forall a b c. (a -> b -> c) -> Gen a -> Gen b -> Gen c
    forall (f :: * -> *) a b c.
    Applicative f =>
    (a -> b -> c) -> f a -> f b -> f c
    liftA2 a -> [a] -> NonEmpty a
    forall a. a -> [a] -> NonEmpty a
    (:|) Gen a
    arb (Gen a -> Gen [a]
    forall a. Gen a -> Gen [a]
    forall (f :: * -> *) a. Arbitrary1 f => Gen a -> Gen (f a)
    liftArbitrary Gen a
    arb)
      liftShrink :: forall a. (a -> [a]) -> NonEmpty a -> [NonEmpty a]
    liftShrink a -> [a]
    shr (a
    x :| [a]
    xs) = ([a] -> Maybe (NonEmpty a)) -> [[a]] -> [NonEmpty a]
    forall a b. (a -> Maybe b) -> [a] -> [b]
    mapMaybe [a] -> Maybe (NonEmpty a)
    forall a. [a] -> Maybe (NonEmpty a)
    nonEmpty ([[a]] -> [NonEmpty a]) -> ([a] -> [[a]]) -> [a] -> [NonEmpty a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (a -> [a]) -> [a] -> [[a]]
    forall a. (a -> [a]) -> [a] -> [[a]]
    forall (f :: * -> *) a. Arbitrary1 f => (a -> [a]) -> f a -> [f a]
    liftShrink a -> [a]
    shr ([a] -> [NonEmpty a]) -> [a] -> [NonEmpty a]
    forall a b. (a -> b) -> a -> b
    $ a
    x a -> [a] -> [a]
    forall a. a -> [a] -> [a]
    : [a]
    xs

    instance Arbitrary a => Arbitrary (NonEmpty a) where
      arbitrary :: Gen (NonEmpty a)
    arbitrary = Gen (NonEmpty a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
      shrink :: NonEmpty a -> [NonEmpty a]
    shrink = NonEmpty a -> [NonEmpty a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (NonEmpty a) where
      coarbitrary :: forall b. NonEmpty a -> Gen b -> Gen b
    coarbitrary (a
    x :| [a]
    xs) = (a, [a]) -> Gen b -> Gen b
    forall b. (a, [a]) -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a
    x, [a]
    xs)

    instance Function a => Function (NonEmpty a) where
      function :: forall b. (NonEmpty a -> b) -> NonEmpty a :-> b
    function = (NonEmpty a -> (a, [a]))
    -> ((a, [a]) -> NonEmpty a)
    -> (NonEmpty a -> b)
    -> NonEmpty a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap NonEmpty a -> (a, [a])
    forall {a}. NonEmpty a -> (a, [a])
    g (a, [a]) -> NonEmpty a
    forall {a}. (a, [a]) -> NonEmpty a
    h
       where
         g :: NonEmpty a -> (a, [a])
    g (a
    x :| [a]
    xs) = (a
    x,   [a]
    xs)
         h :: (a, [a]) -> NonEmpty a
    h (a
    x,   [a]
    xs) =  a
    x a -> [a] -> NonEmpty a
    forall a. a -> [a] -> NonEmpty a
    :| [a]
    xs

    instance Arbitrary1 Semi.Min where
        liftArbitrary :: forall a. Gen a -> Gen (Min a)
    liftArbitrary Gen a
    arb = a -> Min a
    forall a. a -> Min a
    Semi.Min (a -> Min a) -> Gen a -> Gen (Min a)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Gen a
    arb
        liftShrink :: forall a. (a -> [a]) -> Min a -> [Min a]
    liftShrink a -> [a]
    shr = (a -> Min a) -> [a] -> [Min a]
    forall a b. (a -> b) -> [a] -> [b]
    map a -> Min a
    forall a. a -> Min a
    Semi.Min ([a] -> [Min a]) -> (Min a -> [a]) -> Min a -> [Min a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> [a]
    shr (a -> [a]) -> (Min a -> a) -> Min a -> [a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Min a -> a
    forall a. Min a -> a
    Semi.getMin

    instance Arbitrary a => Arbitrary (Semi.Min a) where
        arbitrary :: Gen (Min a)
    arbitrary = Gen (Min a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
        shrink :: Min a -> [Min a]
    shrink = Min a -> [Min a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (Semi.Min a) where
        coarbitrary :: forall b. Min a -> Gen b -> Gen b
    coarbitrary = a -> Gen b -> Gen b
    forall b. a -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a -> Gen b -> Gen b) -> (Min a -> a) -> Min a -> Gen b -> Gen b
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Min a -> a
    forall a. Min a -> a
    Semi.getMin

    instance Function a => Function (Semi.Min a) where
        function :: forall b. (Min a -> b) -> Min a :-> b
    function = (Min a -> a) -> (a -> Min a) -> (Min a -> b) -> Min a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap Min a -> a
    forall a. Min a -> a
    Semi.getMin a -> Min a
    forall a. a -> Min a
    Semi.Min

    instance Arbitrary1 Semi.Max where
        liftArbitrary :: forall a. Gen a -> Gen (Max a)
    liftArbitrary Gen a
    arb = a -> Max a
    forall a. a -> Max a
    Semi.Max (a -> Max a) -> Gen a -> Gen (Max a)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Gen a
    arb
        liftShrink :: forall a. (a -> [a]) -> Max a -> [Max a]
    liftShrink a -> [a]
    shr = (a -> Max a) -> [a] -> [Max a]
    forall a b. (a -> b) -> [a] -> [b]
    map a -> Max a
    forall a. a -> Max a
    Semi.Max ([a] -> [Max a]) -> (Max a -> [a]) -> Max a -> [Max a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> [a]
    shr (a -> [a]) -> (Max a -> a) -> Max a -> [a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Max a -> a
    forall a. Max a -> a
    Semi.getMax

    instance Arbitrary a => Arbitrary (Semi.Max a) where
        arbitrary :: Gen (Max a)
    arbitrary = Gen (Max a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
        shrink :: Max a -> [Max a]
    shrink = Max a -> [Max a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (Semi.Max a) where
        coarbitrary :: forall b. Max a -> Gen b -> Gen b
    coarbitrary = a -> Gen b -> Gen b
    forall b. a -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a -> Gen b -> Gen b) -> (Max a -> a) -> Max a -> Gen b -> Gen b
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Max a -> a
    forall a. Max a -> a
    Semi.getMax

    instance Function a => Function (Semi.Max a) where
        function :: forall b. (Max a -> b) -> Max a :-> b
    function = (Max a -> a) -> (a -> Max a) -> (Max a -> b) -> Max a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap Max a -> a
    forall a. Max a -> a
    Semi.getMax a -> Max a
    forall a. a -> Max a
    Semi.Max

    instance Arbitrary1 Semi.First where
        liftArbitrary :: forall a. Gen a -> Gen (First a)
    liftArbitrary Gen a
    arb = a -> First a
    forall a. a -> First a
    Semi.First (a -> First a) -> Gen a -> Gen (First a)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Gen a
    arb
        liftShrink :: forall a. (a -> [a]) -> First a -> [First a]
    liftShrink a -> [a]
    shr = (a -> First a) -> [a] -> [First a]
    forall a b. (a -> b) -> [a] -> [b]
    map a -> First a
    forall a. a -> First a
    Semi.First ([a] -> [First a]) -> (First a -> [a]) -> First a -> [First a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> [a]
    shr (a -> [a]) -> (First a -> a) -> First a -> [a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . First a -> a
    forall a. First a -> a
    Semi.getFirst

    instance Arbitrary a => Arbitrary (Semi.First a) where
        arbitrary :: Gen (First a)
    arbitrary = Gen (First a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
        shrink :: First a -> [First a]
    shrink = First a -> [First a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (Semi.First a) where
        coarbitrary :: forall b. First a -> Gen b -> Gen b
    coarbitrary = a -> Gen b -> Gen b
    forall b. a -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a -> Gen b -> Gen b)
    -> (First a -> a) -> First a -> Gen b -> Gen b
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . First a -> a
    forall a. First a -> a
    Semi.getFirst

    instance Function a => Function (Semi.First a) where
        function :: forall b. (First a -> b) -> First a :-> b
    function = (First a -> a) -> (a -> First a) -> (First a -> b) -> First a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap First a -> a
    forall a. First a -> a
    Semi.getFirst a -> First a
    forall a. a -> First a
    Semi.First

    instance Arbitrary1 Semi.Last where
        liftArbitrary :: forall a. Gen a -> Gen (Last a)
    liftArbitrary Gen a
    arb = a -> Last a
    forall a. a -> Last a
    Semi.Last (a -> Last a) -> Gen a -> Gen (Last a)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Gen a
    arb
        liftShrink :: forall a. (a -> [a]) -> Last a -> [Last a]
    liftShrink a -> [a]
    shr = (a -> Last a) -> [a] -> [Last a]
    forall a b. (a -> b) -> [a] -> [b]
    map a -> Last a
    forall a. a -> Last a
    Semi.Last ([a] -> [Last a]) -> (Last a -> [a]) -> Last a -> [Last a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> [a]
    shr (a -> [a]) -> (Last a -> a) -> Last a -> [a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Last a -> a
    forall a. Last a -> a
    Semi.getLast

    instance Arbitrary a => Arbitrary (Semi.Last a) where
        arbitrary :: Gen (Last a)
    arbitrary = Gen (Last a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
        shrink :: Last a -> [Last a]
    shrink = Last a -> [Last a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (Semi.Last a) where
        coarbitrary :: forall b. Last a -> Gen b -> Gen b
    coarbitrary = a -> Gen b -> Gen b
    forall b. a -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a -> Gen b -> Gen b) -> (Last a -> a) -> Last a -> Gen b -> Gen b
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Last a -> a
    forall a. Last a -> a
    Semi.getLast

    instance Function a => Function (Semi.Last a) where
        function :: forall b. (Last a -> b) -> Last a :-> b
    function = (Last a -> a) -> (a -> Last a) -> (Last a -> b) -> Last a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap Last a -> a
    forall a. Last a -> a
    Semi.getLast a -> Last a
    forall a. a -> Last a
    Semi.Last

    instance Arbitrary1 Semi.WrappedMonoid where
        liftArbitrary :: forall a. Gen a -> Gen (WrappedMonoid a)
    liftArbitrary Gen a
    arb = a -> WrappedMonoid a
    forall m. m -> WrappedMonoid m
    Semi.WrapMonoid (a -> WrappedMonoid a) -> Gen a -> Gen (WrappedMonoid a)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Gen a
    arb
        liftShrink :: forall a. (a -> [a]) -> WrappedMonoid a -> [WrappedMonoid a]
    liftShrink a -> [a]
    shr = (a -> WrappedMonoid a) -> [a] -> [WrappedMonoid a]
    forall a b. (a -> b) -> [a] -> [b]
    map a -> WrappedMonoid a
    forall m. m -> WrappedMonoid m
    Semi.WrapMonoid ([a] -> [WrappedMonoid a])
    -> (WrappedMonoid a -> [a]) -> WrappedMonoid a -> [WrappedMonoid a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> [a]
    shr (a -> [a]) -> (WrappedMonoid a -> a) -> WrappedMonoid a -> [a]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . WrappedMonoid a -> a
    forall m. WrappedMonoid m -> m
    Semi.unwrapMonoid

    instance Arbitrary a => Arbitrary (Semi.WrappedMonoid a) where
        arbitrary :: Gen (WrappedMonoid a)
    arbitrary = Gen (WrappedMonoid a)
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
    arbitrary1
        shrink :: WrappedMonoid a -> [WrappedMonoid a]
    shrink = WrappedMonoid a -> [WrappedMonoid a]
    forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => f a -> [f a]
    shrink1

    instance CoArbitrary a => CoArbitrary (Semi.WrappedMonoid a) where
        coarbitrary :: forall b. WrappedMonoid a -> Gen b -> Gen b
    coarbitrary = a -> Gen b -> Gen b
    forall b. a -> Gen b -> Gen b
    forall a b. CoArbitrary a => a -> Gen b -> Gen b
    coarbitrary (a -> Gen b -> Gen b)
    -> (WrappedMonoid a -> a) -> WrappedMonoid a -> Gen b -> Gen b
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . WrappedMonoid a -> a
    forall m. WrappedMonoid m -> m
    Semi.unwrapMonoid

    instance Function a => Function (Semi.WrappedMonoid a) where
        function :: forall b. (WrappedMonoid a -> b) -> WrappedMonoid a :-> b
    function = (WrappedMonoid a -> a)
    -> (a -> WrappedMonoid a)
    -> (WrappedMonoid a -> b)
    -> WrappedMonoid a :-> b
    forall b a c.
    Function b =>
    (a -> b) -> (b -> a) -> (a -> c) -> a :-> c
    functionMap WrappedMonoid a -> a
    forall m. WrappedMonoid m -> m
    Semi.unwrapMonoid a -> WrappedMonoid a
    forall m. m -> WrappedMonoid m
    Semi.WrapMonoid

    #if !(MIN_VERSION_base(4,16,0))
    instance Arbitrary1 Semi.Option where
        liftArbitrary arb = Semi.Option <$> liftArbitrary arb
        liftShrink shr = map Semi.Option . liftShrink shr . Semi.getOption

    instance Arbitrary a => Arbitrary (Semi.Option a) where
        arbitrary = arbitrary1
        shrink = shrink1

    instance CoArbitrary a => CoArbitrary (Semi.Option a) where
        coarbitrary = coarbitrary . Semi.getOption

    instance Function a => Function (Semi.Option a) where
        function = functionMap Semi.getOption Semi.Option
    #endif