CoChannel
public final class CoChannel<Element>
extension CoChannel: Cancellable
extension CoChannel: Sequence
Channel is a non-blocking primitive for communication between a sender and a receiver. Conceptually, a channel is similar to a queue that allows to suspend a coroutine on receive if it is empty or on send if it is full.
Important
Alwaysclose()
or cancel()
a channel when you are done to resume all suspended coroutines by the channel.
let channel = CoChannel<Int>(maxBufferSize: 1)
DispatchQueue.global().startCoroutine {
for i in 0..<10 {
try channel.awaitSend(i)
}
channel.close()
}
DispatchQueue.global().startCoroutine {
for i in channel {
print("Receive", i)
}
print("Done")
}
-
The maximum number of elements that can be stored in a channel.
Declaration
Swift
public let maxBufferSize: Int
-
Initializes a channel.
Declaration
Swift
public init(maxBufferSize: Int = .max)
Parameters
maxBufferSize
The maximum number of elements that can be stored in a channel.
-
Sends the element to this channel, suspending the coroutine while the buffer of this channel is full. Must be called inside a coroutine.
Throws
CoChannelError when canceled or closed.Declaration
Swift
public func awaitSend(_ element: Element) throws
Parameters
element
Value that will be sent to the channel.
-
Immediately adds the value to this channel, if this doesn’t violate its capacity restrictions, and returns true. Otherwise, just returns false.
Declaration
Swift
@discardableResult public func offer(_ element: Element) -> Bool
Parameters
element
Value that might be sent to the channel.
Return Value
true
if sent successfully orfalse
if channel buffer is full or channel is closed or canceled.
-
Retrieves and removes an element from this channel if it’s not empty, or suspends a coroutine while the channel is empty.
Throws
CoChannelError when canceled or closed.Declaration
Swift
public func awaitReceive() throws -> Element
Return Value
Removed value from the channel.
-
Retrieves and removes an element from this channel.
Declaration
Swift
public func poll() -> Element?
Return Value
Element from this channel if its not empty, or returns nill if the channel is empty or is closed or canceled.
-
Adds an observer callback to receive an element from this channel.
Declaration
Swift
public func whenReceive(_ callback: @escaping (Result<Element, CoChannelError>) -> Void)
Parameters
callback
The callback that is called when a value is received.
-
Returns a number of elements in this channel.
Declaration
Swift
public var count: Int { get }
-
Returns
true
if the channel is empty (contains no elements), which means no elements to receive.Declaration
Swift
public var isEmpty: Bool { get }
-
Closes this channel. No more send should be performed on the channel.
Declaration
Swift
@discardableResult public func close() -> Bool
Return Value
true
if closed successfully orfalse
if channel is already closed or canceled. -
Returns
true
if the channel is closed.Declaration
Swift
public var isClosed: Bool { get }
-
Closes the channel and removes all buffered sent elements from it.
Declaration
Swift
public func cancel()
-
Returns
true
if the channel is canceled.Declaration
Swift
public var isCanceled: Bool { get }
-
Make an iterator which successively retrieves and removes values from the channel.
If
next()
was called inside a coroutine and there are no more elements in the channel, then the coroutine will be suspended until a new element will be added to the channel or it will be closed or canceled.Declaration
Swift
public func makeIterator() -> AnyIterator<Element>
Return Value
Iterator for the channel elements.