import Foundation internal let doNothing: () -> Void = { _ in } public typealias NoError = Void public func identity(a: A) -> A { return a; } infix operator |> { associativity left precedence 95 } 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 struct Signal { private let generator: Subscriber -> Disposable public init(_ generator: 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) } }