packages feed

monoidmap-0.0.1.7: src/test/Test/Combinators/NonZero.hs

-- |
-- Copyright: © 2022–2025 Jonathan Knowles
-- License: Apache-2.0
--
module Test.Combinators.NonZero
    ( NonZero
    , genNonZero
    , getNonZero
    , maybeNonZero
    , shrinkNonZero
    )
    where

import Prelude

import Data.Group
    ( Group )
import Data.Maybe
    ( mapMaybe )
import Data.Monoid.Null
    ( MonoidNull )
import Data.Semigroup.Cancellative
    ( Commutative )
import Test.QuickCheck
    ( Gen, suchThatMap )

-- | A combinator for non-zero values.
newtype NonZero a = NonZero a
    deriving newtype (Eq, Num, Read, Show)
    deriving newtype (Semigroup, Commutative, Monoid, MonoidNull, Group)

genNonZero :: (Eq a, Num a) => Gen a -> Gen (NonZero a)
genNonZero genA = suchThatMap genA maybeNonZero

getNonZero :: NonZero a -> a
getNonZero (NonZero a) = a

maybeNonZero :: (Eq a, Num a) => a -> Maybe (NonZero a)
maybeNonZero p
    | p == 0 = Nothing
    | otherwise = Just (NonZero p)

shrinkNonZero :: (Eq a, Num a) => (a -> [a]) -> NonZero a -> [NonZero a]
shrinkNonZero shrinkA = mapMaybe maybeNonZero . shrinkA . getNonZero