Skip to content

Commit 1c5b11d

Browse files
committed
small API change
1 parent 41e6f05 commit 1c5b11d

File tree

2 files changed

+146
-115
lines changed

2 files changed

+146
-115
lines changed
Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
@file:OptIn(ExperimentalUnsignedTypes::class)
2+
13
package org.jetbrains.kotlinx.dataframe
24

35
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnDataHolderImpl
6+
import org.jetbrains.kotlinx.dataframe.impl.columns.of
47
import kotlin.reflect.KType
58
import kotlin.reflect.typeOf
69

10+
/**
11+
* Represents the contents of a column, however it may be implemented.
12+
* The default implementation is found at [ColumnDataHolderImpl].
13+
*/
714
public interface ColumnDataHolder<T> : Iterable<T> {
815

916
public val size: Int
@@ -24,49 +31,49 @@ public interface ColumnDataHolder<T> : Iterable<T> {
2431
}
2532

2633
public fun <T> Collection<T>.toColumnDataHolder(type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
27-
ColumnDataHolderImpl.of(this, type, distinct)
34+
ColumnDataHolder.of(this, type, distinct)
2835

2936
public inline fun <reified T> Collection<T>.toColumnDataHolder(distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
3037
this.toColumnDataHolder(typeOf<T>(), distinct)
3138

3239
public fun <T> Array<T>.toColumnDataHolder(type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
33-
ColumnDataHolderImpl.of(this, type, distinct)
40+
ColumnDataHolder.of(this, type, distinct)
3441

3542
public inline fun <reified T> Array<T>.toColumnDataHolder(distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
3643
this.toColumnDataHolder(typeOf<T>(), distinct)
3744

3845
public fun BooleanArray.asColumnDataHolder(distinct: Lazy<Set<Boolean>>? = null): ColumnDataHolder<Boolean> =
39-
ColumnDataHolderImpl.of(this, typeOf<Boolean>(), distinct)
46+
ColumnDataHolder.of(this, typeOf<Boolean>(), distinct)
4047

4148
public fun ByteArray.asColumnDataHolder(distinct: Lazy<Set<Byte>>? = null): ColumnDataHolder<Byte> =
42-
ColumnDataHolderImpl.of(this, typeOf<Byte>(), distinct)
49+
ColumnDataHolder.of(this, typeOf<Byte>(), distinct)
4350

4451
public fun ShortArray.asColumnDataHolder(distinct: Lazy<Set<Short>>? = null): ColumnDataHolder<Short> =
45-
ColumnDataHolderImpl.of(this, typeOf<Short>(), distinct)
52+
ColumnDataHolder.of(this, typeOf<Short>(), distinct)
4653

4754
public fun IntArray.asColumnDataHolder(distinct: Lazy<Set<Int>>? = null): ColumnDataHolder<Int> =
48-
ColumnDataHolderImpl.of(this, typeOf<Int>(), distinct)
55+
ColumnDataHolder.of(this, typeOf<Int>(), distinct)
4956

5057
public fun LongArray.asColumnDataHolder(distinct: Lazy<Set<Long>>? = null): ColumnDataHolder<Long> =
51-
ColumnDataHolderImpl.of(this, typeOf<Long>(), distinct)
58+
ColumnDataHolder.of(this, typeOf<Long>(), distinct)
5259

5360
public fun FloatArray.asColumnDataHolder(distinct: Lazy<Set<Float>>? = null): ColumnDataHolder<Float> =
54-
ColumnDataHolderImpl.of(this, typeOf<Float>(), distinct)
61+
ColumnDataHolder.of(this, typeOf<Float>(), distinct)
5562

5663
public fun DoubleArray.asColumnDataHolder(distinct: Lazy<Set<Double>>? = null): ColumnDataHolder<Double> =
57-
ColumnDataHolderImpl.of(this, typeOf<Double>(), distinct)
64+
ColumnDataHolder.of(this, typeOf<Double>(), distinct)
5865

5966
public fun CharArray.asColumnDataHolder(distinct: Lazy<Set<Char>>? = null): ColumnDataHolder<Char> =
60-
ColumnDataHolderImpl.of(this, typeOf<Char>(), distinct)
67+
ColumnDataHolder.of(this, typeOf<Char>(), distinct)
6168

6269
public fun UByteArray.asColumnDataHolder(distinct: Lazy<Set<UByte>>? = null): ColumnDataHolder<UByte> =
63-
ColumnDataHolderImpl.of(this, typeOf<UByte>(), distinct)
70+
ColumnDataHolder.of(this, typeOf<UByte>(), distinct)
6471

6572
public fun UShortArray.asColumnDataHolder(distinct: Lazy<Set<UShort>>? = null): ColumnDataHolder<UShort> =
66-
ColumnDataHolderImpl.of(this, typeOf<UShort>(), distinct)
73+
ColumnDataHolder.of(this, typeOf<UShort>(), distinct)
6774

6875
public fun UIntArray.asColumnDataHolder(distinct: Lazy<Set<UInt>>? = null): ColumnDataHolder<UInt> =
69-
ColumnDataHolderImpl.of(this, typeOf<UInt>(), distinct)
76+
ColumnDataHolder.of(this, typeOf<UInt>(), distinct)
7077

7178
public fun ULongArray.asColumnDataHolder(distinct: Lazy<Set<ULong>>? = null): ColumnDataHolder<ULong> =
72-
ColumnDataHolderImpl.of(this, typeOf<ULong>(), distinct)
79+
ColumnDataHolder.of(this, typeOf<ULong>(), distinct)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/columns/ColumnDataHolderImpl.kt

Lines changed: 125 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -8,117 +8,23 @@ import org.jetbrains.kotlinx.dataframe.impl.isPrimitiveArray
88
import kotlin.reflect.KType
99
import kotlin.reflect.typeOf
1010

11-
internal class ColumnDataHolderImpl<T> private constructor(
12-
private val list: List<T>,
13-
distinct: Lazy<Set<T>>?,
14-
) : ColumnDataHolder<T> {
11+
internal class ColumnDataHolderImpl<T>(private val list: List<T>, distinct: Lazy<Set<T>>?) : ColumnDataHolder<T> {
1512

1613
override val distinct = distinct ?: lazy { list.toSet() }
14+
1715
override val size: Int get() = list.size
1816

1917
override fun toSet(): Set<T> = distinct.value
18+
2019
override fun toList(): List<T> = list
20+
2121
override fun get(index: Int): T = list[index]
22+
2223
override fun get(range: IntRange): List<T> = list.subList(range.first, range.last + 1)
24+
2325
override fun contains(value: T): Boolean = list.contains(value)
24-
override fun iterator(): Iterator<T> = list.iterator()
2526

26-
companion object {
27-
28-
/**
29-
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [list].
30-
*/
31-
@Suppress("UNCHECKED_CAST")
32-
internal fun <T> of(list: Collection<T>, type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> {
33-
if (list is ColumnDataHolder<*>) return list as ColumnDataHolder<T>
34-
35-
try {
36-
val newList = when (type) {
37-
BOOLEAN -> (list as Collection<Boolean>).toBooleanArray().asList()
38-
BYTE -> (list as Collection<Byte>).toByteArray().asList()
39-
SHORT -> (list as Collection<Short>).toShortArray().asList()
40-
INT -> (list as Collection<Int>).toIntArray().asList()
41-
LONG -> (list as Collection<Long>).toLongArray().asList()
42-
FLOAT -> (list as Collection<Float>).toFloatArray().asList()
43-
DOUBLE -> (list as Collection<Double>).toDoubleArray().asList()
44-
CHAR -> (list as Collection<Char>).toCharArray().asList()
45-
UBYTE -> (list as Collection<UByte>).toUByteArray().asList()
46-
USHORT -> (list as Collection<UShort>).toUShortArray().asList()
47-
UINT -> (list as Collection<UInt>).toUIntArray().asList()
48-
ULONG -> (list as Collection<ULong>).toULongArray().asList()
49-
else -> list.asList()
50-
} as List<T>
51-
52-
return ColumnDataHolderImpl(newList, distinct)
53-
} catch (e: Exception) {
54-
throw IllegalArgumentException("Can't create ColumnDataHolder from $list and type $type", e)
55-
}
56-
}
57-
58-
/**
59-
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [array].
60-
* If [array] is an array of primitives, it will be converted to a primitive array first before being
61-
* wrapped with [asList].
62-
*/
63-
@Suppress("UNCHECKED_CAST")
64-
internal fun <T> of(array: Array<T>, type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> {
65-
try {
66-
val list = when (type) {
67-
BOOLEAN -> (array as Array<Boolean>).toBooleanArray().asList()
68-
BYTE -> (array as Array<Byte>).toByteArray().asList()
69-
SHORT -> (array as Array<Short>).toShortArray().asList()
70-
INT -> (array as Array<Int>).toIntArray().asList()
71-
LONG -> (array as Array<Long>).toLongArray().asList()
72-
FLOAT -> (array as Array<Float>).toFloatArray().asList()
73-
DOUBLE -> (array as Array<Double>).toDoubleArray().asList()
74-
CHAR -> (array as Array<Char>).toCharArray().asList()
75-
UBYTE -> (array as Array<UByte>).toUByteArray().asList()
76-
USHORT -> (array as Array<UShort>).toUShortArray().asList()
77-
UINT -> (array as Array<UInt>).toUIntArray().asList()
78-
ULONG -> (array as Array<ULong>).toULongArray().asList()
79-
else -> array.asList()
80-
} as List<T>
81-
82-
return ColumnDataHolderImpl(list, distinct)
83-
} catch (e: Exception) {
84-
throw IllegalArgumentException(
85-
"Can't create ColumnDataHolder from $array and mismatching type $type",
86-
e
87-
)
88-
}
89-
}
90-
91-
/**
92-
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [primitiveArray].
93-
* [primitiveArray] must be an array of primitives, returns `null` if something goes wrong.
94-
*/
95-
@Suppress("UNCHECKED_CAST")
96-
internal fun <T> of(primitiveArray: Any, type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> {
97-
val newList = when {
98-
type == BOOLEAN && primitiveArray is BooleanArray -> primitiveArray.asList()
99-
type == BYTE && primitiveArray is ByteArray -> primitiveArray.asList()
100-
type == SHORT && primitiveArray is ShortArray -> primitiveArray.asList()
101-
type == INT && primitiveArray is IntArray -> primitiveArray.asList()
102-
type == LONG && primitiveArray is LongArray -> primitiveArray.asList()
103-
type == FLOAT && primitiveArray is FloatArray -> primitiveArray.asList()
104-
type == DOUBLE && primitiveArray is DoubleArray -> primitiveArray.asList()
105-
type == CHAR && primitiveArray is CharArray -> primitiveArray.asList()
106-
type == UBYTE && primitiveArray is UByteArray -> primitiveArray.asList()
107-
type == USHORT && primitiveArray is UShortArray -> primitiveArray.asList()
108-
type == UINT && primitiveArray is UIntArray -> primitiveArray.asList()
109-
type == ULONG && primitiveArray is ULongArray -> primitiveArray.asList()
110-
!primitiveArray.isPrimitiveArray -> throw IllegalArgumentException(
111-
"Can't create ColumnDataHolder from non primitive array $primitiveArray and type $type"
112-
)
113-
114-
else -> throw IllegalArgumentException(
115-
"Can't create ColumnDataHolder from primitive array $primitiveArray and type $type"
116-
)
117-
} as List<T>
118-
119-
return ColumnDataHolderImpl(newList, distinct)
120-
}
121-
}
27+
override fun iterator(): Iterator<T> = list.iterator()
12228
}
12329

12430
private val BOOLEAN = typeOf<Boolean>()
@@ -133,3 +39,121 @@ private val UBYTE = typeOf<UByte>()
13339
private val USHORT = typeOf<UShort>()
13440
private val UINT = typeOf<UInt>()
13541
private val ULONG = typeOf<ULong>()
42+
43+
/**
44+
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [list].
45+
*/
46+
@Suppress("UNCHECKED_CAST")
47+
internal fun <T> ColumnDataHolder.Companion.of(
48+
list: Collection<T>,
49+
type: KType,
50+
distinct: Lazy<Set<T>>? = null,
51+
): ColumnDataHolder<T> {
52+
if (list is ColumnDataHolder<*>) return list as ColumnDataHolder<T>
53+
54+
try {
55+
val newList = when (type) {
56+
BOOLEAN -> (list as Collection<Boolean>).toBooleanArray().asList()
57+
BYTE -> (list as Collection<Byte>).toByteArray().asList()
58+
SHORT -> (list as Collection<Short>).toShortArray().asList()
59+
INT -> (list as Collection<Int>).toIntArray().asList()
60+
LONG -> (list as Collection<Long>).toLongArray().asList()
61+
FLOAT -> (list as Collection<Float>).toFloatArray().asList()
62+
DOUBLE -> (list as Collection<Double>).toDoubleArray().asList()
63+
CHAR -> (list as Collection<Char>).toCharArray().asList()
64+
UBYTE -> (list as Collection<UByte>).toUByteArray().asList()
65+
USHORT -> (list as Collection<UShort>).toUShortArray().asList()
66+
UINT -> (list as Collection<UInt>).toUIntArray().asList()
67+
ULONG -> (list as Collection<ULong>).toULongArray().asList()
68+
else -> list.asList()
69+
} as List<T>
70+
71+
return ColumnDataHolderImpl(newList, distinct)
72+
} catch (e: Exception) {
73+
throw IllegalArgumentException("Can't create ColumnDataHolder from $list and type $type", e)
74+
}
75+
}
76+
77+
/**
78+
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [array].
79+
* If [array] is an array of primitives, it will be converted to a primitive array first before being
80+
* wrapped with [asList].
81+
*/
82+
@Suppress("UNCHECKED_CAST")
83+
internal fun <T> ColumnDataHolder.Companion.of(
84+
array: Array<T>,
85+
type: KType,
86+
distinct: Lazy<Set<T>>? = null,
87+
): ColumnDataHolder<T> {
88+
try {
89+
val list = when (type) {
90+
BOOLEAN -> (array as Array<Boolean>).toBooleanArray().asList()
91+
BYTE -> (array as Array<Byte>).toByteArray().asList()
92+
SHORT -> (array as Array<Short>).toShortArray().asList()
93+
INT -> (array as Array<Int>).toIntArray().asList()
94+
LONG -> (array as Array<Long>).toLongArray().asList()
95+
FLOAT -> (array as Array<Float>).toFloatArray().asList()
96+
DOUBLE -> (array as Array<Double>).toDoubleArray().asList()
97+
CHAR -> (array as Array<Char>).toCharArray().asList()
98+
UBYTE -> (array as Array<UByte>).toUByteArray().asList()
99+
USHORT -> (array as Array<UShort>).toUShortArray().asList()
100+
UINT -> (array as Array<UInt>).toUIntArray().asList()
101+
ULONG -> (array as Array<ULong>).toULongArray().asList()
102+
else -> array.asList()
103+
} as List<T>
104+
105+
return ColumnDataHolderImpl(list, distinct)
106+
} catch (e: Exception) {
107+
throw IllegalArgumentException(
108+
"Can't create ColumnDataHolder from $array and mismatching type $type",
109+
e,
110+
)
111+
}
112+
}
113+
114+
/**
115+
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [primitiveArray].
116+
* [primitiveArray] must be an array of primitives, returns `null` if something goes wrong.
117+
*/
118+
@Suppress("UNCHECKED_CAST")
119+
internal fun <T> ColumnDataHolder.Companion.of(
120+
primitiveArray: Any,
121+
type: KType,
122+
distinct: Lazy<Set<T>>? = null,
123+
): ColumnDataHolder<T> {
124+
val newList = when {
125+
type == BOOLEAN && primitiveArray is BooleanArray -> primitiveArray.asList()
126+
127+
type == BYTE && primitiveArray is ByteArray -> primitiveArray.asList()
128+
129+
type == SHORT && primitiveArray is ShortArray -> primitiveArray.asList()
130+
131+
type == INT && primitiveArray is IntArray -> primitiveArray.asList()
132+
133+
type == LONG && primitiveArray is LongArray -> primitiveArray.asList()
134+
135+
type == FLOAT && primitiveArray is FloatArray -> primitiveArray.asList()
136+
137+
type == DOUBLE && primitiveArray is DoubleArray -> primitiveArray.asList()
138+
139+
type == CHAR && primitiveArray is CharArray -> primitiveArray.asList()
140+
141+
type == UBYTE && primitiveArray is UByteArray -> primitiveArray.asList()
142+
143+
type == USHORT && primitiveArray is UShortArray -> primitiveArray.asList()
144+
145+
type == UINT && primitiveArray is UIntArray -> primitiveArray.asList()
146+
147+
type == ULONG && primitiveArray is ULongArray -> primitiveArray.asList()
148+
149+
!primitiveArray.isPrimitiveArray -> throw IllegalArgumentException(
150+
"Can't create ColumnDataHolder from non primitive array $primitiveArray and type $type",
151+
)
152+
153+
else -> throw IllegalArgumentException(
154+
"Can't create ColumnDataHolder from primitive array $primitiveArray and type $type",
155+
)
156+
} as List<T>
157+
158+
return ColumnDataHolderImpl(newList, distinct)
159+
}

0 commit comments

Comments
 (0)