module Numeric.OneLiner (
GNum(..)
, gPlus
, gMinus
, gTimes
, gNegate
, gAbs
, gSignum
, gFromInteger
, gDivide
, gRecip
, gFromRational
, gPi
, gExp
, gLog
, gSqrt
, gPower
, gLogBase
, gSin
, gCos
, gTan
, gAsin
, gAcos
, gAtan
, gSinh
, gCosh
, gTanh
, gAsinh
, gAcosh
, gAtanh
) where
import Data.Data
import GHC.Generics
import Generics.OneLiner
import Generics.OneLiner.Instances.Internal
newtype GNum a = GNum { getGNum :: a }
deriving (Eq, Ord, Show, Read, Data, Generic, Functor, Foldable, Traversable)
instance (ADTRecord a, Constraints a Num)
=> Num (GNum a) where
(+) = c2 (gPlus @a)
() = c2 (gMinus @a)
(*) = c2 (gTimes @a)
negate = c1 (gNegate @a)
abs = c1 (gAbs @a)
signum = c1 (gSignum @a)
fromInteger = c0 (gFromInteger @a)
instance ( ADTRecord a
, Constraints a Num
, Constraints a Fractional
)
=> Fractional (GNum a) where
(/) = c2 (gDivide @a)
recip = c1 (gRecip @a)
fromRational = c0 (gFromRational @a)
instance ( ADTRecord a
, Constraints a Num
, Constraints a Fractional
, Constraints a Floating
)
=> Floating (GNum a) where
pi = c0 (gPi @a)
exp = c1 (gExp @a)
log = c1 (gLog @a)
sqrt = c1 (gSqrt @a)
(**) = c2 (gPower @a)
logBase = c2 (gLogBase @a)
sin = c1 (gSin @a)
cos = c1 (gCos @a)
tan = c1 (gTan @a)
asin = c1 (gAsin @a)
acos = c1 (gAcos @a)
atan = c1 (gAtan @a)
sinh = c1 (gSinh @a)
cosh = c1 (gCosh @a)
tanh = c1 (gTanh @a)
asinh = c1 (gAsinh @a)
acosh = c1 (gAcosh @a)
atanh = c1 (gAtanh @a)
gPlus
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a -> a
gPlus = binaryOp @Num (+)
gMinus
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a -> a
gMinus = binaryOp @Num ()
gTimes
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a -> a
gTimes = binaryOp @Num (*)
gNegate
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a
gNegate = unaryOp @Num negate
gAbs
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a
gAbs = unaryOp @Num abs
gSignum
:: forall a. (ADTRecord a, Constraints a Num)
=> a -> a
gSignum = unaryOp @Num signum
gFromInteger
:: forall a. (ADTRecord a, Constraints a Num)
=> Integer -> a
gFromInteger x = nullaryOp @Num (fromInteger x)
gDivide
:: forall a. (ADTRecord a, Constraints a Fractional)
=> a -> a -> a
gDivide = binaryOp @Fractional (/)
gRecip
:: forall a. (ADTRecord a, Constraints a Fractional)
=> a -> a
gRecip = unaryOp @Fractional recip
gFromRational
:: forall a. (ADTRecord a, Constraints a Fractional)
=> Rational -> a
gFromRational x = nullaryOp @Fractional (fromRational x)
gPi
:: forall a. (ADTRecord a, Constraints a Floating)
=> a
gPi = nullaryOp @Floating pi
gExp
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gExp = unaryOp @Floating exp
gLog
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gLog = unaryOp @Floating log
gSqrt
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gSqrt = unaryOp @Floating sqrt
gPower
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a -> a
gPower = binaryOp @Floating (**)
gLogBase
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a -> a
gLogBase = binaryOp @Floating logBase
gSin
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gSin = unaryOp @Floating sin
gCos
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gCos = unaryOp @Floating cos
gTan
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gTan = unaryOp @Floating tan
gAsin
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAsin = unaryOp @Floating asin
gAcos
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAcos = unaryOp @Floating acos
gAtan
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAtan = unaryOp @Floating atan
gSinh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gSinh = unaryOp @Floating sinh
gCosh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gCosh = unaryOp @Floating cosh
gTanh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gTanh = unaryOp @Floating atanh
gAsinh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAsinh = unaryOp @Floating asinh
gAcosh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAcosh = unaryOp @Floating acosh
gAtanh
:: forall a. (ADTRecord a, Constraints a Floating)
=> a -> a
gAtanh = unaryOp @Floating atanh