import Foundation public func beforeNext(f: T -> R)(signal: Signal) -> Signal { return Signal { subscriber in return signal.start(next: { next in let unused = f(next) subscriber.putNext(next) }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() }) } } public func afterNext(f: T -> R)(signal: Signal) -> Signal { return Signal { subscriber in return signal.start(next: { next in subscriber.putNext(next) let unused = f(next) }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() }) } } public func afterDisposed(f: Void -> R)(signal: Signal) -> Signal { return Signal { subscriber in let disposable = DisposableSet() disposable.add(signal.start(next: { next in subscriber.putNext(next) }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() })) disposable.add(ActionDisposable { let unused = f() }) return disposable } }