{-# LANGUAGE RankNTypes #-}
module Data.Conduit.Network.UDP
(
SN.Message (..)
, sourceSocket
, sinkSocket
, sinkAllSocket
, sinkToSocket
, sinkAllToSocket
, SN.HostPreference
) where
import Data.Conduit
import Network.Socket (Socket)
import Network.Socket.ByteString (recvFrom, send, sendAll, sendTo, sendAllTo)
import Data.ByteString (ByteString)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Control.Monad (void)
import Control.Monad.Trans.Class (lift)
import qualified Data.Streaming.Network as SN
sourceSocket :: MonadIO m => Socket -> Int -> ConduitT i SN.Message m ()
sourceSocket :: forall (m :: * -> *) i.
MonadIO m =>
Socket -> Int -> ConduitT i Message m ()
sourceSocket Socket
socket Int
len = forall {i} {b}. ConduitT i Message m b
loop
where
loop :: ConduitT i Message m b
loop = do
(ByteString
bs, SockAddr
addr) <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Socket -> Int -> IO (ByteString, SockAddr)
recvFrom Socket
socket Int
len
forall (m :: * -> *) o i. Monad m => o -> ConduitT i o m ()
yield (ByteString -> SockAddr -> Message
SN.Message ByteString
bs SockAddr
addr) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ConduitT i Message m b
loop
sinkSocket :: MonadIO m => Socket -> ConduitT ByteString o m ()
sinkSocket :: forall (m :: * -> *) o.
MonadIO m =>
Socket -> ConduitT ByteString o m ()
sinkSocket = forall (m :: * -> *) a o.
MonadIO m =>
(Socket -> a -> IO ()) -> Socket -> ConduitT a o m ()
sinkSocketHelper (\Socket
sock ByteString
bs -> forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ Socket -> ByteString -> IO Int
send Socket
sock ByteString
bs)
sinkAllSocket :: MonadIO m => Socket -> ConduitT ByteString o m ()
sinkAllSocket :: forall (m :: * -> *) o.
MonadIO m =>
Socket -> ConduitT ByteString o m ()
sinkAllSocket = forall (m :: * -> *) a o.
MonadIO m =>
(Socket -> a -> IO ()) -> Socket -> ConduitT a o m ()
sinkSocketHelper Socket -> ByteString -> IO ()
sendAll
sinkToSocket :: MonadIO m => Socket -> ConduitT SN.Message o m ()
sinkToSocket :: forall (m :: * -> *) o.
MonadIO m =>
Socket -> ConduitT Message o m ()
sinkToSocket = forall (m :: * -> *) a o.
MonadIO m =>
(Socket -> a -> IO ()) -> Socket -> ConduitT a o m ()
sinkSocketHelper (\Socket
sock (SN.Message ByteString
bs SockAddr
addr) -> forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ Socket -> ByteString -> SockAddr -> IO Int
sendTo Socket
sock ByteString
bs SockAddr
addr)
sinkAllToSocket :: MonadIO m => Socket -> ConduitT SN.Message o m ()
sinkAllToSocket :: forall (m :: * -> *) o.
MonadIO m =>
Socket -> ConduitT Message o m ()
sinkAllToSocket = forall (m :: * -> *) a o.
MonadIO m =>
(Socket -> a -> IO ()) -> Socket -> ConduitT a o m ()
sinkSocketHelper (\Socket
sock (SN.Message ByteString
bs SockAddr
addr) -> Socket -> ByteString -> SockAddr -> IO ()
sendAllTo Socket
sock ByteString
bs SockAddr
addr)
sinkSocketHelper :: MonadIO m => (Socket -> a -> IO ())
-> Socket
-> ConduitT a o m ()
sinkSocketHelper :: forall (m :: * -> *) a o.
MonadIO m =>
(Socket -> a -> IO ()) -> Socket -> ConduitT a o m ()
sinkSocketHelper Socket -> a -> IO ()
act Socket
socket = forall {o}. ConduitT a o m ()
loop
where
loop :: ConduitT a o m ()
loop = forall (m :: * -> *) i o. Monad m => ConduitT i o m (Maybe i)
await forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(forall (m :: * -> *) a. Monad m => a -> m a
return ())
(\a
a -> forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Socket -> a -> IO ()
act Socket
socket a
a) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ConduitT a o m ()
loop)
{-# INLINE sinkSocketHelper #-}