<div dir="ltr"><div><div>Hi,<br><br></div>In these cases, I write the explicitly recursive version (e.g. getList1) and look for a pattern (e.g. getList2).<br><br>getList1 :: Ptr List -> IO [Ptr Item]<br>getList1 l = c_get_first_item l >>= go<br>   where<br>      go e<br>         | e == nullPtr = return []<br>         | otherwise    = do<br>               next <- c_get_next_item l e<br>               es   <- go next<br>               return (e:es)<br><br><br><br>getList2 :: Ptr List -> IO [Ptr Item]<br>getList2 l = c_get_first_item l >>= unfoldrM go<br>   where<br>      go e<br>         | e == nullPtr = return Nothing<br>         | otherwise    = do<br>               next <- c_get_next_item l e<br>               return (Just (e,next))<br><br></div><div>I hope it helps<br></div>Sylvain<br><div><br><br><div class="gmail_extra"><br><div class="gmail_quote">2016-02-11 12:02 GMT+01:00 PICCA Frederic-Emmanuel <span dir="ltr"><<a href="mailto:frederic-emmanuel.picca@synchrotron-soleil.fr" target="_blank">frederic-emmanuel.picca@synchrotron-soleil.fr</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I am playing with FFI and I need to extract from a  C API a list of pointers.<br>
<br>
I have two methods available<br>
<br>
c_get_first_item :: Ptr List -> IO (Ptr Item)<br>
c_get_next_item :: Ptr List -> Ptr Item -> IO (Ptr Item)<br>
<br>
I would like to obtain a [Ptr Item]<br>
<br>
I try to used whileM but I did not find how to inject the first item in the loop.<br>
<br>
whileM (return . ( /= nullPtr)) (c_get_next_item list item)<br>
<br>
the c_get_next_item return a nullPtr when there is no remaining item.<br>
<br>
what is the haskell way in order to extract a list of pointer using these C methods ?<br>
<br>
thanks for your help<br>
<br>
Frederic<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div></div></div>