{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}

-- | Action
module NumHask.Algebra.Abstract.Action
  ( Actor
  , AdditiveAction(..)
  , SubtractiveAction(..)
  , MultiplicativeAction(..)
  , DivisiveAction(..)
  ) where

import NumHask.Algebra.Abstract.Additive
import NumHask.Algebra.Abstract.Multiplicative

-- | a type class to represent an action on a higher-kinded number
type family Actor h

class (Additive (Actor h)) =>
  AdditiveAction h where
  infixl 6 .+
  (.+) :: h -> Actor h -> h

  infixl 6 +.
  (+.) :: Actor h -> h -> h

class (Subtractive (Actor h)) =>
  SubtractiveAction h where
  infixl 6 .-
  (.-) :: h -> Actor h -> h

  infixl 6 -.
  (-.) :: Actor h -> h -> h

class (Multiplicative (Actor h)) =>
  MultiplicativeAction h where
  infixl 7 .*
  (.*) :: h -> Actor h -> h
  infixl 7 *.
  (*.) :: Actor h -> h -> h

class (Divisive (Actor h)) =>
  DivisiveAction h where
  infixl 7 ./
  (./) :: h -> Actor h -> h
  infixl 7 /.
  (/.) :: Actor h -> h -> h