forked from kscience/kmath
Basic cumulative operation and cumulative sum #10
This commit is contained in:
parent
80bd0e4e6a
commit
982bee02ba
@ -1,5 +1,5 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.2.60'
|
ext.kotlin_version = '1.2.61'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
package scientifik.kmath.misc
|
||||||
|
|
||||||
|
import kotlin.jvm.JvmName
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic cumulative operation on iterator
|
||||||
|
* @param T type of initial iterable
|
||||||
|
* @param R type of resulting iterable
|
||||||
|
* @param initial lazy evaluated
|
||||||
|
*/
|
||||||
|
fun <T, R> Iterator<T>.cumulative(initial: R, operation: (T, R) -> R): Iterator<R> = object : Iterator<R> {
|
||||||
|
var state: R = initial
|
||||||
|
override fun hasNext(): Boolean = this@cumulative.hasNext()
|
||||||
|
|
||||||
|
override fun next(): R {
|
||||||
|
state = operation.invoke(this@cumulative.next(), state)
|
||||||
|
return state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T, R> Iterable<T>.cumulative(initial: R, operation: (T, R) -> R): Iterable<R> = object : Iterable<R> {
|
||||||
|
override fun iterator(): Iterator<R> = this@cumulative.iterator().cumulative(initial, operation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T, R> Sequence<T>.cumulative(initial: R, operation: (T, R) -> R): Sequence<R> = object : Sequence<R> {
|
||||||
|
override fun iterator(): Iterator<R> = this@cumulative.iterator().cumulative(initial, operation)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T, R> List<T>.cumulative(initial: R, operation: (T, R) -> R): List<R> = this.iterator().cumulative(initial, operation).asSequence().toList()
|
||||||
|
|
||||||
|
//Cumulative sum
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfDouble")
|
||||||
|
fun Iterable<Double>.cumulativeSum() = this.cumulative(0.0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfInt")
|
||||||
|
fun Iterable<Int>.cumulativeSum() = this.cumulative(0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfLong")
|
||||||
|
fun Iterable<Long>.cumulativeSum() = this.cumulative(0L){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfDouble")
|
||||||
|
fun Sequence<Double>.cumulativeSum() = this.cumulative(0.0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfInt")
|
||||||
|
fun Sequence<Int>.cumulativeSum() = this.cumulative(0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfLong")
|
||||||
|
fun Sequence<Long>.cumulativeSum() = this.cumulative(0L){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfDouble")
|
||||||
|
fun List<Double>.cumulativeSum() = this.cumulative(0.0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfInt")
|
||||||
|
fun List<Int>.cumulativeSum() = this.cumulative(0){ element, sum -> sum + element}
|
||||||
|
|
||||||
|
@JvmName("cumulativeSumOfLong")
|
||||||
|
fun List<Long>.cumulativeSum() = this.cumulative(0L){ element, sum -> sum + element}
|
@ -0,0 +1,13 @@
|
|||||||
|
package scientifik.kmath.misc
|
||||||
|
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class CumulativeKtTest {
|
||||||
|
@Test
|
||||||
|
fun testCumulativeSum() {
|
||||||
|
val initial = listOf(-1.0, 2.0, 1.0, 1.0)
|
||||||
|
val cumulative = initial.cumulativeSum()
|
||||||
|
assertEquals(listOf(-1.0, 1.0, 2.0, 3.0), cumulative)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user