Files
OrderScheduling/Pods/RxSwift/RxSwift/Event.swift
DDIsFriend f0e8a1709d initial
2023-08-18 17:28:57 +08:00

105 lines
2.5 KiB
Swift

//
// Event.swift
// RxSwift
//
// Created by Krunoslav Zaher on 2/8/15.
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
//
/// Represents a sequence event.
///
/// Sequence grammar:
/// **next\* (error | completed)**
@frozen public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
extension Event: CustomDebugStringConvertible {
/// Description of event.
public var debugDescription: String {
switch self {
case .next(let value):
return "next(\(value))"
case .error(let error):
return "error(\(error))"
case .completed:
return "completed"
}
}
}
extension Event {
/// Is `completed` or `error` event.
public var isStopEvent: Bool {
switch self {
case .next: return false
case .error, .completed: return true
}
}
/// If `next` event, returns element value.
public var element: Element? {
if case .next(let value) = self {
return value
}
return nil
}
/// If `error` event, returns error.
public var error: Swift.Error? {
if case .error(let error) = self {
return error
}
return nil
}
/// If `completed` event, returns `true`.
public var isCompleted: Bool {
if case .completed = self {
return true
}
return false
}
}
extension Event {
/// Maps sequence elements using transform. If error happens during the transform, `.error`
/// will be returned as value.
public func map<Result>(_ transform: (Element) throws -> Result) -> Event<Result> {
do {
switch self {
case let .next(element):
return .next(try transform(element))
case let .error(error):
return .error(error)
case .completed:
return .completed
}
}
catch let e {
return .error(e)
}
}
}
/// A type that can be converted to `Event<Element>`.
public protocol EventConvertible {
/// Type of element in event
associatedtype Element
/// Event representation of this instance
var event: Event<Element> { get }
}
extension Event: EventConvertible {
/// Event representation of this instance
public var event: Event<Element> { self }
}