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 { private let subscriber: Subscriber private let disposable: Disposable init(subscriber: Subscriber, disposable: Disposable) { self.subscriber = subscriber self.disposable = disposable } func dispose() { subscriber.markTerminatedWithoutDisposal() disposable.dispose() } } 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) subscriber.assignDisposable(disposable) return SubscriberDisposable(subscriber: subscriber, disposable: disposable) } 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 } } }