packages feed

llvm-extra-0.5: src/LLVM/Extra/Multi/Value.hs

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

import qualified LLVM.Extra.Class as Class

import Prelude hiding (zip, zip3, unzip, unzip3, )


newtype T a = Cons (Class.ValueTuple a)


valueOf :: (Class.MakeValueTuple a) => a -> T a
valueOf = Cons . Class.valueTupleOf

undef :: (Class.Undefined al, al ~ Class.ValueTuple a) => T a
undef = Cons Class.undefTuple


zip :: T a -> T b -> T (a,b)
zip (Cons a) (Cons b) = Cons (a,b)

zip3 :: T a -> T b -> T c -> T (a,b,c)
zip3 (Cons a) (Cons b) (Cons c) = Cons (a,b,c)

unzip :: T (a,b) -> (T a, T b)
unzip (Cons (a,b)) = (Cons a, Cons b)

unzip3 :: T (a,b,c) -> (T a, T b, T c)
unzip3 (Cons (a,b,c)) = (Cons a, Cons b, Cons c)