{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module LLVM.Extra.Multi.Class where

import qualified LLVM.Extra.Multi.Value as MultiValue
import qualified LLVM.Extra.Multi.Vector as MultiVector
import qualified LLVM.Extra.Arithmetic as A

import qualified LLVM.Core as LLVM

import qualified Type.Data.Num.Decimal as TypeNum


class C value where
   type Size value
   switch ::
      f MultiValue.T ->
      f (MultiVector.T (Size value)) ->
      f value

instance C MultiValue.T where
   type Size MultiValue.T = TypeNum.D1
   switch :: forall (f :: (* -> *) -> *). f T -> f (T (Size T)) -> f T
switch f T
x f (T (Size T))
_ = f T
x

instance (TypeNum.Positive n) => C (MultiVector.T n) where
   type Size (MultiVector.T n) = n
   switch :: forall (f :: (* -> *) -> *). f T -> f (T (Size (T n))) -> f (T n)
switch f T
_ f (T (Size (T n)))
x = f (T n)
f (T (Size (T n)))
x


newtype Const a value = Const {forall a (value :: * -> *). Const a value -> value a
getConst :: value a}

undef ::
   (C value, Size value ~ n, TypeNum.Positive n, MultiVector.C a) =>
   value a
undef :: forall (value :: * -> *) n a.
(C value, Size value ~ n, Positive n, C a) =>
value a
undef =
   Const a value -> value a
forall a (value :: * -> *). Const a value -> value a
getConst (Const a value -> value a) -> Const a value -> value a
forall a b. (a -> b) -> a -> b
$
   Const a T -> Const a (T (Size value)) -> Const a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch
      (T a -> Const a T
forall a (value :: * -> *). value a -> Const a value
Const T a
forall a. C a => T a
MultiValue.undef)
      (T n a -> Const a (T n)
forall a (value :: * -> *). value a -> Const a value
Const T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
MultiVector.undef)

zero ::
   (C value, Size value ~ n, TypeNum.Positive n, MultiVector.C a) =>
   value a
zero :: forall (value :: * -> *) n a.
(C value, Size value ~ n, Positive n, C a) =>
value a
zero =
   Const a value -> value a
forall a (value :: * -> *). Const a value -> value a
getConst (Const a value -> value a) -> Const a value -> value a
forall a b. (a -> b) -> a -> b
$
   Const a T -> Const a (T (Size value)) -> Const a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch
      (T a -> Const a T
forall a (value :: * -> *). value a -> Const a value
Const T a
forall a. C a => T a
MultiValue.zero)
      (T n a -> Const a (T n)
forall a (value :: * -> *). value a -> Const a value
Const T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
MultiVector.zero)


newtype
   Op0 r a value =
      Op0 {forall r a (value :: * -> *).
Op0 r a value -> CodeGenFunction r (value a)
runOp0 :: LLVM.CodeGenFunction r (value a)}

newtype
   Op1 r a b value =
      Op1 {forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 :: value a -> LLVM.CodeGenFunction r (value b)}

newtype
   Op2 r a b c value =
      Op2 {forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 :: value a -> value b -> LLVM.CodeGenFunction r (value c)}

add, sub ::
   (TypeNum.Positive n, MultiVector.Additive a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
add :: forall n a (value :: * -> *) r.
(Positive n, Additive a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
add = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.add) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.add)
sub :: forall n a (value :: * -> *) r.
(Positive n, Additive a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
sub = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.sub) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.sub)

neg ::
   (TypeNum.Positive n, MultiVector.Additive a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
neg :: forall n a (value :: * -> *) r.
(Positive n, Additive a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
neg = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Additive a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.neg) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Additive a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.neg)


mul ::
   (TypeNum.Positive n, MultiVector.PseudoRing a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
mul :: forall n a (value :: * -> *) r.
(Positive n, PseudoRing a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
mul = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.mul) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.mul)
fdiv ::
   (TypeNum.Positive n, MultiVector.Field a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
fdiv :: forall n a (value :: * -> *) r.
(Positive n, Field a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
fdiv = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Field a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.fdiv) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Field a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.fdiv)

scale ::
   (TypeNum.Positive n, MultiVector.PseudoModule v,
    n ~ Size value, C value) =>
   value (MultiValue.Scalar v) -> value v -> LLVM.CodeGenFunction r (value v)
scale :: forall n v (value :: * -> *) r.
(Positive n, PseudoModule v, n ~ Size value, C value) =>
value (Scalar v) -> value v -> CodeGenFunction r (value v)
scale = Op2 r (Scalar v) v v value
-> value (Scalar v) -> value v -> CodeGenFunction r (value v)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r (Scalar v) v v value
 -> value (Scalar v) -> value v -> CodeGenFunction r (value v))
-> Op2 r (Scalar v) v v value
-> value (Scalar v)
-> value v
-> CodeGenFunction r (value v)
forall a b. (a -> b) -> a -> b
$ Op2 r (Scalar v) v v T
-> Op2 r (Scalar v) v v (T (Size value))
-> Op2 r (Scalar v) v v value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T (Scalar v) -> T v -> CodeGenFunction r (T v))
-> Op2 r (Scalar v) v v T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 Scalar (T v) -> T v -> CodeGenFunction r (T v)
T (Scalar v) -> T v -> CodeGenFunction r (T v)
forall v r. PseudoModule v => Scalar v -> v -> CodeGenFunction r v
forall r. Scalar (T v) -> T v -> CodeGenFunction r (T v)
A.scale) ((T n (Scalar v) -> T n v -> CodeGenFunction r (T n v))
-> Op2 r (Scalar v) v v (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 Scalar (T n v) -> T n v -> CodeGenFunction r (T n v)
T n (Scalar v) -> T n v -> CodeGenFunction r (T n v)
forall v r. PseudoModule v => Scalar v -> v -> CodeGenFunction r v
forall r. Scalar (T n v) -> T n v -> CodeGenFunction r (T n v)
A.scale)

min, max ::
   (TypeNum.Positive n, MultiVector.Real a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
min :: forall n a (value :: * -> *) r.
(Positive n, Real a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
min = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.min) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.min)
max :: forall n a (value :: * -> *) r.
(Positive n, Real a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
max = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.max) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.max)

abs, signum ::
   (TypeNum.Positive n, MultiVector.Real a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
abs :: forall n a (value :: * -> *) r.
(Positive n, Real a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
abs = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Real a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.abs) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Real a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.abs)
signum :: forall n a (value :: * -> *) r.
(Positive n, Real a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
signum = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Real a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.signum) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Real a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.signum)

truncate, fraction ::
   (TypeNum.Positive n, MultiVector.Fraction a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
truncate :: forall n a (value :: * -> *) r.
(Positive n, Fraction a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
truncate = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Fraction a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.truncate) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Fraction a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.truncate)
fraction :: forall n a (value :: * -> *) r.
(Positive n, Fraction a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
fraction = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Fraction a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.fraction) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Fraction a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.fraction)

sqrt ::
   (TypeNum.Positive n, MultiVector.Algebraic a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
sqrt :: forall n a (value :: * -> *) r.
(Positive n, Algebraic a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
sqrt = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Algebraic a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.sqrt) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Algebraic a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.sqrt)

pi ::
   (TypeNum.Positive n, MultiVector.Transcendental a,
    n ~ Size value, C value) =>
   LLVM.CodeGenFunction r (value a)
pi :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
CodeGenFunction r (value a)
pi = Op0 r a value -> CodeGenFunction r (value a)
forall r a (value :: * -> *).
Op0 r a value -> CodeGenFunction r (value a)
runOp0 (Op0 r a value -> CodeGenFunction r (value a))
-> Op0 r a value -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op0 r a T -> Op0 r a (T (Size value)) -> Op0 r a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch (CodeGenFunction r (T a) -> Op0 r a T
forall r a (value :: * -> *).
CodeGenFunction r (value a) -> Op0 r a value
Op0 CodeGenFunction r (T a)
forall r. CodeGenFunction r (T a)
forall a r. Transcendental a => CodeGenFunction r a
A.pi) (CodeGenFunction r (T n a) -> Op0 r a (T n)
forall r a (value :: * -> *).
CodeGenFunction r (value a) -> Op0 r a value
Op0 CodeGenFunction r (T n a)
forall r. CodeGenFunction r (T n a)
forall a r. Transcendental a => CodeGenFunction r a
A.pi)

sin, cos, exp, log ::
   (TypeNum.Positive n, MultiVector.Transcendental a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
sin :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
sin = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.sin) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.sin)
cos :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
cos = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.cos) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.cos)
exp :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
exp = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.exp) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.exp)
log :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
log = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.log) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Transcendental a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.log)

pow ::
   (TypeNum.Positive n, MultiVector.Transcendental a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
pow :: forall n a (value :: * -> *) r.
(Positive n, Transcendental a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
pow = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.pow) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Transcendental a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.pow)


cmp ::
   (TypeNum.Positive n, MultiVector.Comparison a,
    n ~ Size value, C value) =>
   LLVM.CmpPredicate ->
   value a -> value a -> LLVM.CodeGenFunction r (value Bool)
cmp :: forall n a (value :: * -> *) r.
(Positive n, Comparison a, n ~ Size value, C value) =>
CmpPredicate
-> value a -> value a -> CodeGenFunction r (value Bool)
cmp CmpPredicate
p = Op2 r a a Bool value
-> value a -> value a -> CodeGenFunction r (value Bool)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a Bool value
 -> value a -> value a -> CodeGenFunction r (value Bool))
-> Op2 r a a Bool value
-> value a
-> value a
-> CodeGenFunction r (value Bool)
forall a b. (a -> b) -> a -> b
$ Op2 r a a Bool T
-> Op2 r a a Bool (T (Size value)) -> Op2 r a a Bool value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T)
-> (T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T
forall a b. (a -> b) -> a -> b
$ CmpPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a))
forall r.
CmpPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a))
forall a r.
Comparison a =>
CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.cmp CmpPredicate
p) ((T (Size value) a
 -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
-> Op2 r a a Bool (T (Size value))
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 ((T (Size value) a
  -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
 -> Op2 r a a Bool (T (Size value)))
-> (T (Size value) a
    -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
-> Op2 r a a Bool (T (Size value))
forall a b. (a -> b) -> a -> b
$ CmpPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
forall r.
CmpPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
forall a r.
Comparison a =>
CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.cmp CmpPredicate
p)

fcmp ::
   (TypeNum.Positive n, MultiVector.FloatingComparison a,
    n ~ Size value, C value) =>
   LLVM.FPPredicate ->
   value a -> value a -> LLVM.CodeGenFunction r (value Bool)
fcmp :: forall n a (value :: * -> *) r.
(Positive n, FloatingComparison a, n ~ Size value, C value) =>
FPPredicate -> value a -> value a -> CodeGenFunction r (value Bool)
fcmp FPPredicate
p = Op2 r a a Bool value
-> value a -> value a -> CodeGenFunction r (value Bool)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a Bool value
 -> value a -> value a -> CodeGenFunction r (value Bool))
-> Op2 r a a Bool value
-> value a
-> value a
-> CodeGenFunction r (value Bool)
forall a b. (a -> b) -> a -> b
$ Op2 r a a Bool T
-> Op2 r a a Bool (T (Size value)) -> Op2 r a a Bool value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T)
-> (T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T
forall a b. (a -> b) -> a -> b
$ FPPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a))
forall r.
FPPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a))
forall a r.
FloatingComparison a =>
FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.fcmp FPPredicate
p) ((T (Size value) a
 -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
-> Op2 r a a Bool (T (Size value))
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 ((T (Size value) a
  -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
 -> Op2 r a a Bool (T (Size value)))
-> (T (Size value) a
    -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool))
-> Op2 r a a Bool (T (Size value))
forall a b. (a -> b) -> a -> b
$ FPPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
forall r.
FPPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
forall a r.
FloatingComparison a =>
FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.fcmp FPPredicate
p)


and, or, xor ::
   (TypeNum.Positive n, MultiVector.Logic a,
    n ~ Size value, C value) =>
   value a -> value a -> LLVM.CodeGenFunction r (value a)
and :: forall n a (value :: * -> *) r.
(Positive n, Logic a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
and = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.and) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.and)
or :: forall n a (value :: * -> *) r.
(Positive n, Logic a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
or = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.or) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.or)
xor :: forall n a (value :: * -> *) r.
(Positive n, Logic a, n ~ Size value, C value) =>
value a -> value a -> CodeGenFunction r (value a)
xor = Op2 r a a a value
-> value a -> value a -> CodeGenFunction r (value a)
forall r a b c (value :: * -> *).
Op2 r a b c value
-> value a -> value b -> CodeGenFunction r (value c)
runOp2 (Op2 r a a a value
 -> value a -> value a -> CodeGenFunction r (value a))
-> Op2 r a a a value
-> value a
-> value a
-> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.xor) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n)
forall r a b c (value :: * -> *).
(value a -> value b -> CodeGenFunction r (value c))
-> Op2 r a b c value
Op2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Logic a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.xor)

inv ::
   (TypeNum.Positive n, MultiVector.Logic a,
    n ~ Size value, C value) =>
   value a -> LLVM.CodeGenFunction r (value a)
inv :: forall n a (value :: * -> *) r.
(Positive n, Logic a, n ~ Size value, C value) =>
value a -> CodeGenFunction r (value a)
inv = Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall r a b (value :: * -> *).
Op1 r a b value -> value a -> CodeGenFunction r (value b)
runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a))
-> Op1 r a a value -> value a -> CodeGenFunction r (value a)
forall a b. (a -> b) -> a -> b
$ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value
forall (value :: * -> *) (f :: (* -> *) -> *).
C value =>
f T -> f (T (Size value)) -> f value
forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value
switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T a -> CodeGenFunction r (T a)
forall a r. Logic a => a -> CodeGenFunction r a
forall r. T a -> CodeGenFunction r (T a)
A.inv) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n)
forall r a b (value :: * -> *).
(value a -> CodeGenFunction r (value b)) -> Op1 r a b value
Op1 T n a -> CodeGenFunction r (T n a)
forall a r. Logic a => a -> CodeGenFunction r a
forall r. T n a -> CodeGenFunction r (T n a)
A.inv)