RxMarbles for iOS

RxMarbles

This Could Be Us But You Playing

https://github.com/neonichu/ThisCouldBeUsButYouPlaying

$ gem install cocoapods-playgrounds
public func example(of description: String, action: () -> Void) {
  print("\n--- Example of:", description, "---")
  action()
}

Ignoring operators


ignoreElements

ignoreElements

//: Please build the scheme 'RxSwiftPlayground' first
import RxSwift

example(of: "ignoreElements") {

  // 1
  let strikes = PublishSubject<String>()

  let disposeBag = DisposeBag()

  // 2
  strikes
    .ignoreElements()
    .subscribe { _ in
      print("You're out!")
    }
    .addDisposableTo(disposeBag)

  strikes.onNext("X")
  strikes.onNext("X")
  strikes.onNext("X")
  strikes.onCompleted()
}

— Example of: ignoreElements —

You’re out!

elementAt

elementAt

example(of: "elementAt") {

  // 1
  let strikes = PublishSubject<String>()

  let disposeBag = DisposeBag()

  //  2
  strikes
    .elementAt(2)
    .subscribe(onNext: { _ in
      print("You're out!")
    })
    .addDisposableTo(disposeBag)

  strikes.onNext("X")
  strikes.onNext("X")
  strikes.onNext("X")

}

— Example of: elementAt —

You’re out!

filter

filter

example(of: "filter") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of(1, 2, 3, 4, 5, 6)
    // 2
    .filter { integer in
      integer % 2 == 0
    }
    // 3
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)

}

— Example of: filter —

2

4

6

Skipping operators


skip

skip

example(of: "skip") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of("A", "B", "C", "D", "E", "F")
    // 2
    .skip(3)
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: skip —

D

E

F

skipWhile

skipWhile

example(of: "skipWhile") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of(2, 2, 3, 4, 4)
    // 2
    .skipWhile { integer in
      integer % 2 == 0
    }
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: skipWhile —

3

4

4

skipUntil

skipUntil

example(of: "skipUntil") {

  let disposeBag = DisposeBag()

  // 1
  let subject = PublishSubject<String>()
  let trigger = PublishSubject<String>()

  // 2
  subject
    .skipUntil(trigger)
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)

  subject.onNext("A")
  subject.onNext("B")

  trigger.onNext("X")
  subject.onNext("C")
}

— Example of: skipUntil —

C

Taking operators


take

take

example(of: "take") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of(1, 2, 3, 4, 5, 6)
    // 2
    .take(3)
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: take —

1

2

3

takeWhileWithIndex

takeWhileWithIndex

example(of: "takeWhileWithIndex") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of(2, 2, 4, 4, 6, 6)
    // 2
    .takeWhileWithIndex { integer, index in
      // 3
      integer % 2 == 0 && index < 3
    }
    // 4
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: takeWhileWithIndex —

2

2

4

takeUntil

takeUntil

example(of: "takeUntil") {

  let disposeBag = DisposeBag()

  // 1
  let subject = PublishSubject<String>()
  let trigger = PublishSubject<String>()

  // 2
  subject
    .takeUntil(trigger)
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)

  // 3
  subject.onNext("1")
  subject.onNext("2")

  trigger.onNext("X")

  subject.onNext("3")
}

— Example of: takeUntil —

1

2

Distinct operators


distinctUntilChanged

distinctUntilChanged

example(of: "distinctUntilChanged") {

  let disposeBag = DisposeBag()

  // 1
  Observable.of("A", "A", "B", "B", "A")
    // 2
    .distinctUntilChanged()
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: distinctUntilChanged —

A

B

A

distinctUntilChanged_more

distinctUntilChanged_more

example(of: "distinctUntilChanged(_:)") {

  let disposeBag = DisposeBag()

  // 1
  let formatter = NumberFormatter()
  formatter.numberStyle = .spellOut

  // 2
  Observable<NSNumber>.of(10, 110, 20, 200, 210, 310)
    // 3
    .distinctUntilChanged { a, b in
      // 4
      guard let aWords = formatter.string(from: a)?.components(separatedBy: " "),
        let bWords = formatter.string(from: b)?.components(separatedBy: " ")
        else {
          return false
      }

      var containsMatch = false

      // 5
      for aWord in aWords {
        for bWord in bWords {
          if aWord == bWord {
            containsMatch = true
            break
          }
        }
      }

      return containsMatch
    }
    // 4
    .subscribe(onNext: {
      print($0)
    })
    .addDisposableTo(disposeBag)
}

— Example of: distinctUntilChanged(_:) — 10 20 200