| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import Foundation
- import enum Result.NoError
- /// Represents the lifetime of an object, and provides a hook to observe when
- /// the object deinitializes.
- public final class Lifetime {
- /// MARK: Type properties and methods
- /// A `Lifetime` that has already ended.
- public static var empty: Lifetime {
- return Lifetime(ended: .empty)
- }
- /// MARK: Instance properties
- /// A signal that sends a `completed` event when the lifetime ends.
- public let ended: Signal<(), NoError>
- /// MARK: Initializers
- /// Initialize a `Lifetime` object with the supplied ended signal.
- ///
- /// - parameters:
- /// - signal: The ended signal.
- private init(ended signal: Signal<(), NoError>) {
- ended = signal
- }
- /// Initialize a `Lifetime` from a lifetime token, which is expected to be
- /// associated with an object.
- ///
- /// - important: The resulting lifetime object does not retain the lifetime
- /// token.
- ///
- /// - parameters:
- /// - token: A lifetime token for detecting the deinitialization of the
- /// associated object.
- public convenience init(_ token: Token) {
- self.init(ended: token.ended)
- }
- /// A token object which completes its signal when it deinitializes.
- ///
- /// It is generally used in conjuncion with `Lifetime` as a private
- /// deinitialization trigger.
- ///
- /// ```
- /// class MyController {
- /// private let token = Lifetime.Token()
- /// public var lifetime: Lifetime {
- /// return Lifetime(token)
- /// }
- /// }
- /// ```
- public final class Token {
- /// A signal that sends a Completed event when the lifetime ends.
- fileprivate let ended: Signal<(), NoError>
- private let endedObserver: Signal<(), NoError>.Observer
- public init() {
- (ended, endedObserver) = Signal.pipe()
- }
- deinit {
- endedObserver.sendCompleted()
- }
- }
- }
|