while loop

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

while loop

PICCA Frederic-Emmanuel
Hello,

I am playing with FFI and I need to extract from a  C API a list of pointers.

I have two methods available

c_get_first_item :: Ptr List -> IO (Ptr Item)
c_get_next_item :: Ptr List -> Ptr Item -> IO (Ptr Item)

I would like to obtain a [Ptr Item]

I try to used whileM but I did not find how to inject the first item in the loop.

whileM (return . ( /= nullPtr)) (c_get_next_item list item)

the c_get_next_item return a nullPtr when there is no remaining item.

what is the haskell way in order to extract a list of pointer using these C methods ?

thanks for your help

Frederic
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: while loop

Sylvain HENRY
Hi,

In these cases, I write the explicitly recursive version (e.g. getList1) and look for a pattern (e.g. getList2).

getList1 :: Ptr List -> IO [Ptr Item]
getList1 l = c_get_first_item l >>= go
   where
      go e
         | e == nullPtr = return []
         | otherwise    = do
               next <- c_get_next_item l e
               es   <- go next
               return (e:es)



getList2 :: Ptr List -> IO [Ptr Item]
getList2 l = c_get_first_item l >>= unfoldrM go
   where
      go e
         | e == nullPtr = return Nothing
         | otherwise    = do
               next <- c_get_next_item l e
               return (Just (e,next))

I hope it helps
Sylvain



2016-02-11 12:02 GMT+01:00 PICCA Frederic-Emmanuel <[hidden email]>:
Hello,

I am playing with FFI and I need to extract from a  C API a list of pointers.

I have two methods available

c_get_first_item :: Ptr List -> IO (Ptr Item)
c_get_next_item :: Ptr List -> Ptr Item -> IO (Ptr Item)

I would like to obtain a [Ptr Item]

I try to used whileM but I did not find how to inject the first item in the loop.

whileM (return . ( /= nullPtr)) (c_get_next_item list item)

the c_get_next_item return a nullPtr when there is no remaining item.

what is the haskell way in order to extract a list of pointer using these C methods ?

thanks for your help

Frederic
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: while loop

PICCA Frederic-Emmanuel
> I hope it helps

Yes a lot :))

thanks you very much (merci beaucoup :p)


Frédéric
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners