{-# LANGUAGE EmptyDataDecls, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module STD.MapIterator.Template where import Foreign.C.Types import Foreign.Ptr import FFICXX.Runtime.Cast import STD.Pair.Template data RawMapIterator tpk tpv newtype MapIterator tpk tpv = MapIterator (Ptr (RawMapIterator tpk tpv)) class () => IMapIterator tpk tpv where deRef :: MapIterator tpk tpv -> IO (Pair tpk tpv) increment :: MapIterator tpk tpv -> IO (MapIterator tpk tpv) instance () => FPtr (MapIterator tpk tpv) where type Raw (MapIterator tpk tpv) = RawMapIterator tpk tpv get_fptr (MapIterator ptr) = ptr cast_fptr_to_obj = MapIterator instance () => Castable (MapIterator tpk tpv) (Ptr (RawMapIterator tpk tpv)) where cast x f = f (castPtr (get_fptr x)) uncast x f = f (cast_fptr_to_obj (castPtr x))