CoChannel
public final class CoChannel<Element>
extension CoChannel: CoCancellable
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>(capacity: 1)
DispatchQueue.global().startCoroutine {
for i in 0..<100 {
try channel.awaitSend(i)
}
channel.close()
}
DispatchQueue.global().startCoroutine {
for i in channel.makeIterator() {
print("Receive", i)
}
print("Done")
}
-
Initializes a channel.
Declaration
Swift
public init(bufferType type: BufferType = .unlimited)
Parameters
type
The type of channel buffer.
-
Initializes a channel with
BufferType.buffered(capacity:)
.Declaration
Swift
public init(capacity: Int)
Parameters
capacity
The maximum number of elements that can be stored in a channel.
-
The type of channel buffer.
Declaration
Swift
@inlinable public var bufferType: BufferType { get }
-
A
CoChannel
wrapper that provides send-only functionality.Declaration
Swift
@inlinable public var sender: Sender { get }
-
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
@inlinable 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 @inlinable 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.
-
A
CoChannel
wrapper that provides receive-only functionality.Declaration
Swift
@inlinable public var receiver: Receiver { get }
-
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
@inlinable public func awaitReceive() throws -> Element
Return Value
Removed value from the channel.
-
Retrieves and removes an element from this channel.
Declaration
Swift
@inlinable 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
@inlinable 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
@inlinable public var count: Int { get }
-
Returns
true
if the channel is empty (contains no elements), which means no elements to receive.Declaration
Swift
@inlinable public var isEmpty: Bool { get }
-
Closes this channel. No more send should be performed on the channel.
Declaration
Swift
@discardableResult @inlinable 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
@inlinable public var isClosed: Bool { get }
-
Closes the channel and removes all buffered sent elements from it.
Declaration
Swift
@inlinable public func cancel()
-
Returns
true
if the channel is canceled.Declaration
Swift
@inlinable public var isCanceled: Bool { get }
-
Adds an observer callback that is called when the
CoChannel
is canceled.Declaration
Swift
@inlinable public func whenCanceled(_ callback: @escaping () -> Void)
Parameters
callback
The callback that is called when the
CoChannel
is canceled.
-
Adds an observer callback that is called when the
CoChannel
is completed (closed, canceled or deinited).Declaration
Swift
@inlinable public func whenComplete(_ callback: @escaping () -> Void)
Parameters
callback
The callback that is called when the
CoChannel
is completed.
-
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
@inlinable public func makeIterator() -> AnyIterator<Element>
Return Value
Iterator for the channel elements.
-
Declaration
-
Declaration
-
Returns a publisher that emits elements of this
CoChannel
.Declaration
Swift
@inlinable public func publisher() -> AnyPublisher<Element, CoChannelError>