module LLVM.Extra.Multi.Vector.Instance where
import qualified LLVM.Extra.Multi.Vector as Vector
import qualified LLVM.Extra.Multi.Value.Private as MultiValue
import LLVM.Extra.Multi.Value.Private (Repr, )
import qualified LLVM.Core as LLVM
import qualified Type.Data.Num.Decimal as TypeNum
import Data.Functor.Compose (Compose, )
import Data.Functor ((<$>), )
import Prelude2010
import Prelude ()
type MVVector n a = MultiValue.T (LLVM.Vector n a)
toMultiValue :: Vector.T n a -> MVVector n a
toMultiValue (Vector.Cons x) = MultiValue.Cons x
fromMultiValue :: MVVector n a -> Vector.T n a
fromMultiValue (MultiValue.Cons x) = Vector.Cons x
liftMultiValueM ::
(Functor f) =>
(Vector.T n a -> f (Vector.T m b)) ->
(MVVector n a -> f (MVVector m b))
liftMultiValueM f a =
toMultiValue <$> f (fromMultiValue a)
liftMultiValueM2 ::
(Functor f) =>
(Vector.T n a -> Vector.T m b -> f (Vector.T k c)) ->
(MVVector n a -> MVVector m b -> f (MVVector k c))
liftMultiValueM2 f a b =
toMultiValue <$> f (fromMultiValue a) (fromMultiValue b)
liftMultiValueM3 ::
(Functor f) =>
(Vector.T n a -> Vector.T m b -> Vector.T m c -> f (Vector.T k d)) ->
(MVVector n a -> MVVector m b -> MVVector m c -> f (MVVector k d))
liftMultiValueM3 f a b c =
toMultiValue <$> f (fromMultiValue a) (fromMultiValue b) (fromMultiValue c)
instance
(TypeNum.Positive n, Vector.C a) =>
MultiValue.C (LLVM.Vector n a) where
type Repr f (LLVM.Vector n a) = Repr (Compose f (LLVM.Vector n)) a
cons = toMultiValue . Vector.cons
undef = toMultiValue Vector.undef
zero = toMultiValue Vector.zero
phis = liftMultiValueM . Vector.phis
addPhis bb x y = Vector.addPhis bb (fromMultiValue x) (fromMultiValue y)
instance
(TypeNum.Positive n, Vector.IntegerConstant a) =>
MultiValue.IntegerConstant (LLVM.Vector n a) where
fromInteger' = toMultiValue . Vector.fromInteger'
instance
(TypeNum.Positive n, Vector.RationalConstant a) =>
MultiValue.RationalConstant (LLVM.Vector n a) where
fromRational' = toMultiValue . Vector.fromRational'
instance
(TypeNum.Positive n, Vector.Additive a) =>
MultiValue.Additive (LLVM.Vector n a) where
add = liftMultiValueM2 Vector.add
sub = liftMultiValueM2 Vector.sub
neg = liftMultiValueM Vector.neg
instance
(TypeNum.Positive n, Vector.Logic a) =>
MultiValue.Logic (LLVM.Vector n a) where
and = liftMultiValueM2 Vector.and
or = liftMultiValueM2 Vector.or
xor = liftMultiValueM2 Vector.xor
inv = liftMultiValueM Vector.inv
instance
(TypeNum.Positive n, Vector.BitShift a) =>
MultiValue.BitShift (LLVM.Vector n a) where
shl = liftMultiValueM2 Vector.shl
shr = liftMultiValueM2 Vector.shr