summaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/iterutil.kt
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
				}
			}
		}
	}
}