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
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)
|
|
}
|
|
}
|
|
}
|
|
}
|