
Hello, I end up with this and it works :) thanks
type H5Iterate a = HId_t -> CString -> In H5L_info_t -> InOut a -> IO HErr_t
foreign import ccall "wrapper" mkOp :: H5Iterate a -> IO (FunPtr (H5Iterate a))
nxEntries ∷ FilePath → IO [String]
nxEntries f = withH5File f $ \h → do
state <- newIORef []
statePtr <- newStablePtr state
let opData = InOut $ castStablePtrToPtr statePtr
let startIndex = Nothing
let indexType = ByName
let order = Native
iop <- mkOp callback
_ <- withInOut_ (maybe 0 hSize startIndex) $ \ioStartIndex ->
h5l_iterate (hid h) (indexTypeCode indexType) (iterOrderCode order) ioStartIndex iop opData
freeHaskellFunPtr iop
freeStablePtr statePtr
-- retrieve the final state
readIORef state
where
callback ∷ H5Iterate a
callback _g n _i (InOut dataptr) =
do
let opData = castWrappedPtr dataptr
-- get the state
stRef <- deRefStablePtr (castPtrToStablePtr opData)
st <- readIORef stRef
-- compute the new state
name <- peekCString n
let newSt = st ++ [name]
print st
print name
print newSt
-- store the new state
writeIORef stRef newSt
return $ HErr_t 0
BUT I lose the type checking at the callback interface.
the ffi call of the h5l_iterate method is
#ccall H5Literate,