module Test.QuickCheck.Instances.Num
       (nonNegative,nonPositive
       ,negative,positive
       ,nonZero,nonZero_
       ) where

import Test.QuickCheck
import Control.Monad.Extensions

nonNegative :: (Num a, Arbitrary a) => Gen a
nonNegative :: Gen a
nonNegative = a -> a
forall a. Num a => a -> a
abs (a -> a) -> Gen a -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
forall a. Arbitrary a => Gen a
arbitrary

positive :: (Eq a, Num a, Arbitrary a) => Gen a
positive :: Gen a
positive = Gen a -> Gen a
forall a. (Eq a, Num a) => Gen a -> Gen a
nonZero Gen a
forall a. (Num a, Arbitrary a) => Gen a
nonNegative

nonPositive :: (Num a, Arbitrary a) => Gen a
nonPositive :: Gen a
nonPositive = a -> a
forall a. Num a => a -> a
negate (a -> a) -> Gen a -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
forall a. (Num a, Arbitrary a) => Gen a
nonNegative

negative :: (Eq a, Num a, Arbitrary a) => Gen a
negative :: Gen a
negative = a -> a
forall a. Num a => a -> a
negate (a -> a) -> Gen a -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
forall a. (Eq a, Num a, Arbitrary a) => Gen a
positive

nonZero :: (Eq a, Num a) => Gen a -> Gen a
nonZero :: Gen a -> Gen a
nonZero Gen a
g =
  (Int -> Gen a) -> Gen a
forall a. (Int -> Gen a) -> Gen a
sized (\Int
s -> (a -> Bool) -> Gen a -> Gen a
forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m a
satisfiesM (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0) (if (Int
s Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) then (Int -> Gen a -> Gen a
forall a. Int -> Gen a -> Gen a
resize Int
1 Gen a
g) else Gen a
g))

nonZero_ :: (Eq a, Num a, Arbitrary a) => Gen a
nonZero_ :: Gen a
nonZero_ = Gen a -> Gen a
forall a. (Eq a, Num a) => Gen a -> Gen a
nonZero Gen a
forall a. Arbitrary a => Gen a
arbitrary