ComparableTimeMark and specialized TimeSource KT-54082

- Introduce ComparableTimeMark interface extending TimeMark,
and TimeSource.WithComparableMarks - a time source that returns such time marks.
- Implement ComparableTimeMark in ValueTimeMark and AbstractLong/DoubleTimeMark classes.
This commit is contained in:
Ilya Gorbunov
2022-06-27 23:31:36 +03:00
committed by Space
parent a4b2a8c4ea
commit 57c9d61291
11 changed files with 534 additions and 87 deletions
@@ -20,7 +20,7 @@ private external fun dateNow(): Double
@SinceKotlin("1.3")
@ExperimentalTime
internal actual object MonotonicTimeSource : TimeSource {
internal actual object MonotonicTimeSource : TimeSource.WithComparableMarks {
private val performance: ExternalInterfaceType? = tryGetPerformance()
private fun read(): Double =
@@ -31,6 +31,12 @@ internal actual object MonotonicTimeSource : TimeSource {
actual fun adjustReading(timeMark: ValueTimeMark, duration: Duration): ValueTimeMark =
ValueTimeMark(sumCheckNaN(timeMark.reading as Double + duration.toDouble(DurationUnit.MILLISECONDS)))
actual fun differenceBetween(one: ValueTimeMark, another: ValueTimeMark): Duration {
val ms1 = one.reading as Double
val ms2 = another.reading as Double
return if (ms1 == ms2) Duration.ZERO else (ms1 - ms2).milliseconds
}
override fun toString(): String =
if (performance != null) "TimeSource(globalThis.performance.now())" else "TimeSource(Date.now())"
}