blob: 7845b0507f3554f118c096e487f97f7005646446 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package moe.nea.ultranotifier.util
fun <T, K : Any> Sequence<T>.duplicatesBy(keyFunc: (T) -> K): Sequence<T> {
return object : Sequence<T> {
override fun iterator(): Iterator<T> {
val observed = HashSet<K>()
val oldIterator = this@duplicatesBy.iterator()
return object : Iterator<T> {
var next: T? = null
var hasNext = false
override fun hasNext(): Boolean {
if (hasNext) return true
while (oldIterator.hasNext()) {
val elem = oldIterator.next()
val key = keyFunc(elem)
if (observed.add(key))
continue
hasNext = true
next = elem
}
return hasNext
}
override fun next(): T {
if (!hasNext()) throw NoSuchElementException()
hasNext = false
val elem = next as T
next = null
return elem
}
}
}
}
}
|