1
1
package org.jetbrains.kotlinx.dataframe.math
2
2
3
3
import java.math.BigDecimal
4
+ import java.math.BigInteger
4
5
import kotlin.reflect.KType
5
6
6
7
@PublishedApi
@@ -11,34 +12,77 @@ internal fun <T, R : Number> Iterable<T>.sumOf(type: KType, selector: (T) -> R?)
11
12
}
12
13
return when (type.classifier) {
13
14
Double ::class -> sumOf(selector as ((T ) -> Double )) as R
15
+
16
+ // careful, conversion to Double to Float occurs! TODO
17
+ Float ::class -> sumOf { (selector as ((T ) -> Float ))(it).toDouble() }.toFloat() as R
18
+
14
19
Int ::class -> sumOf(selector as ((T ) -> Int )) as R
20
+
21
+ // careful, cast to Int occurs! TODO
22
+ Short ::class -> sumOf { (selector as ((T ) -> Short ))(it).toInt() } as R
23
+
24
+ // careful, cast to Int occurs! TODO
25
+ Byte ::class -> sumOf { (selector as ((T ) -> Byte ))(it).toInt() } as R
26
+
15
27
Long ::class -> sumOf(selector as ((T ) -> Long )) as R
28
+
16
29
BigDecimal ::class -> sumOf(selector as ((T ) -> BigDecimal )) as R
17
- else -> TODO ()
30
+
31
+ BigInteger ::class -> sumOf(selector as ((T ) -> BigInteger )) as R
32
+
33
+ Number ::class -> sumOf { (selector as ((T ) -> Number ))(it).toDouble() } as R
34
+
35
+ Nothing ::class -> 0.0 as R
36
+
37
+ else -> throw IllegalArgumentException (" sumOf is not supported for $type " )
18
38
}
19
39
}
20
40
21
41
@PublishedApi
22
42
internal fun <T : Number > Iterable<T>.sum (type : KType ): T =
23
43
when (type.classifier) {
24
44
Double ::class -> (this as Iterable <Double >).sum() as T
45
+
25
46
Float ::class -> (this as Iterable <Float >).sum() as T
47
+
48
+ // careful, cast to Int occurs! TODO
26
49
Int ::class , Short ::class , Byte ::class -> (this as Iterable <Int >).sum() as T
50
+
27
51
Long ::class -> (this as Iterable <Long >).sum() as T
52
+
28
53
BigDecimal ::class -> (this as Iterable <BigDecimal >).sum() as T
29
- else -> throw IllegalArgumentException (" Sum is not supported for $type " )
54
+
55
+ BigInteger ::class -> (this as Iterable <BigInteger >).sum() as T
56
+
57
+ Number ::class -> (this as Iterable <Number >).map { it.toDouble() }.sum() as T
58
+
59
+ Nothing ::class -> 0.0 as T
60
+
61
+ else -> throw IllegalArgumentException (" sum is not supported for $type " )
30
62
}
31
63
32
64
@JvmName(" sumNullableT" )
33
65
@PublishedApi
34
66
internal fun <T : Number > Iterable<T?>.sum (type : KType ): T =
35
67
when (type.classifier) {
36
68
Double ::class -> (this as Iterable <Double ?>).asSequence().filterNotNull().sum() as T
69
+
37
70
Float ::class -> (this as Iterable <Float ?>).asSequence().filterNotNull().sum() as T
71
+
72
+ // careful, cast to Int occurs! TODO
38
73
Int ::class , Short ::class , Byte ::class -> (this as Iterable <Int ?>).asSequence().filterNotNull().sum() as T
74
+
39
75
Long ::class -> (this as Iterable <Long ?>).asSequence().filterNotNull().sum() as T
76
+
40
77
BigDecimal ::class -> (this as Iterable <BigDecimal ?>).asSequence().filterNotNull().sum() as T
41
- else -> TODO ()
78
+
79
+ BigInteger ::class -> (this as Iterable <BigInteger ?>).asSequence().filterNotNull().sum() as T
80
+
81
+ Number ::class -> (this as Iterable <Number ?>).asSequence().filterNotNull().map { it.toDouble() }.sum() as T
82
+
83
+ Nothing ::class -> 0.0 as T
84
+
85
+ else -> throw IllegalArgumentException (" sum is not supported for $type " )
42
86
}
43
87
44
88
@PublishedApi
@@ -58,3 +102,21 @@ internal fun Sequence<BigDecimal>.sum(): BigDecimal {
58
102
}
59
103
return sum
60
104
}
105
+
106
+ @PublishedApi
107
+ internal fun Iterable<BigInteger>.sum (): BigInteger {
108
+ var sum: BigInteger = BigInteger .ZERO
109
+ for (element in this ) {
110
+ sum + = element
111
+ }
112
+ return sum
113
+ }
114
+
115
+ @PublishedApi
116
+ internal fun Sequence<BigInteger>.sum (): BigInteger {
117
+ var sum: BigInteger = BigInteger .ZERO
118
+ for (element in this ) {
119
+ sum + = element
120
+ }
121
+ return sum
122
+ }
0 commit comments