module Data.Units.Base.Arithmetic
(
(.+~)
, (~+.)
, (~+~)
, (.-~)
, (~-.)
, (~-~)
, (.*.)
, (.*~)
, (~*.)
, (~*~)
, (./.)
, (./~)
, (~/.)
, (~/~)
, (.^.)
, (~^.)
, (.^~)
, (~^~)
) where
import Data.Type.Int
import Data.Units.Base.System
import Data.Units.Base.Convert
(.+~) :: forall u v a. FromTo' v u a => u a -> v a -> u a
u a
u .+~ :: forall (u :: Unit) (v :: Unit) a.
FromTo' v u a =>
u a -> v a -> u a
.+~ v a
v = a -> u a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity u a
u a -> a -> a
forall a. Num a => a -> a -> a
+ u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> u a
forall (u :: Unit) (v :: Unit) a. FromTo' u v a => u a -> v a
fromTo' v a
v :: u a))
{-# INLINE (.+~) #-}
infixr 5 .+~
(~+.) :: FromTo' u v a => u a -> v a -> v a
~+. :: forall (u :: Unit) (v :: Unit) a.
FromTo' u v a =>
u a -> v a -> v a
(~+.) = (v a -> u a -> v a) -> u a -> v a -> v a
forall a b c. (a -> b -> c) -> b -> a -> c
flip v a -> u a -> v a
forall (u :: Unit) (v :: Unit) a.
FromTo' v u a =>
u a -> v a -> u a
(.+~)
{-# INLINE (~+.) #-}
infixr 5 ~+.
(~+~) ::
( DimEq u v
, ConversionFactor u a, ConversionFactor v a
)
=> u a -> v a -> (BaseUnitOf u) a
u a
u ~+~ :: forall (u :: Unit) (v :: Unit) a.
(DimEq u v, ConversionFactor u a, ConversionFactor v a) =>
u a -> v a -> BaseUnitOf u a
~+~ v a
v = a -> DimToUnit (DimOf v) a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> DimToUnit (DimOf u) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' u a
u) a -> a -> a
forall a. Num a => a -> a -> a
+ DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> DimToUnit (DimOf v) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' v a
v))
{-# INLINE (~+~) #-}
infixr 5 ~+~
(.-~) :: forall u v a. FromTo' v u a => u a -> v a -> u a
u a
u .-~ :: forall (u :: Unit) (v :: Unit) a.
FromTo' v u a =>
u a -> v a -> u a
.-~ v a
v = a -> u a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity u a
u a -> a -> a
forall a. Num a => a -> a -> a
- u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> u a
forall (u :: Unit) (v :: Unit) a. FromTo' u v a => u a -> v a
fromTo' v a
v :: u a))
{-# INLINE (.-~) #-}
infixr 5 .-~
(~-.) :: forall u v a. FromTo' u v a => u a -> v a -> v a
u a
u ~-. :: forall (u :: Unit) (v :: Unit) a.
FromTo' u v a =>
u a -> v a -> v a
~-. v a
v = a -> v a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (v a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> v a
forall (u :: Unit) (v :: Unit) a. FromTo' u v a => u a -> v a
fromTo' u a
u :: v a) a -> a -> a
forall a. Num a => a -> a -> a
- v a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity v a
v)
infixr 5 ~-.
(~-~) ::
( DimEq u v
, ConversionFactor v a, ConversionFactor u a
)
=> u a -> v a -> (BaseUnitOf u) a
u a
u ~-~ :: forall (u :: Unit) (v :: Unit) a.
(DimEq u v, ConversionFactor v a, ConversionFactor u a) =>
u a -> v a -> BaseUnitOf u a
~-~ v a
v = a -> DimToUnit (DimOf u) a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (a -> DimToUnit (DimOf u) a) -> a -> DimToUnit (DimOf u) a
forall a b. (a -> b) -> a -> b
$ DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> DimToUnit (DimOf u) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' u a
u) a -> a -> a
forall a. Num a => a -> a -> a
- DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> DimToUnit (DimOf v) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' v a
v)
{-# INLINE (~-~) #-}
infixr 5 ~-~
(.*.) ::
( IsUnit u, IsUnit v
, Num a
)
=> u a -> v a -> (u .*. v) a
u a
u .*. :: forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, Num a) =>
u a -> v a -> (.*.) u v a
.*. v a
v = a -> (.*.) u v a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (a -> (.*.) u v a) -> a -> (.*.) u v a
forall a b. (a -> b) -> a -> b
$ u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity u a
u a -> a -> a
forall a. Num a => a -> a -> a
* v a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity v a
v
{-# INLINE (.*.) #-}
infixr 7 .*.
(.*~) :: forall u v a uv.
( uv ~ u .*~ v
, FromTo' (u .*. v) uv a
, IsUnit u, IsUnit v, IsUnit uv
, Num a
)
=> u a -> v a -> uv a
u a
u .*~ :: forall (u :: Unit) (v :: Unit) a (uv :: Unit).
(uv ~ (u .*~ v), FromTo' (u .*. v) uv a, IsUnit u, IsUnit v,
IsUnit uv, Num a) =>
u a -> v a -> uv a
.*~ v a
v = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @uv (u a
u u a -> v a -> (.*.) u v a
forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, Num a) =>
u a -> v a -> (.*.) u v a
.*. v a
v)
{-# INLINE (.*~) #-}
infixr 7 .*~
(~*.) :: forall u v a uv.
( uv ~ u ~*. v
, FromTo' (u .*. v) uv a
, IsUnit u, IsUnit v, IsUnit uv
, Num a
)
=> u a -> v a -> uv a
u a
u ~*. :: forall (u :: Unit) (v :: Unit) a (uv :: Unit).
(uv ~ (u ~*. v), FromTo' (u .*. v) uv a, IsUnit u, IsUnit v,
IsUnit uv, Num a) =>
u a -> v a -> uv a
~*. v a
v = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @uv (u a
u u a -> v a -> (.*.) u v a
forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, Num a) =>
u a -> v a -> (.*.) u v a
.*. v a
v)
{-# INLINE (~*.) #-}
infixr 7 ~*.
(~*~) ::
( u2 ~ BaseUnitOf u .^+ 2, IsUnit u2
, DimEq u v
, ConversionFactor u a, ConversionFactor v a
)
=> u a -> v a -> u2 a
u a
u ~*~ :: forall (u2 :: Unit) (u :: Unit) (v :: Unit) a.
(u2 ~ (BaseUnitOf u .^+ 2), IsUnit u2, DimEq u v,
ConversionFactor u a, ConversionFactor v a) =>
u a -> v a -> u2 a
~*~ v a
v = a -> u2 a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (a -> u2 a) -> a -> u2 a
forall a b. (a -> b) -> a -> b
$ DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> BaseUnitOf u a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' u a
u) a -> a -> a
forall a. Num a => a -> a -> a
* DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> DimToUnit (DimOf v) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' v a
v)
{-# INLINE (~*~) #-}
infix 7 ~*~
(./.) ::
( IsUnit u, IsUnit v, IsUnit (u ./. v)
, Fractional a
)
=> u a -> v a -> (u ./. v) a
u a
u ./. :: forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, IsUnit (u ./. v), Fractional a) =>
u a -> v a -> (./.) u v a
./. v a
v = a -> (.*.) u (InverseUnit v) a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity u a
u a -> a -> a
forall a. Fractional a => a -> a -> a
/ v a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity v a
v)
{-# INLINE (./.) #-}
infix 7 ./.
(./~) :: forall u v a uv.
( uv ~ u ./~ v
, FromTo' (u ./. v) uv a
, IsUnit u, IsUnit v, IsUnit uv
, Num a
)
=> u a -> v a -> uv a
u a
u ./~ :: forall (u :: Unit) (v :: Unit) a (uv :: Unit).
(uv ~ (u ./~ v), FromTo' (u ./. v) uv a, IsUnit u, IsUnit v,
IsUnit uv, Num a) =>
u a -> v a -> uv a
./~ v a
v = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @uv (u a
u u a -> v a -> (./.) u v a
forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, IsUnit (u ./. v), Fractional a) =>
u a -> v a -> (./.) u v a
./. v a
v)
{-# INLINE (./~) #-}
infix 7 ./~
(~/.) :: forall u v a uv.
( uv ~ u ~/. v
, FromTo' (u ./. v) uv a
, IsUnit u, IsUnit v, IsUnit uv
, Num a
)
=> u a -> v a -> uv a
u a
u ~/. :: forall (u :: Unit) (v :: Unit) a (uv :: Unit).
(uv ~ (u ~/. v), FromTo' (u ./. v) uv a, IsUnit u, IsUnit v,
IsUnit uv, Num a) =>
u a -> v a -> uv a
~/. v a
v = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @uv (u a
u u a -> v a -> (./.) u v a
forall (u :: Unit) (v :: Unit) a.
(IsUnit u, IsUnit v, IsUnit (u ./. v), Fractional a) =>
u a -> v a -> (./.) u v a
./. v a
v)
{-# INLINE (~/.) #-}
infix 7 ~/.
(~/~) ::
( DimEq u v
, ConversionFactor u a, ConversionFactor v a
)
=> u a -> v a -> NoUnit a
u a
u ~/~ :: forall (u :: Unit) (v :: Unit) a.
(DimEq u v, ConversionFactor u a, ConversionFactor v a) =>
u a -> v a -> NoUnit a
~/~ v a
v = a -> NoUnit a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (a -> NoUnit a) -> a -> NoUnit a
forall a b. (a -> b) -> a -> b
$ DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> BaseUnitOf u a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' u a
u) a -> a -> a
forall a. Fractional a => a -> a -> a
/ DimToUnit (DimOf v) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (v a -> DimToUnit (DimOf v) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' v a
v)
{-# INLINE (~/~) #-}
infix 6 ~/~
(.^.) :: forall (n :: ZZ) proxy u a. (IsUnit u, KnownInt n, Fractional a)
=> u a -> proxy n -> (u .^. n) a
u a
u .^. :: forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) a.
(IsUnit u, KnownInt n, Fractional a) =>
u a -> proxy n -> (.^.) u n a
.^. proxy n
p = a -> (.^.) u n a
forall (u :: Unit) a. IsUnit u => a -> u a
quantity (a -> (.^.) u n a) -> a -> (.^.) u n a
forall a b. (a -> b) -> a -> b
$ u a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity u a
u a -> Integer -> a
forall a b. (Fractional a, Integral b) => a -> b -> a
^^ proxy n -> Integer
forall (r :: ZZ) (proxy :: ZZ -> *).
KnownInt r =>
proxy r -> Integer
forall (proxy :: ZZ -> *). proxy n -> Integer
intVal proxy n
p
{-# INLINE (.^.) #-}
infix 8 .^.
(~^.) :: forall (n :: ZZ) proxy u a un.
(un ~ u ~^. n, FromTo' (u .^. n) un a, IsUnit u, KnownInt n, Fractional a)
=> u a -> proxy n -> un a
u a
u ~^. :: forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) a (un :: Unit).
(un ~ (u ~^. n), FromTo' (u .^. n) un a, IsUnit u, KnownInt n,
Fractional a) =>
u a -> proxy n -> un a
~^. proxy n
p = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @un (u a
u u a -> proxy n -> (.^.) u n a
forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) a.
(IsUnit u, KnownInt n, Fractional a) =>
u a -> proxy n -> (.^.) u n a
.^. proxy n
p)
{-# INLINE (~^.) #-}
infix 8 ~^.
(.^~ ) :: forall (n :: ZZ) proxy u a un.
(un ~ u .^~ n, FromTo' (u .^. n) un a, IsUnit u, KnownInt n, Fractional a)
=> u a -> proxy n -> un a
u a
u .^~ :: forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) a (un :: Unit).
(un ~ (u .^~ n), FromTo' (u .^. n) un a, IsUnit u, KnownInt n,
Fractional a) =>
u a -> proxy n -> un a
.^~ proxy n
p = forall (v :: Unit) (u :: Unit) a. FromTo' u v a => u a -> v a
to' @un (u a
u u a -> proxy n -> (.^.) u n a
forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) a.
(IsUnit u, KnownInt n, Fractional a) =>
u a -> proxy n -> (.^.) u n a
.^. proxy n
p)
{-# INLINE (.^~ ) #-}
infix 8 .^~
(~^~) :: forall (n :: ZZ) proxy u un a.
(KnownInt n, ConversionFactor u a, un ~ BaseUnitOf u .^. n )
=> u a -> proxy n -> un a
u a
u ~^~ :: forall (n :: ZZ) (proxy :: ZZ -> *) (u :: Unit) (un :: Unit) a.
(KnownInt n, ConversionFactor u a, un ~ (BaseUnitOf u .^. n)) =>
u a -> proxy n -> un a
~^~ proxy n
p = forall (u :: Unit) a. IsUnit u => a -> u a
quantity @un (a -> un a) -> a -> un a
forall a b. (a -> b) -> a -> b
$ DimToUnit (DimOf u) a -> a
forall (u :: Unit) a. IsUnit u => u a -> a
unQuantity (u a -> DimToUnit (DimOf u) a
forall (u :: Unit) a. ConversionFactor u a => u a -> BaseUnitOf u a
toBaseUnit' u a
u) a -> Integer -> a
forall a b. (Fractional a, Integral b) => a -> b -> a
^^ proxy n -> Integer
forall (r :: ZZ) (proxy :: ZZ -> *).
KnownInt r =>
proxy r -> Integer
forall (proxy :: ZZ -> *). proxy n -> Integer
intVal proxy n
p
{-# INLINE (~^~) #-}
infix 8 ~^~