You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

69 lines
2.5 KiB

//
// distinct.swift
// RxSwiftExt
//
// Created by Segii Shulga on 5/4/16.
// Copyright © 2017 RxSwift Community. All rights reserved.
//
import Foundation
import RxSwift
extension Observable {
/**
Suppress duplicate items emitted by an Observable
- seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
- parameter predicate: predicate determines whether element distinct
- returns: An observable sequence only containing the distinct contiguous elements, based on predicate, from the source sequence.
*/
public func distinct(_ predicate: @escaping (Element) throws -> Bool) -> Observable<Element> {
var cache = [Element]()
return flatMap { element -> Observable<Element> in
if try cache.contains(where: predicate) {
return Observable<Element>.empty()
} else {
cache.append(element)
return Observable<Element>.just(element)
}
}
}
}
extension Observable where Element: Hashable {
/**
Suppress duplicate items emitted by an Observable
- seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
- returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.
*/
public func distinct() -> Observable<Element> {
var cache = Set<Element>()
return flatMap { element -> Observable<Element> in
if cache.contains(element) {
return Observable<Element>.empty()
} else {
cache.insert(element)
return Observable<Element>.just(element)
}
}
}
}
extension Observable where Element: Equatable {
/**
Suppress duplicate items emitted by an Observable
- seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
- returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.
*/
public func distinct() -> Observable<Element> {
var cache = [Element]()
return flatMap { element -> Observable<Element> in
if cache.contains(element) {
return Observable<Element>.empty()
} else {
cache.append(element)
return Observable<Element>.just(element)
}
}
}
}