import Foundation public func map(f: T -> R)(signal: Signal) -> Signal { return Signal { subscriber in return signal.start(next: { next in subscriber.putNext(f(next)) }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() }) } } public func filter(f: T -> Bool)(signal: Signal) -> Signal { return Signal { subscriber in return signal.start(next: { next in if f(next) { subscriber.putNext(next) } }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() }) } } public func mapError(f: E -> R)(signal: Signal) -> Signal { return Signal { subscriber in return signal.start(next: { next in subscriber.putNext(next) }, error: { error in subscriber.putError(f(error)) }, completed: { subscriber.putCompletion() }) } } private class DistinctUntilChangedContext { var value: T? } public func distinctUntilChanged(signal: Signal) -> Signal { return Signal { subscriber in let context = Atomic(value: DistinctUntilChangedContext()) return signal.start(next: { next in let pass = context.with { context -> Bool in if let value = context.value where value == next { return false } else { context.value = next return true } } if pass { subscriber.putNext(next) } }, error: { error in subscriber.putError(error) }, completed: { subscriber.putCompletion() }) } }