packages feed

numhask-0.13.3.0: src/NumHask/Algebra/Patterns.hs

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}

-- | Patterns for common tests
module NumHask.Algebra.Patterns
  ( pattern Zero,
    pattern One,
    pattern MinusOne,
  )
where

import NumHask.Algebra.Additive
import NumHask.Algebra.Multiplicative
import Prelude (Bool (..), Eq (..), (.))

-- | Enabling pattern matching on zero:
--
-- > isItZero Zero = True
-- > isItZero _    = False
pattern Zero :: forall a. (Eq a, Additive a) => a
pattern Zero <- ((== zero) -> True)

-- | Enabling pattern matching on one:
--
-- > isItOne One = True
-- > isItOne _   = False
pattern One :: forall a. (Eq a, Multiplicative a) => a
pattern One <- ((== one) -> True)

-- | Enabling pattern matching on minus one:
--
-- > isItMinusOne MinusOne = True
-- > isItMinusOne _        = False
--
-- The means of testing (that is, add one, and check if it equals
-- zero) might be surprising. Other, more obvious, methods would
-- result in underflow errors. (For example, we could negate and test
-- if it's equal to one, but that would fail on any nonzero
-- 'Natural'. Similarly, we could test for equality with the negation of
-- one, but that would fail on any 'Natural' whatsoever, since 'negate
-- one' underflows.)
pattern MinusOne :: forall a. (Eq a, Additive a, Multiplicative a) => a
pattern MinusOne <- ((== zero) . (+ one) -> True)