Skip to content

Instantly share code, notes, and snippets.

@andersio
Created December 3, 2016 02:25
Show Gist options
  • Select an option

  • Save andersio/7116ff83e8b5865829b284c288bc0270 to your computer and use it in GitHub Desktop.

Select an option

Save andersio/7116ff83e8b5865829b284c288bc0270 to your computer and use it in GitHub Desktop.
import XCTest
@testable import ReactiveSwift
import Result
class SignalProducerPerformanceTests: XCTestCase {
func testNormalStarting() {
let (signal, observer) = Signal<Int, NoError>.pipe()
let producer = SignalProducer(signal: signal)
let nested = (0 ..< 32).reduce(producer) { producer, _ in producer.testMap { $0 + 1 } }
measure {
for _ in 0 ..< 1000 {
let disposable = nested.start()
observer.send(value: 1)
disposable.dispose()
}
}
}
func testStartingWithSharedDisposable() {
let (signal, observer) = Signal<Int, NoError>.pipe()
let producer = SignalProducer(signal: signal)
let nested = (0 ..< 32).reduce(producer) { producer, _ in producer.map { $0 + 1 } }
measure {
for _ in 0 ..< 1000 {
let disposable = nested.start()
observer.send(value: 1)
disposable.dispose()
}
}
}
}
extension SignalProducerProtocol {
/// Lift an unary Signal operator to operate upon SignalProducers instead.
///
/// In other words, this will create a new `SignalProducer` which will apply
/// the given `Signal` operator to _every_ created `Signal`, just as if the
/// operator had been applied to each `Signal` yielded from `start()`.
///
/// - parameters:
/// - transform: An unary operator to lift.
///
/// - returns: A signal producer that applies signal's operator to every
/// created signal.
func testLift<U, F>(_ transform: @escaping (Signal<Value, Error>) -> Signal<U, F>) -> SignalProducer<U, F> {
return SignalProducer { observer, outerDisposable in
self.producer.startWithSignal { signal, disposable in
outerDisposable += disposable
transform(signal).observe(observer)
}
}
}
/// Map each value in the producer to a new value.
///
/// - parameters:
/// - transform: A closure that accepts a value and returns a different
/// value.
///
/// - returns: A signal producer that, when started, will send a mapped
/// value of `self.`
func testMap<U>(_ transform: @escaping (Value) -> U) -> SignalProducer<U, Error> {
return testLift { $0.map(transform) }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment