{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}

module Algebra.Scalar (Scalar (..), (.*.)) where

import Algebra.Normed
import AlgebraicPrelude
import qualified Prelude as P

{- | @'Scalar' r@ provides almost the same type-instances as @r@,
   but it can also behave as a @'Module'@ over @r@ itself.
-}
newtype Scalar r = Scalar {Scalar r -> r
runScalar :: r}
  deriving
    ( ReadPrec [Scalar r]
ReadPrec (Scalar r)
Int -> ReadS (Scalar r)
ReadS [Scalar r]
(Int -> ReadS (Scalar r))
-> ReadS [Scalar r]
-> ReadPrec (Scalar r)
-> ReadPrec [Scalar r]
-> Read (Scalar r)
forall r. Read r => ReadPrec [Scalar r]
forall r. Read r => ReadPrec (Scalar r)
forall r. Read r => Int -> ReadS (Scalar r)
forall r. Read r => ReadS [Scalar r]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Scalar r]
$creadListPrec :: forall r. Read r => ReadPrec [Scalar r]
readPrec :: ReadPrec (Scalar r)
$creadPrec :: forall r. Read r => ReadPrec (Scalar r)
readList :: ReadS [Scalar r]
$creadList :: forall r. Read r => ReadS [Scalar r]
readsPrec :: Int -> ReadS (Scalar r)
$creadsPrec :: forall r. Read r => Int -> ReadS (Scalar r)
Read
    , Int -> Scalar r -> ShowS
[Scalar r] -> ShowS
Scalar r -> String
(Int -> Scalar r -> ShowS)
-> (Scalar r -> String) -> ([Scalar r] -> ShowS) -> Show (Scalar r)
forall r. Show r => Int -> Scalar r -> ShowS
forall r. Show r => [Scalar r] -> ShowS
forall r. Show r => Scalar r -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Scalar r] -> ShowS
$cshowList :: forall r. Show r => [Scalar r] -> ShowS
show :: Scalar r -> String
$cshow :: forall r. Show r => Scalar r -> String
showsPrec :: Int -> Scalar r -> ShowS
$cshowsPrec :: forall r. Show r => Int -> Scalar r -> ShowS
Show
    , Scalar r -> Scalar r -> Bool
(Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool) -> Eq (Scalar r)
forall r. Eq r => Scalar r -> Scalar r -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Scalar r -> Scalar r -> Bool
$c/= :: forall r. Eq r => Scalar r -> Scalar r -> Bool
== :: Scalar r -> Scalar r -> Bool
$c== :: forall r. Eq r => Scalar r -> Scalar r -> Bool
Eq
    , Eq (Scalar r)
Eq (Scalar r)
-> (Scalar r -> Scalar r -> Ordering)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Bool)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> Ord (Scalar r)
Scalar r -> Scalar r -> Bool
Scalar r -> Scalar r -> Ordering
Scalar r -> Scalar r -> Scalar r
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall r. Ord r => Eq (Scalar r)
forall r. Ord r => Scalar r -> Scalar r -> Bool
forall r. Ord r => Scalar r -> Scalar r -> Ordering
forall r. Ord r => Scalar r -> Scalar r -> Scalar r
min :: Scalar r -> Scalar r -> Scalar r
$cmin :: forall r. Ord r => Scalar r -> Scalar r -> Scalar r
max :: Scalar r -> Scalar r -> Scalar r
$cmax :: forall r. Ord r => Scalar r -> Scalar r -> Scalar r
>= :: Scalar r -> Scalar r -> Bool
$c>= :: forall r. Ord r => Scalar r -> Scalar r -> Bool
> :: Scalar r -> Scalar r -> Bool
$c> :: forall r. Ord r => Scalar r -> Scalar r -> Bool
<= :: Scalar r -> Scalar r -> Bool
$c<= :: forall r. Ord r => Scalar r -> Scalar r -> Bool
< :: Scalar r -> Scalar r -> Bool
$c< :: forall r. Ord r => Scalar r -> Scalar r -> Bool
compare :: Scalar r -> Scalar r -> Ordering
$ccompare :: forall r. Ord r => Scalar r -> Scalar r -> Ordering
$cp1Ord :: forall r. Ord r => Eq (Scalar r)
Ord
    , Natural -> Scalar r -> Scalar r
Scalar r -> Scalar r -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
(Scalar r -> Scalar r -> Scalar r)
-> (Natural -> Scalar r -> Scalar r)
-> (forall (f :: * -> *) a.
    Foldable1 f =>
    (a -> Scalar r) -> f a -> Scalar r)
-> Additive (Scalar r)
forall r. Additive r => Natural -> Scalar r -> Scalar r
forall r. Additive r => Scalar r -> Scalar r -> Scalar r
forall r (f :: * -> *) a.
(Additive r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
(r -> r -> r)
-> (Natural -> r -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Additive r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r
sumWith1 :: (a -> Scalar r) -> f a -> Scalar r
$csumWith1 :: forall r (f :: * -> *) a.
(Additive r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
sinnum1p :: Natural -> Scalar r -> Scalar r
$csinnum1p :: forall r. Additive r => Natural -> Scalar r -> Scalar r
+ :: Scalar r -> Scalar r -> Scalar r
$c+ :: forall r. Additive r => Scalar r -> Scalar r -> Scalar r
Additive
    , Enum (Scalar r)
Real (Scalar r)
Real (Scalar r)
-> Enum (Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Scalar r -> (Scalar r, Scalar r))
-> (Scalar r -> Scalar r -> (Scalar r, Scalar r))
-> (Scalar r -> Integer)
-> Integral (Scalar r)
Scalar r -> Integer
Scalar r -> Scalar r -> (Scalar r, Scalar r)
Scalar r -> Scalar r -> Scalar r
forall r. Integral r => Enum (Scalar r)
forall r. Integral r => Real (Scalar r)
forall r. Integral r => Scalar r -> Integer
forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
forall r. Integral r => Scalar r -> Scalar r -> Scalar r
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: Scalar r -> Integer
$ctoInteger :: forall r. Integral r => Scalar r -> Integer
divMod :: Scalar r -> Scalar r -> (Scalar r, Scalar r)
$cdivMod :: forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
quotRem :: Scalar r -> Scalar r -> (Scalar r, Scalar r)
$cquotRem :: forall r.
Integral r =>
Scalar r -> Scalar r -> (Scalar r, Scalar r)
mod :: Scalar r -> Scalar r -> Scalar r
$cmod :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
div :: Scalar r -> Scalar r -> Scalar r
$cdiv :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
rem :: Scalar r -> Scalar r -> Scalar r
$crem :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
quot :: Scalar r -> Scalar r -> Scalar r
$cquot :: forall r. Integral r => Scalar r -> Scalar r -> Scalar r
$cp2Integral :: forall r. Integral r => Enum (Scalar r)
$cp1Integral :: forall r. Integral r => Real (Scalar r)
Integral
    , Num (Scalar r)
Ord (Scalar r)
Num (Scalar r)
-> Ord (Scalar r) -> (Scalar r -> Rational) -> Real (Scalar r)
Scalar r -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
forall r. Real r => Num (Scalar r)
forall r. Real r => Ord (Scalar r)
forall r. Real r => Scalar r -> Rational
toRational :: Scalar r -> Rational
$ctoRational :: forall r. Real r => Scalar r -> Rational
$cp2Real :: forall r. Real r => Ord (Scalar r)
$cp1Real :: forall r. Real r => Num (Scalar r)
Real
    , Int -> Scalar r
Scalar r -> Int
Scalar r -> [Scalar r]
Scalar r -> Scalar r
Scalar r -> Scalar r -> [Scalar r]
Scalar r -> Scalar r -> Scalar r -> [Scalar r]
(Scalar r -> Scalar r)
-> (Scalar r -> Scalar r)
-> (Int -> Scalar r)
-> (Scalar r -> Int)
-> (Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> [Scalar r])
-> (Scalar r -> Scalar r -> Scalar r -> [Scalar r])
-> Enum (Scalar r)
forall r. Enum r => Int -> Scalar r
forall r. Enum r => Scalar r -> Int
forall r. Enum r => Scalar r -> [Scalar r]
forall r. Enum r => Scalar r -> Scalar r
forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
forall r. Enum r => Scalar r -> Scalar r -> Scalar r -> [Scalar r]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Scalar r -> Scalar r -> Scalar r -> [Scalar r]
$cenumFromThenTo :: forall r. Enum r => Scalar r -> Scalar r -> Scalar r -> [Scalar r]
enumFromTo :: Scalar r -> Scalar r -> [Scalar r]
$cenumFromTo :: forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
enumFromThen :: Scalar r -> Scalar r -> [Scalar r]
$cenumFromThen :: forall r. Enum r => Scalar r -> Scalar r -> [Scalar r]
enumFrom :: Scalar r -> [Scalar r]
$cenumFrom :: forall r. Enum r => Scalar r -> [Scalar r]
fromEnum :: Scalar r -> Int
$cfromEnum :: forall r. Enum r => Scalar r -> Int
toEnum :: Int -> Scalar r
$ctoEnum :: forall r. Enum r => Int -> Scalar r
pred :: Scalar r -> Scalar r
$cpred :: forall r. Enum r => Scalar r -> Scalar r
succ :: Scalar r -> Scalar r
$csucc :: forall r. Enum r => Scalar r -> Scalar r
Enum
    , Scalar r -> Natural -> Scalar r
Scalar r -> Scalar r -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
(Scalar r -> Scalar r -> Scalar r)
-> (Scalar r -> Natural -> Scalar r)
-> (forall (f :: * -> *) a.
    Foldable1 f =>
    (a -> Scalar r) -> f a -> Scalar r)
-> Multiplicative (Scalar r)
forall r. Multiplicative r => Scalar r -> Natural -> Scalar r
forall r. Multiplicative r => Scalar r -> Scalar r -> Scalar r
forall r (f :: * -> *) a.
(Multiplicative r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
(r -> r -> r)
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Multiplicative r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> Scalar r) -> f a -> Scalar r
productWith1 :: (a -> Scalar r) -> f a -> Scalar r
$cproductWith1 :: forall r (f :: * -> *) a.
(Multiplicative r, Foldable1 f) =>
(a -> Scalar r) -> f a -> Scalar r
pow1p :: Scalar r -> Natural -> Scalar r
$cpow1p :: forall r. Multiplicative r => Scalar r -> Natural -> Scalar r
* :: Scalar r -> Scalar r -> Scalar r
$c* :: forall r. Multiplicative r => Scalar r -> Scalar r -> Scalar r
Multiplicative
    , Multiplicative (Scalar r)
Scalar r
Multiplicative (Scalar r)
-> Scalar r
-> (Scalar r -> Natural -> Scalar r)
-> (forall (f :: * -> *) a.
    Foldable f =>
    (a -> Scalar r) -> f a -> Scalar r)
-> Unital (Scalar r)
Scalar r -> Natural -> Scalar r
(a -> Scalar r) -> f a -> Scalar r
forall r. Unital r => Multiplicative (Scalar r)
forall r. Unital r => Scalar r
forall r. Unital r => Scalar r -> Natural -> Scalar r
forall r (f :: * -> *) a.
(Unital r, Foldable f) =>
(a -> Scalar r) -> f a -> Scalar r
forall r.
Multiplicative r
-> r
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable f => (a -> r) -> f a -> r)
-> Unital r
forall (f :: * -> *) a.
Foldable f =>
(a -> Scalar r) -> f a -> Scalar r
productWith :: (a -> Scalar r) -> f a -> Scalar r
$cproductWith :: forall r (f :: * -> *) a.
(Unital r, Foldable f) =>
(a -> Scalar r) -> f a -> Scalar r
pow :: Scalar r -> Natural -> Scalar r
$cpow :: forall r. Unital r => Scalar r -> Natural -> Scalar r
one :: Scalar r
$cone :: forall r. Unital r => Scalar r
$cp1Unital :: forall r. Unital r => Multiplicative (Scalar r)
Unital
    )

(.*.) ::
  (Module (Scalar r) m) =>
  r ->
  m ->
  m
r
r .*. :: r -> m -> m
.*. m
f = r -> Scalar r
forall r. r -> Scalar r
Scalar r
r Scalar r -> m -> m
forall r m. LeftModule r m => r -> m -> m
.* m
f

infixr 8 .*.

instance Normed r => Normed (Scalar r) where
  type Norm (Scalar r) = Norm r
  norm :: Scalar r -> Norm (Scalar r)
norm = r -> Norm r
forall a. Normed a => a -> Norm a
norm (r -> Norm r) -> (Scalar r -> r) -> Scalar r -> Norm r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scalar r -> r
forall r. Scalar r -> r
runScalar
  liftNorm :: Norm (Scalar r) -> Scalar r
liftNorm = Scalar (Scalar r) -> Scalar r
forall r. Scalar r -> r
runScalar (Scalar (Scalar r) -> Scalar r)
-> (Norm r -> Scalar (Scalar r)) -> Norm r -> Scalar r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Norm r -> Scalar (Scalar r)
forall a. Normed a => Norm a -> a
liftNorm

deriving instance DecidableAssociates r => DecidableAssociates (Scalar r)

deriving instance DecidableUnits r => DecidableUnits (Scalar r)

deriving instance UnitNormalForm r => UnitNormalForm (Scalar r)

deriving instance P.Num r => P.Num (Scalar r)

deriving instance P.Fractional r => P.Fractional (Scalar r)

deriving instance Monoidal r => Monoidal (Scalar r)

deriving instance Group r => Group (Scalar r)

deriving instance Semiring r => Semiring (Scalar r)

deriving instance Ring r => Ring (Scalar r)

deriving instance Abelian r => Abelian (Scalar r)

deriving instance Rig r => Rig (Scalar r)

deriving instance Commutative r => Commutative (Scalar r)

deriving instance Division r => Division (Scalar r)

deriving instance LeftModule Integer r => LeftModule Integer (Scalar r)

deriving instance RightModule Integer r => RightModule Integer (Scalar r)

deriving instance LeftModule Natural r => LeftModule Natural (Scalar r)

deriving instance RightModule Natural r => RightModule Natural (Scalar r)

instance Semiring r => RightModule r (Scalar r) where
  Scalar r
r *. :: Scalar r -> r -> Scalar r
*. r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q
  {-# INLINE (*.) #-}

instance Semiring r => LeftModule r (Scalar r) where
  r
r .* :: r -> Scalar r -> Scalar r
.* Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q
  {-# INLINE (.*) #-}

instance (Semiring r) => LeftModule (Scalar r) (Scalar r) where
  Scalar r
r .* :: Scalar r -> Scalar r -> Scalar r
.* Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q

instance (Semiring r) => RightModule (Scalar r) (Scalar r) where
  Scalar r
r *. :: Scalar r -> Scalar r -> Scalar r
*. Scalar r
q = r -> Scalar r
forall r. r -> Scalar r
Scalar (r -> Scalar r) -> r -> Scalar r
forall a b. (a -> b) -> a -> b
$ r
r r -> r -> r
forall r. Multiplicative r => r -> r -> r
* r
q