{-# 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)