Simple fire-and-forget udp Streaming components modelled after udp-conduit

root

udp-streaming

Simple fire and forget style streaming source and consumer in the spirit of the udp-conduit package.

Here's an example run in ghci that sends e messages to UDP port 8888 on localhost, from the port 3000 on the localhost:

>>> import qualified Streaming.Prelude as S
>>> import Control.Monad.Trans.Resource
>>> import Streaming.UDP
>>>
>>> :set -XOverloadedStrings
>>>
>>> addr1 <- SockAddrInet 8888 <$> (inet_addr "127.0.0.1")
>>>
>>> runResourceT $ toUDP "127.0.0.1" 3000 $ S.zip (S.each ["hello", "world", "!"]) (S.repeat addr1)

Here's an example in ghci where we continuously receive messages with a maximum length of 500 bytes on port 8888 on localhost:

>>> import qualified Streaming.Prelude as S
>>> import Streaming.UDP
>>> import Control.Monad.Trans.Resource
>>> import qualified Data.ByteString as B 
>>>
>>>
>>> runResourceT $ S.stdoutLn $ S.map (map (toEnum.fromEnum) . B.unpack) $ S.map fst $ fromUDP "127.0.0.1" 8888 500

Now, here's an example where we receive messages on port 8001, encode them as hex digits (using base16-bytestring package), and then send them on to port 8002.

>>> import qualified Streaming.Prelude as S
>>> import Streaming.UDP
>>> import Data.ByteString.Base16 (encode)
>>> import Control.Monad.Trans.Resource
>>>
>>> addr2 <- SockAddrInet 8002 <$> (inet_addr "127.0.0.1")
>>>
>>> runResourceT $ toUDP "127.0.0.1" 8002 $ S.zip (S.map encode $ S.map fst $ fromUDP "127.0.0.1" 8001 500) (S.repeat addr2)

Or you could, in the previous example, to also log the messages receved, before processing and send them further:

>>> runResourceT $ toUDP "127.0.0.1" 3000 $ S.zip (S.map encode $ S.map fst $ S.print $ S.copy $ fromUDP "127.0.0.1" 8001 500) (S.repeat addr2)