[Haskell-beginners] Hints on how to remove unsafePerformIO from
my function?
Benjamin Edwards
edwards.benj at gmail.com
Mon Jul 19 10:12:32 EDT 2010
fork it into a thread and have it run on a loop, yielding if it can't read
any data from the udp socket?
On 19 July 2010 16:07, David McBride <dmcbride at neondsl.com> wrote:
> I am writing a voip server to take advantage of haskells awesome threading
> and parsing ability. At first everything was going great, but my thread
> that fetches udp makes use of unsafePerformIO:
>
> fetchUDPSIP :: TChan B.ByteString -> IO ()
> fetchUDPSIP chan = do
> sock <- getUDPSocket 5060
> let results = (unstrict . repeat . getUDP) sock
> mapM_ (atomically . writeTChan chan) results
> where
> unstrict [] = []
> unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
>
> It fetches it from a socket, and then writes it to a TChan. This results
> in a stream of bytestrings that another thread can read from. If I don't
> use unsafePerformIO, then it tries to read all possible packets before
> returning anything, and so it never writes to the TChan at all. The problem
> with doing it this way is that unsafePerformIO apparently stops every other
> thread from doing anything while it is waiting for a packet.
>
> But I can't think of a way to rewrite this function to do what I want. I'm
> kind of new to this, does anyone have any hints that could help me out?
>
> Here's a simple version without any of the implementation details:
>
> fetchLine = do
> let results = (unstrict . repeat) getLine
> mapM_ putStrLn results
> where
> unstrict [] = []
> unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100719/8d12f717/attachment.html
More information about the Beginners
mailing list