packages feed

integer-types-0.1.2.0: library/Integer/Sign.hs

module Integer.Sign
  ( -- * Type
    Sign (..),

    -- * Operations
    negate,
    multiply,
  )
where

import Control.DeepSeq qualified as DeepSeq
import Data.Hashable (Hashable (hashWithSalt))
import Essentials
import Prelude (seq)
import Prelude qualified as Enum (Enum (..))

data Sign = MinusSign | PlusSign
  deriving stock (Eq, Ord, Show, Enum, Bounded)

instance DeepSeq.NFData Sign where rnf x = seq x ()

instance Hashable Sign where
  hashWithSalt salt x = salt `hashWithSalt` (Enum.fromEnum x)

negate :: Sign -> Sign
negate PlusSign = MinusSign
negate MinusSign = PlusSign

multiply :: Sign -> Sign -> Sign
multiply a b = if a == b then PlusSign else MinusSign