import Foundation let doNothing: () -> Void = { } public enum NoValue { } public enum NoError { } public func identity(a: A) -> A { return a } precedencegroup PipeRight { associativity: left higherThan: DefaultPrecedence } infix operator |> : PipeRight public func |> (value: T, function: ((T) -> U)) -> U { return function(value) } private final class SubscriberDisposable: Disposable, CustomStringConvertible { private weak var subscriber: Subscriber? private var lock = pthread_mutex_t() private var disposable: Disposable? init(subscriber: Subscriber, disposable: Disposable?) { self.subscriber = subscriber self.disposable = disposable pthread_mutex_init(&self.lock, nil) } deinit { pthread_mutex_destroy(&self.lock) } func dispose() { var subscriber: Subscriber? var disposeItem: Disposable? pthread_mutex_lock(&self.lock) disposeItem = self.disposable subscriber = self.subscriber self.subscriber = nil self.disposable = nil pthread_mutex_unlock(&self.lock) disposeItem?.dispose() subscriber?.markTerminatedWithoutDisposal() } public var description: String { return "SubscriberDisposable { disposable: \(self.disposable == nil ? "nil" : "hasValue") }" } } public final class Signal { private let generator: (Subscriber) -> Disposable public init(_ generator: @escaping(Subscriber) -> Disposable) { self.generator = generator } public func start(next: ((T) -> Void)! = nil, error: ((E) -> Void)! = nil, completed: (() -> Void)! = nil) -> Disposable { let subscriber = Subscriber(next: next, error: error, completed: completed) let disposable = self.generator(subscriber) let wrappedDisposable = subscriber.assignDisposable(disposable) return SubscriberDisposable(subscriber: subscriber, disposable: wrappedDisposable) } public func startStandalone(next: ((T) -> Void)! = nil, error: ((E) -> Void)! = nil, completed: (() -> Void)! = nil) -> Disposable { let subscriber = Subscriber(next: next, error: error, completed: completed) let disposable = self.generator(subscriber) let wrappedDisposable = subscriber.assignDisposable(disposable) return SubscriberDisposable(subscriber: subscriber, disposable: wrappedDisposable) } public func startStrict(next: ((T) -> Void)! = nil, error: ((E) -> Void)! = nil, completed: (() -> Void)! = nil, file: String = #file, line: Int = #line) -> Disposable { let subscriber = Subscriber(next: next, error: error, completed: completed) let disposable = self.generator(subscriber) let wrappedDisposable = subscriber.assignDisposable(disposable) return SubscriberDisposable(subscriber: subscriber, disposable: wrappedDisposable).strict(file: file, line: line) } public static func single(_ value: T) -> Signal { return Signal { subscriber in subscriber.putNext(value) subscriber.putCompletion() return EmptyDisposable } } public static func complete() -> Signal { return Signal { subscriber in subscriber.putCompletion() return EmptyDisposable } } public static func fail(_ error: E) -> Signal { return Signal { subscriber in subscriber.putError(error) return EmptyDisposable } } public static func never() -> Signal { return Signal { _ in return EmptyDisposable } } }