{-# LANGUAGE EmptyDataDecls, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module STD.Pair.Template where import Foreign.C.Types import Foreign.Ptr import FFICXX.Runtime.Cast data RawPair tp1 tp2 newtype Pair tp1 tp2 = Pair (Ptr (RawPair tp1 tp2)) class () => IPair tp1 tp2 where newPair :: tp1 -> tp2 -> IO (Pair tp1 tp2) deletePair :: Pair tp1 tp2 -> IO () first_get :: Pair tp1 tp2 -> IO tp1 first_set :: Pair tp1 tp2 -> tp1 -> IO () second_get :: Pair tp1 tp2 -> IO tp2 second_set :: Pair tp1 tp2 -> tp2 -> IO () instance () => FPtr (Pair tp1 tp2) where type Raw (Pair tp1 tp2) = RawPair tp1 tp2 get_fptr (Pair ptr) = ptr cast_fptr_to_obj = Pair instance () => Castable (Pair tp1 tp2) (Ptr (RawPair tp1 tp2)) where cast x f = f (castPtr (get_fptr x)) uncast x f = f (cast_fptr_to_obj (castPtr x))