{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module LLVM.Extra.Nice.Vector.Instance where

import qualified LLVM.Extra.Nice.Vector as Vector
import qualified LLVM.Extra.Nice.Value.Private as NiceValue
import LLVM.Extra.Nice.Value.Private (Repr, )

import qualified LLVM.Core as LLVM

import qualified Type.Data.Num.Decimal as TypeNum

import Data.Functor ((<$>), )

import Prelude2010
import Prelude ()


type NVVector n a = NiceValue.T (LLVM.Vector n a)

toNiceValue :: Vector.T n a -> NVVector n a
toNiceValue :: forall n a. T n a -> NVVector n a
toNiceValue (Vector.Cons Repr n a
x) = Repr (Vector n a) -> T (Vector n a)
forall a. Repr a -> T a
NiceValue.Cons Repr (Vector n a)
Repr n a
x

fromNiceValue :: NVVector n a -> Vector.T n a
fromNiceValue :: forall n a. NVVector n a -> T n a
fromNiceValue (NiceValue.Cons Repr (Vector n a)
x) = Repr n a -> T n a
forall n a. Repr n a -> T n a
Vector.Cons Repr (Vector n a)
Repr n a
x

liftNiceValueM ::
   (Functor f) =>
   (Vector.T n a -> f (Vector.T m b)) ->
   (NVVector n a -> f (NVVector m b))
liftNiceValueM :: forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> f (T m b)
f NVVector n a
a =
   T m b -> NVVector m b
forall n a. T n a -> NVVector n a
toNiceValue (T m b -> NVVector m b) -> f (T m b) -> f (NVVector m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> f (T m b)
f (NVVector n a -> T n a
forall n a. NVVector n a -> T n a
fromNiceValue NVVector n a
a)

liftNiceValueM2 ::
   (Functor f) =>
   (Vector.T n a -> Vector.T m b -> f (Vector.T k c)) ->
   (NVVector n a -> NVVector m b -> f (NVVector k c))
liftNiceValueM2 :: forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T m b -> f (T k c)
f NVVector n a
a NVVector m b
b =
   T k c -> NVVector k c
forall n a. T n a -> NVVector n a
toNiceValue (T k c -> NVVector k c) -> f (T k c) -> f (NVVector k c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> T m b -> f (T k c)
f (NVVector n a -> T n a
forall n a. NVVector n a -> T n a
fromNiceValue NVVector n a
a) (NVVector m b -> T m b
forall n a. NVVector n a -> T n a
fromNiceValue NVVector m b
b)

liftNiceValueM3 ::
   (Functor f) =>
   (Vector.T n a -> Vector.T m b -> Vector.T m c -> f (Vector.T k d)) ->
   (NVVector n a -> NVVector m b -> NVVector m c -> f (NVVector k d))
liftNiceValueM3 :: forall (f :: * -> *) n a m b c k d.
Functor f =>
(T n a -> T m b -> T m c -> f (T k d))
-> NVVector n a -> NVVector m b -> NVVector m c -> f (NVVector k d)
liftNiceValueM3 T n a -> T m b -> T m c -> f (T k d)
f NVVector n a
a NVVector m b
b NVVector m c
c =
   T k d -> NVVector k d
forall n a. T n a -> NVVector n a
toNiceValue (T k d -> NVVector k d) -> f (T k d) -> f (NVVector k d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> T m b -> T m c -> f (T k d)
f (NVVector n a -> T n a
forall n a. NVVector n a -> T n a
fromNiceValue NVVector n a
a) (NVVector m b -> T m b
forall n a. NVVector n a -> T n a
fromNiceValue NVVector m b
b) (NVVector m c -> T m c
forall n a. NVVector n a -> T n a
fromNiceValue NVVector m c
c)

instance
   (TypeNum.Positive n, Vector.C a) =>
      NiceValue.C (LLVM.Vector n a) where
   type Repr (LLVM.Vector n a) = Vector.Repr n a
   cons :: Vector n a -> T (Vector n a)
cons = T n a -> T (Vector n a)
forall n a. T n a -> NVVector n a
toNiceValue (T n a -> T (Vector n a))
-> (Vector n a -> T n a) -> Vector n a -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector n a -> T n a
forall n. Positive n => Vector n a -> T n a
forall a n. (C a, Positive n) => Vector n a -> T n a
Vector.cons
   undef :: T (Vector n a)
undef = T n a -> T (Vector n a)
forall n a. T n a -> NVVector n a
toNiceValue T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
Vector.undef
   zero :: T (Vector n a)
zero = T n a -> T (Vector n a)
forall n a. T n a -> NVVector n a
toNiceValue T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
Vector.zero
   phi :: forall r.
BasicBlock -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
phi = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM ((T n a -> CodeGenFunction r (T n a))
 -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)))
-> (BasicBlock -> T n a -> CodeGenFunction r (T n a))
-> BasicBlock
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
Vector.phi
   addPhi :: forall r.
BasicBlock
-> T (Vector n a) -> T (Vector n a) -> CodeGenFunction r ()
addPhi BasicBlock
bb T (Vector n a)
x T (Vector n a)
y = BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
Vector.addPhi BasicBlock
bb (T (Vector n a) -> T n a
forall n a. NVVector n a -> T n a
fromNiceValue T (Vector n a)
x) (T (Vector n a) -> T n a
forall n a. NVVector n a -> T n a
fromNiceValue T (Vector n a)
y)

instance
   (TypeNum.Positive n, Vector.IntegerConstant a) =>
      NiceValue.IntegerConstant (LLVM.Vector n a) where
   fromInteger' :: Integer -> T (Vector n a)
fromInteger' = T n a -> T (Vector n a)
forall n a. T n a -> NVVector n a
toNiceValue (T n a -> T (Vector n a))
-> (Integer -> T n a) -> Integer -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> T n a
forall n. Positive n => Integer -> T n a
forall a n. (IntegerConstant a, Positive n) => Integer -> T n a
Vector.fromInteger'

instance
   (TypeNum.Positive n, Vector.RationalConstant a) =>
      NiceValue.RationalConstant (LLVM.Vector n a) where
   fromRational' :: Rational -> T (Vector n a)
fromRational' = T n a -> T (Vector n a)
forall n a. T n a -> NVVector n a
toNiceValue (T n a -> T (Vector n a))
-> (Rational -> T n a) -> Rational -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> T n a
forall n. Positive n => Rational -> T n a
forall a n. (RationalConstant a, Positive n) => Rational -> T n a
Vector.fromRational'

instance
   (TypeNum.Positive n, Vector.Additive a) =>
      NiceValue.Additive (LLVM.Vector n a) where
   add :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
add = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.add
   sub :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
sub = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.sub
   neg :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
neg = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.neg

instance
   (TypeNum.Positive n, Vector.PseudoRing a) =>
      NiceValue.PseudoRing (LLVM.Vector n a) where
   mul :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
mul = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(PseudoRing a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.mul

instance
   (TypeNum.Positive n, Vector.Real a) =>
      NiceValue.Real (LLVM.Vector n a) where
   min :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
min = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.min
   max :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
max = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.max
   abs :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
abs = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.abs
   signum :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
signum = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.signum

instance
   (TypeNum.Positive n, Vector.Fraction a) =>
      NiceValue.Fraction (LLVM.Vector n a) where
   truncate :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
truncate = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.truncate
   fraction :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
fraction = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.fraction

instance
   (TypeNum.Positive n, Vector.Logic a) =>
      NiceValue.Logic (LLVM.Vector n a) where
   and :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
and = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.and
   or :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
or = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.or
   xor :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
xor = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.xor
   inv :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
inv = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> NVVector n a -> f (NVVector m b)
liftNiceValueM T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
Vector.inv

instance
   (TypeNum.Positive n, Vector.BitShift a) =>
      NiceValue.BitShift (LLVM.Vector n a) where
   shl :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
shl = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(BitShift a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.shl
   shr :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
shr = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> NVVector n a -> NVVector m b -> f (NVVector k c)
liftNiceValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(BitShift a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
Vector.shr