{-# OPTIONS_GHC -Wall #-}

-- | Highjacking 'Representable's to provide a basis to provide element-by-element operations

module NumHask.Algebra.Basis (
    AdditiveBasis(..)
  , AdditiveGroupBasis(..)
  , MultiplicativeBasis(..)
  , MultiplicativeGroupBasis(..)
  ) where

import Data.Functor.Rep
import NumHask.Algebra.Multiplicative
import NumHask.Algebra.Additive

-- | AdditiveBasis
-- element by element addition
class ( Representable m
      , Additive a ) =>
      AdditiveBasis m a where
    infixl 7 .+.
    (.+.) :: m a -> m a -> m a
    (.+.) = liftR2 (+)

instance (Representable r, Additive a) => AdditiveBasis r a

-- | AdditiveGroupBasis
-- element by element subtraction
class ( Representable m
      , AdditiveGroup a ) =>
      AdditiveGroupBasis m a where
    infixl 6 .-.
    (.-.) :: m a -> m a -> m a
    (.-.) = liftR2 (-)

instance (Representable r, AdditiveGroup a) => AdditiveGroupBasis r a

-- | MultiplicativeBasis
-- element by element multiplication
class ( Representable m
      , Multiplicative a ) =>
      MultiplicativeBasis m a where
    infixl 7 .*.
    (.*.) :: m a -> m a -> m a
    (.*.) = liftR2 (*)

instance (Representable r, Multiplicative a) => MultiplicativeBasis r a

-- | MultiplicativeGroupBasis
-- element by element division
class ( Representable m
      , MultiplicativeGroup a ) =>
      MultiplicativeGroupBasis m a where
    infixl 7 ./.
    (./.) :: m a -> m a -> m a
    (./.) = liftR2 (/)

instance (Representable r, MultiplicativeGroup a) => MultiplicativeGroupBasis r a