--
-- Numeric instances that can be useful, but might not be what you want.
--
{-# OPTIONS_GHC -Wno-orphans #-}
module Data.Array.Shaped.Instances where
import Data.Array.Shaped

instance (Shape sh, Num a) => Num (Array sh a) where
  + :: Array sh a -> Array sh a -> Array sh a
(+) = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Num a => a -> a -> a
(+)
  (-) = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA (-)
  * :: Array sh a -> Array sh a -> Array sh a
(*) = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Num a => a -> a -> a
(*)
  negate :: Array sh a -> Array sh a
negate = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Num a => a -> a
negate
  abs :: Array sh a -> Array sh a
abs = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Num a => a -> a
abs
  signum :: Array sh a -> Array sh a
signum = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Num a => a -> a
signum
  fromInteger :: Integer -> Array sh a
fromInteger = a -> Array sh a
forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant (a -> Array sh a) -> (Integer -> a) -> Integer -> Array sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> a
forall a. Num a => Integer -> a
fromInteger

instance (Shape sh, Fractional a) => Fractional (Array sh a) where
  / :: Array sh a -> Array sh a -> Array sh a
(/) = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Fractional a => a -> a -> a
(/)
  recip :: Array sh a -> Array sh a
recip = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Fractional a => a -> a
recip
  fromRational :: Rational -> Array sh a
fromRational = a -> Array sh a
forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant (a -> Array sh a) -> (Rational -> a) -> Rational -> Array sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> a
forall a. Fractional a => Rational -> a
fromRational

instance (Shape sh, Floating a) => Floating (Array sh a) where
  pi :: Array sh a
pi = a -> Array sh a
forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant a
forall a. Floating a => a
pi
  exp :: Array sh a -> Array sh a
exp = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
exp
  log :: Array sh a -> Array sh a
log = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
log
  sqrt :: Array sh a -> Array sh a
sqrt = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
sqrt
  ** :: Array sh a -> Array sh a -> Array sh a
(**) = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Floating a => a -> a -> a
(**)
  logBase :: Array sh a -> Array sh a -> Array sh a
logBase = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Floating a => a -> a -> a
logBase
  sin :: Array sh a -> Array sh a
sin = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
sin
  cos :: Array sh a -> Array sh a
cos = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
cos
  tan :: Array sh a -> Array sh a
tan = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
tan
  asin :: Array sh a -> Array sh a
asin = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
asin
  acos :: Array sh a -> Array sh a
acos = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
acos
  atan :: Array sh a -> Array sh a
atan = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
atan
  sinh :: Array sh a -> Array sh a
sinh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
sinh
  cosh :: Array sh a -> Array sh a
cosh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
cosh
  tanh :: Array sh a -> Array sh a
tanh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
tanh
  asinh :: Array sh a -> Array sh a
asinh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
asinh
  acosh :: Array sh a -> Array sh a
acosh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
acosh
  atanh :: Array sh a -> Array sh a
atanh = (a -> a) -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA a -> a
forall a. Floating a => a -> a
atanh

-- Real cannot be implemented, but is a superclass of Integral.
instance (Shape sh, Real a) => Real (Array sh a) where
  toRational :: Array sh a -> Rational
toRational Array sh a
_ = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"toRational of an Array"

-- Enum cannot be implemented, but is a superclass of Integral.
instance (Shape sh, Enum a) => Enum (Array sh a) where
  toEnum :: Int -> Array sh a
toEnum Int
_ = [Char] -> Array sh a
forall a. HasCallStack => [Char] -> a
error [Char]
"toEnum of an Array"
  fromEnum :: Array sh a -> Int
fromEnum Array sh a
_ = [Char] -> Int
forall a. HasCallStack => [Char] -> a
error [Char]
"fromEnum of an Array"

-- Integral can only be partially implemented
instance (Shape sh, Integral a) => Integral (Array sh a) where
  quot :: Array sh a -> Array sh a -> Array sh a
quot = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Integral a => a -> a -> a
quot
  rem :: Array sh a -> Array sh a -> Array sh a
rem = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Integral a => a -> a -> a
rem
  div :: Array sh a -> Array sh a -> Array sh a
div = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Integral a => a -> a -> a
div
  mod :: Array sh a -> Array sh a -> Array sh a
mod = (a -> a -> a) -> Array sh a -> Array sh a -> Array sh a
forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA a -> a -> a
forall a. Integral a => a -> a -> a
mod
  quotRem :: Array sh a -> Array sh a -> (Array sh a, Array sh a)
quotRem Array sh a
x Array sh a
y = (Array sh a -> Array sh a -> Array sh a
forall a. Integral a => a -> a -> a
quot Array sh a
x Array sh a
y, Array sh a -> Array sh a -> Array sh a
forall a. Integral a => a -> a -> a
rem Array sh a
x Array sh a
y)
  divMod :: Array sh a -> Array sh a -> (Array sh a, Array sh a)
divMod Array sh a
x Array sh a
y = (Array sh a -> Array sh a -> Array sh a
forall a. Integral a => a -> a -> a
div Array sh a
x Array sh a
y, Array sh a -> Array sh a -> Array sh a
forall a. Integral a => a -> a -> a
mod Array sh a
x Array sh a
y)
  toInteger :: Array sh a -> Integer
toInteger Array sh a
_ = [Char] -> Integer
forall a. HasCallStack => [Char] -> a
error [Char]
"toInteger of an Array"