71 lines
2.5 KiB
Swift
71 lines
2.5 KiB
Swift
//
|
|
// Publisher.swift
|
|
// OpenCombine
|
|
//
|
|
// Created by Sergej Jaskiewicz on 10.06.2019.
|
|
//
|
|
|
|
/// Declares that a type can transmit a sequence of values over time.
|
|
///
|
|
/// There are four kinds of messages:
|
|
/// subscription - A connection between `Publisher` and `Subscriber`.
|
|
/// value - An element in the sequence.
|
|
/// error - The sequence ended with an error (`.failure(e)`).
|
|
/// complete - The sequence ended successfully (`.finished`).
|
|
///
|
|
/// Both `.failure` and `.finished` are terminal messages.
|
|
///
|
|
/// You can summarize these possibilities with a regular expression:
|
|
/// value*(error|finished)?
|
|
///
|
|
/// Every `Publisher` must adhere to this contract.
|
|
public protocol Publisher {
|
|
|
|
/// The kind of values published by this publisher.
|
|
associatedtype Output
|
|
|
|
/// The kind of errors this publisher might publish.
|
|
///
|
|
/// Use `Never` if this `Publisher` does not publish errors.
|
|
associatedtype Failure: Error
|
|
|
|
/// This function is called to attach the specified `Subscriber` to this `Publisher`
|
|
/// by `subscribe(_:)`
|
|
///
|
|
/// - SeeAlso: `subscribe(_:)`
|
|
/// - Parameters:
|
|
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
/// once attached it can begin to receive values.
|
|
func receive<Subscriber: OpenCombine.Subscriber>(subscriber: Subscriber)
|
|
where Failure == Subscriber.Failure, Output == Subscriber.Input
|
|
}
|
|
|
|
extension Publisher {
|
|
|
|
/// Attaches the specified subscriber to this publisher.
|
|
///
|
|
/// Always call this function instead of `receive(subscriber:)`.
|
|
/// Adopters of `Publisher` must implement `receive(subscriber:)`.
|
|
/// The implementation of `subscribe(_:)` in this extension calls through to
|
|
/// `receive(subscriber:)`.
|
|
/// - SeeAlso: `receive(subscriber:)`
|
|
/// - Parameters:
|
|
/// - subscriber: The subscriber to attach to this `Publisher`. After attaching,
|
|
/// the subscriber can start to receive values.
|
|
public func subscribe<Subscriber: OpenCombine.Subscriber>(_ subscriber: Subscriber)
|
|
where Failure == Subscriber.Failure, Output == Subscriber.Input
|
|
{
|
|
receive(subscriber: subscriber)
|
|
}
|
|
|
|
public func subscribe<Subject: OpenCombine.Subject>(
|
|
_ subject: Subject
|
|
) -> AnyCancellable
|
|
where Failure == Subject.Failure, Output == Subject.Output
|
|
{
|
|
let subscriber = SubjectSubscriber(subject)
|
|
self.subscribe(subscriber)
|
|
return AnyCancellable(subscriber)
|
|
}
|
|
}
|