--
-- 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
(+) = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Num a => a -> a -> 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
(*) = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Num a => a -> a -> a
(*)
  negate :: Array sh a -> Array sh a
negate = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Num a => a -> a
negate
  abs :: Array sh a -> Array sh a
abs = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Num a => a -> a
abs
  signum :: Array sh a -> Array sh a
signum = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Num a => a -> a
signum
  fromInteger :: Integer -> Array sh a
fromInteger = forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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
(/) = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Fractional a => a -> a -> a
(/)
  recip :: Array sh a -> Array sh a
recip = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Fractional a => a -> a
recip
  fromRational :: Rational -> Array sh a
fromRational = forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => Rational -> a
fromRational

instance (Shape sh, Floating a) => Floating (Array sh a) where
  pi :: Array sh a
pi = forall (sh :: [Nat]) a. Shape sh => a -> Array sh a
constant forall a. Floating a => a
pi
  exp :: Array sh a -> Array sh a
exp = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
exp
  log :: Array sh a -> Array sh a
log = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
log
  sqrt :: Array sh a -> Array sh a
sqrt = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
sqrt
  ** :: 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 forall a. Floating a => a -> a -> a
(**)
  logBase :: Array sh a -> Array sh a -> Array sh a
logBase = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Floating a => a -> a -> a
logBase
  sin :: Array sh a -> Array sh a
sin = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
sin
  cos :: Array sh a -> Array sh a
cos = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
cos
  tan :: Array sh a -> Array sh a
tan = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
tan
  asin :: Array sh a -> Array sh a
asin = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
asin
  acos :: Array sh a -> Array sh a
acos = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
acos
  atan :: Array sh a -> Array sh a
atan = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
atan
  sinh :: Array sh a -> Array sh a
sinh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
sinh
  cosh :: Array sh a -> Array sh a
cosh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
cosh
  tanh :: Array sh a -> Array sh a
tanh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
tanh
  asinh :: Array sh a -> Array sh a
asinh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
asinh
  acosh :: Array sh a -> Array sh a
acosh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA forall a. Floating a => a -> a
acosh
  atanh :: Array sh a -> Array sh a
atanh = forall (sh :: [Nat]) a b.
Shape sh =>
(a -> b) -> Array sh a -> Array sh b
mapA 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
_ = 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
_ = forall a. HasCallStack => [Char] -> a
error [Char]
"toEnum of an Array"
  fromEnum :: Array sh a -> Int
fromEnum Array sh a
_ = 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 = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Integral a => a -> a -> a
quot
  rem :: Array sh a -> Array sh a -> Array sh a
rem = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Integral a => a -> a -> a
rem
  div :: Array sh a -> Array sh a -> Array sh a
div = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA forall a. Integral a => a -> a -> a
div
  mod :: Array sh a -> Array sh a -> Array sh a
mod = forall (sh :: [Nat]) a b c.
Shape sh =>
(a -> b -> c) -> Array sh a -> Array sh b -> Array sh c
zipWithA 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 = (forall a. Integral a => a -> a -> a
quot Array sh a
x Array sh a
y, 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 = (forall a. Integral a => a -> a -> a
div Array sh a
x Array sh a
y, 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
_ = forall a. HasCallStack => [Char] -> a
error [Char]
"toInteger of an Array"