A wrapper for an mpsc::channel
that allows arbitrary types to be passed through. Comes in 2 different flavors:
The any_mpsc::channel
function may be used to create a basic (AnySender, AnyReceiver)
. AnySender
takes any value and sends it through the underlying channel with the send
method (internally as a Box<dyn Any>
). AnyReceiver
contains generic versions of recv
, recv_timeout
, and try_recv
. If the generic parameter supplied doesn't correspond with the type the AnySender
pushed through, a AnyRecvError::WrongType(Box<dyn Any>)
will be returned containing the value.
Probably more useful, the buf_recv
default feature enables the any_mpsc::buffered_channel
function. This will return a (AnySender, BufferedReceiver)
. The BufferedReceiver
works differently from the AnyReceiver
in that if an unmatching generic type is supplied, it will instead return a BufRecvError::WrongType(TypeId)
. The actual value will be stored in its internal buffer, and the next time recv
, recv_timeout
, or try_recv
is called with a generic parameter matching its type, that buffered value will be returned and removed from the buffer. Additional methods for interaction with the channel and buffer exist, see the table below.
|Method|Description|
|-|-|
|recv
|Attempts to pop from internal buffer. If buffer is empty, calls mpsc recv|
|recv_timeout
|Attempts to pop from internal buffer. If buffer is empty, calls mpsc recvtimeout|
|try_recv
|Attempts to pop from internal buffer. If buffer is empty, calls mpsc tryrecv|
|recv_live
|Calls mpsc recv regardless of whether or not the buffer is empty. Unmatching result types will still be placed in the buffer.|
|recv_timeout_live
|Calls mpsc recvtimeout regardless of whether or not the buffer is empty. Unmatching result types will still be placed in the buffer.|
|try_recv_live
|Calls mpsc tryrecv regardless of whether or not the buffer is empty. Unmatching result types will still be placed in the buffer.|
|recv_nobuf
|Equivalent to AnyReceiver::recv
(bypasses the buffer entirely)|
|recv_timeout_nobuf
|Equivalent to AnyReceiver::recv_timeout_nobuf
(bypasses the buffer entirely)|
|try_recv_nobuf
|Equivalent to AnyReceiver::try_recv_nobuf
(bypasses the buffer entirely)|
|recv_buf
|Attempts to pop from the internal buffer. Never attempts to access the internal channel at all.|