aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/collections/RangeUtil.kt
blob: a7029acce41790515edde34590e11eef3b1a4957 (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
37
38
39
40
package moe.nea.firmament.util.collections

import kotlin.math.floor

val ClosedFloatingPointRange<Float>.centre get() = (endInclusive + start) / 2

fun ClosedFloatingPointRange<Float>.nonNegligibleSubSectionsAlignedWith(
	interval: Float
): Iterable<Float> {
	require(interval.isFinite())
	val range = this
	return object : Iterable<Float> {
		override fun iterator(): Iterator<Float> {
			return object : FloatIterator() {
				var polledValue: Float = range.start
				var lastValue: Float = polledValue

				override fun nextFloat(): Float {
					if (!hasNext()) throw NoSuchElementException()
					lastValue = polledValue
					polledValue = Float.NaN
					return lastValue
				}

				override fun hasNext(): Boolean {
					if (!polledValue.isNaN()) {
						return true
					}
					if (lastValue == range.endInclusive)
						return false
					polledValue = (floor(lastValue / interval) + 1) * interval
					if (polledValue > range.endInclusive) {
						polledValue = range.endInclusive
					}
					return true
				}
			}
		}
	}
}