Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. import XCTest
  2. @testable import ReactiveSwift
  3. import Result
  4.  
  5. class SignalProducerPerformanceTests: XCTestCase {
  6. func testNormalStarting() {
  7. let (signal, observer) = Signal<Int, NoError>.pipe()
  8. let producer = SignalProducer(signal: signal)
  9. let nested = (0 ..< 32).reduce(producer) { producer, _ in producer.testMap { $0 + 1 } }
  10.  
  11. measure {
  12. for _ in 0 ..< 1000 {
  13. let disposable = nested.start()
  14. observer.send(value: 1)
  15. disposable.dispose()
  16. }
  17. }
  18. }
  19.  
  20. func testStartingWithSharedDisposable() {
  21. let (signal, observer) = Signal<Int, NoError>.pipe()
  22. let producer = SignalProducer(signal: signal)
  23. let nested = (0 ..< 32).reduce(producer) { producer, _ in producer.map { $0 + 1 } }
  24.  
  25. measure {
  26. for _ in 0 ..< 1000 {
  27. let disposable = nested.start()
  28. observer.send(value: 1)
  29. disposable.dispose()
  30. }
  31. }
  32. }
  33. }
  34.  
  35. extension SignalProducerProtocol {
  36. /// Lift an unary Signal operator to operate upon SignalProducers instead.
  37. ///
  38. /// In other words, this will create a new `SignalProducer` which will apply
  39. /// the given `Signal` operator to _every_ created `Signal`, just as if the
  40. /// operator had been applied to each `Signal` yielded from `start()`.
  41. ///
  42. /// - parameters:
  43. /// - transform: An unary operator to lift.
  44. ///
  45. /// - returns: A signal producer that applies signal's operator to every
  46. /// created signal.
  47. func testLift<U, F>(_ transform: @escaping (Signal<Value, Error>) -> Signal<U, F>) -> SignalProducer<U, F> {
  48. return SignalProducer { observer, outerDisposable in
  49. self.producer.startWithSignal { signal, disposable in
  50. outerDisposable += disposable
  51. transform(signal).observe(observer)
  52. }
  53. }
  54. }
  55.  
  56. /// Map each value in the producer to a new value.
  57. ///
  58. /// - parameters:
  59. /// - transform: A closure that accepts a value and returns a different
  60. /// value.
  61. ///
  62. /// - returns: A signal producer that, when started, will send a mapped
  63. /// value of `self.`
  64. func testMap<U>(_ transform: @escaping (Value) -> U) -> SignalProducer<U, Error> {
  65. return testLift { $0.map(transform) }
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement