package moe.nea.ultranotifier.util fun Sequence.duplicatesBy(keyFunc: (T) -> K): Sequence { return object : Sequence { override fun iterator(): Iterator { val observed = HashSet() val oldIterator = this@duplicatesBy.iterator() return object : Iterator { 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 } } } } }