Skip to content

Instantly share code, notes, and snippets.

@danielt1263
Last active July 21, 2023 16:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielt1263/9448349563e6473a49fe316c194a2aff to your computer and use it in GitHub Desktop.
Save danielt1263/9448349563e6473a49fe316c194a2aff to your computer and use it in GitHub Desktop.
A conditional debounce operator.
class Tests: XCTestCase {
var scheduler: TestScheduler!
var result: TestableObserver<String>!
var disposeBag: DisposeBag!
override func setUp() {
super.setUp()
scheduler = TestScheduler(initialClock: 0, resolution: 0.1)
result = scheduler.createObserver(String.self)
disposeBag = DisposeBag()
}
func test1() {
let source = scheduler.createColdObservable([.next(0, ""), .next(10, "H"), .next(20, "He"), .next(40, "Hel")])
source
.clearingDebounce(isDebounced: { !$0.isEmpty }, delay: .seconds(1), scheduler: scheduler)
.subscribe(result)
.disposed(by: disposeBag)
scheduler.start()
XCTAssertEqual(result.events, [.next(0, ""), .next(30, "He"), .next(50, "Hel")])
}
func test2() {
let source = scheduler.createColdObservable([.next(0, ""), .next(10, "H"), .next(30, "He"), .next(40, "")])
source
.clearingDebounce(isDebounced: { !$0.isEmpty }, delay: .seconds(1), scheduler: scheduler)
.subscribe(result)
.disposed(by: disposeBag)
scheduler.start()
XCTAssertEqual(result.events, [.next(0, ""), .next(20, "H"), .next(40, "")])
}
}
//
// ClearningDebounce.swift
//
// Created by Daniel Tartaglia on 21 Aug 2019.
// Copyright © 2019 Daniel Tartaglia. MIT License.
//
import RxSwift
extension ObservableType {
func clearingDebounce(isDebounced: @escaping (Element) -> Bool, delay: RxTimeInterval, scheduler: SchedulerType) -> Observable<Element> {
flatMapLatest {
isDebounced($0) ? Observable.just($0).delay(delay, scheduler: scheduler) : Observable.just($0)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment