1
- @file:OptIn(ExperimentalContracts ::class )
1
+ @file:OptIn(ExperimentalContracts ::class , ExperimentalExtendedContracts :: class )
2
2
3
3
package org.jetbrains.kotlinx.dataframe.api
4
4
5
5
import org.jetbrains.kotlinx.dataframe.AnyCol
6
+ import org.jetbrains.kotlinx.dataframe.DataColumn
6
7
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
7
8
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
8
9
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
@@ -17,6 +18,7 @@ import org.jetbrains.kotlinx.dataframe.util.IS_COMPARABLE
17
18
import org.jetbrains.kotlinx.dataframe.util.IS_COMPARABLE_REPLACE
18
19
import org.jetbrains.kotlinx.dataframe.util.IS_INTER_COMPARABLE_IMPORT
19
20
import kotlin.contracts.ExperimentalContracts
21
+ import kotlin.contracts.ExperimentalExtendedContracts
20
22
import kotlin.contracts.contract
21
23
import kotlin.reflect.KType
22
24
import kotlin.reflect.full.isSubtypeOf
@@ -40,21 +42,36 @@ public fun AnyCol.isValueColumn(): Boolean {
40
42
public fun AnyCol.isSubtypeOf (type : KType ): Boolean =
41
43
this .type.isSubtypeOf(type) && (! this .type.isMarkedNullable || type.isMarkedNullable)
42
44
43
- public inline fun <reified T > AnyCol.isSubtypeOf (): Boolean = isSubtypeOf(typeOf<T >())
45
+ public inline fun <reified T > AnyCol.isSubtypeOf (): Boolean {
46
+ contract { returns(true ) implies (this @isSubtypeOf is DataColumn <T >) }
47
+ return isSubtypeOf(typeOf<T >())
48
+ }
44
49
45
- public inline fun <reified T > AnyCol.isType (): Boolean = type() == typeOf<T >()
50
+ public inline fun <reified T > AnyCol.isType (): Boolean {
51
+ contract { returns(true ) implies (this @isType is DataColumn <T >) }
52
+ return type() == typeOf<T >()
53
+ }
46
54
47
55
/* * Returns `true` when this column's type is a subtype of `Number?` */
48
- public fun AnyCol.isNumber (): Boolean = isSubtypeOf<Number ?>()
56
+ public fun AnyCol.isNumber (): Boolean {
57
+ contract { returns(true ) implies (this @isNumber is ValueColumn <Number ?>) }
58
+ return isSubtypeOf<Number ?>()
59
+ }
49
60
50
61
/* * Returns `true` only when this column's type is exactly `Number` or `Number?`. */
51
- public fun AnyCol.isMixedNumber (): Boolean = type().isMixedNumber()
62
+ public fun AnyCol.isMixedNumber (): Boolean {
63
+ contract { returns(true ) implies (this @isMixedNumber is ValueColumn <Number ?>) }
64
+ return type().isMixedNumber()
65
+ }
52
66
53
67
/* *
54
68
* Returns `true` when this column has the (nullable) type of either:
55
69
* [Byte], [Short], [Int], [Long], [Float], or [Double].
56
70
*/
57
- public fun AnyCol.isPrimitiveNumber (): Boolean = type().isPrimitiveNumber()
71
+ public fun AnyCol.isPrimitiveNumber (): Boolean {
72
+ contract { returns(true ) implies (this @isPrimitiveNumber is ValueColumn <Number ?>) }
73
+ return type().isPrimitiveNumber()
74
+ }
58
75
59
76
/* *
60
77
* Returns `true` when this column has the (nullable) type of either:
@@ -63,9 +80,15 @@ public fun AnyCol.isPrimitiveNumber(): Boolean = type().isPrimitiveNumber()
63
80
* Careful: Will return `true` if the column contains multiple number types that
64
81
* might NOT be primitive.
65
82
*/
66
- public fun AnyCol.isPrimitiveOrMixedNumber (): Boolean = type().isPrimitiveOrMixedNumber()
83
+ public fun AnyCol.isPrimitiveOrMixedNumber (): Boolean {
84
+ contract { returns(true ) implies (this @isPrimitiveOrMixedNumber is ValueColumn <Number ?>) }
85
+ return type().isPrimitiveOrMixedNumber()
86
+ }
67
87
68
- public fun AnyCol.isList (): Boolean = typeClass == List ::class
88
+ public fun AnyCol.isList (): Boolean {
89
+ contract { returns(true ) implies (this @isList is ValueColumn <List <* >>) }
90
+ return typeClass == List ::class
91
+ }
69
92
70
93
/* * @include [valuesAreComparable] */
71
94
@Deprecated(
@@ -84,4 +107,7 @@ public fun AnyCol.isComparable(): Boolean = valuesAreComparable()
84
107
*
85
108
* Technically, this means the values' common type `T(?)` is a subtype of [Comparable]`<in T>(?)`
86
109
*/
87
- public fun AnyCol.valuesAreComparable (): Boolean = isValueColumn() && type().isIntraComparable()
110
+ public fun <T > DataColumn<T>.valuesAreComparable (): Boolean {
111
+ contract { returns(true ) implies (this @valuesAreComparable is ValueColumn <Comparable <T >>) }
112
+ return isValueColumn() && type().isIntraComparable()
113
+ }
0 commit comments