{-# LANGUAGE CPP              #-}
{-# LANGUAGE FlexibleContexts #-}
{-# 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 = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. a -> [a] -> NonEmpty a
(:|) Gen a
arb (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) = forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe forall a. [a] -> Maybe (NonEmpty a)
nonEmpty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Arbitrary1 f => (a -> [a]) -> f a -> [f a]
liftShrink a -> [a]
shr forall a b. (a -> b) -> a -> b
$ a
x forall a. a -> [a] -> [a]
: [a]
xs

instance Arbitrary a => Arbitrary (NonEmpty a) where
  arbitrary :: Gen (NonEmpty a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
  shrink :: NonEmpty a -> [NonEmpty a]
shrink = 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) = 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall {a}. NonEmpty a -> (a, [a])
g 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 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 = forall a. a -> Min a
Semi.Min 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 = forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Min a
Semi.Min forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
shr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Min a -> a
Semi.getMin

instance Arbitrary a => Arbitrary (Semi.Min a) where
    arbitrary :: Gen (Min a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
    shrink :: Min a -> [Min a]
shrink = 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 = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall a. Min a -> a
Semi.getMin forall a. a -> Min a
Semi.Min


instance Arbitrary1 Semi.Max where
    liftArbitrary :: forall a. Gen a -> Gen (Max a)
liftArbitrary Gen a
arb = forall a. a -> Max a
Semi.Max 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 = forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Max a
Semi.Max forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
shr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Max a -> a
Semi.getMax

instance Arbitrary a => Arbitrary (Semi.Max a) where
    arbitrary :: Gen (Max a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
    shrink :: Max a -> [Max a]
shrink = 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 = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall a. Max a -> a
Semi.getMax forall a. a -> Max a
Semi.Max


instance Arbitrary1 Semi.First where
    liftArbitrary :: forall a. Gen a -> Gen (First a)
liftArbitrary Gen a
arb = forall a. a -> First a
Semi.First 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 = forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> First a
Semi.First forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
shr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. First a -> a
Semi.getFirst

instance Arbitrary a => Arbitrary (Semi.First a) where
    arbitrary :: Gen (First a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
    shrink :: First a -> [First a]
shrink = 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 = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall a. First a -> a
Semi.getFirst forall a. a -> First a
Semi.First


instance Arbitrary1 Semi.Last where
    liftArbitrary :: forall a. Gen a -> Gen (Last a)
liftArbitrary Gen a
arb = forall a. a -> Last a
Semi.Last 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 = forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Last a
Semi.Last forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
shr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Last a -> a
Semi.getLast

instance Arbitrary a => Arbitrary (Semi.Last a) where
    arbitrary :: Gen (Last a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
    shrink :: Last a -> [Last a]
shrink = 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 = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall a. Last a -> a
Semi.getLast forall a. a -> Last a
Semi.Last


instance Arbitrary1 Semi.WrappedMonoid where
    liftArbitrary :: forall a. Gen a -> Gen (WrappedMonoid a)
liftArbitrary Gen a
arb = forall m. m -> WrappedMonoid m
Semi.WrapMonoid 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 = forall a b. (a -> b) -> [a] -> [b]
map forall m. m -> WrappedMonoid m
Semi.WrapMonoid forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a]
shr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m. WrappedMonoid m -> m
Semi.unwrapMonoid

instance Arbitrary a => Arbitrary (Semi.WrappedMonoid a) where
    arbitrary :: Gen (WrappedMonoid a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1
    shrink :: WrappedMonoid a -> [WrappedMonoid a]
shrink = 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 = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap forall m. WrappedMonoid m -> m
Semi.unwrapMonoid 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