module Numeric.Semiring.Involutive
  ( Involutive 
  ) where

import Data.Int
import Data.Word
import Numeric.Natural
import Numeric.Multiplication.Involutive
import Numeric.Rig.Class

-- | adjoint (x + y) = adjoint x + adjoint y
class (Rig r, InvolutiveMultiplication r) => Involutive r

instance Involutive Integer
instance Involutive Int
instance Involutive Int8
instance Involutive Int16
instance Involutive Int32
instance Involutive Int64

instance Involutive Natural
instance Involutive Word
instance Involutive Word8
instance Involutive Word16
instance Involutive Word32
instance Involutive Word64

instance Involutive ()
instance (Involutive a, Involutive b) => Involutive (a, b)
instance (Involutive a, Involutive b, Involutive c) => Involutive (a, b, c)
instance (Involutive a, Involutive b, Involutive c, Involutive d) => Involutive (a, b, c, d)
instance (Involutive a, Involutive b, Involutive c, Involutive d, Involutive e) => Involutive (a, b, c, d, e)