Skip to content

Functions inline #1123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Apr 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions core/api/core.api
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ public final class org/jetbrains/kotlinx/dataframe/api/AddDsl : org/jetbrains/ko
public fun getColumnOrNull (Lkotlin/reflect/KProperty;)Lorg/jetbrains/kotlinx/dataframe/DataColumn;
public fun getColumnOrNull (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnPath;)Lorg/jetbrains/kotlinx/dataframe/DataColumn;
public fun getColumnOrNull (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/DataColumn;
public final fun getColumns ()Ljava/util/List;
public final fun getDf ()Lorg/jetbrains/kotlinx/dataframe/DataFrame;
public final fun group (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
public final fun group (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/api/AddGroup;
Expand Down Expand Up @@ -593,8 +594,14 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/AllExceptCol
public final class org/jetbrains/kotlinx/dataframe/api/AllKt {
public static final fun all (Lorg/jetbrains/kotlinx/dataframe/DataColumn;Lkotlin/jvm/functions/Function1;)Z
public static final fun all (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/jvm/functions/Function2;)Z
public static final fun allAfterInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
public static final fun allBeforeInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
public static final fun allColumnsInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Z)Lorg/jetbrains/kotlinx/dataframe/impl/columns/TransformableColumnSet;
public static synthetic fun allColumnsInternal$default (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/impl/columns/TransformableColumnSet;
public static final fun allFromInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
public static final fun allNA (Lorg/jetbrains/kotlinx/dataframe/DataRow;)Z
public static final fun allNulls (Lorg/jetbrains/kotlinx/dataframe/DataColumn;)Z
public static final fun allUpToInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
}

public abstract interface class org/jetbrains/kotlinx/dataframe/api/AndColumnsSelectionDsl {
Expand Down Expand Up @@ -1024,6 +1031,10 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/ColsInGroups
public abstract interface class org/jetbrains/kotlinx/dataframe/api/ColsInGroupsColumnsSelectionDsl$Grammar$PlainDslName {
}

public final class org/jetbrains/kotlinx/dataframe/api/ColsKt {
public static final fun colsInternal (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/impl/columns/TransformableColumnSet;
}

public abstract interface class org/jetbrains/kotlinx/dataframe/api/ColsOfColumnsSelectionDsl {
public fun colsOf (Ljava/lang/String;Lkotlin/reflect/KType;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
public fun colsOf (Lkotlin/reflect/KProperty;Lkotlin/reflect/KType;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
Expand Down Expand Up @@ -3867,6 +3878,8 @@ public final class org/jetbrains/kotlinx/dataframe/api/SortKt {
public final class org/jetbrains/kotlinx/dataframe/api/Split {
public fun <init> (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/jvm/functions/Function2;)V
public final fun cast ()Lorg/jetbrains/kotlinx/dataframe/api/Split;
public final fun getColumns ()Lkotlin/jvm/functions/Function2;
public final fun getDf ()Lorg/jetbrains/kotlinx/dataframe/DataFrame;
public fun toString ()Ljava/lang/String;
}

Expand Down Expand Up @@ -4829,6 +4842,10 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/columns/BaseColu
public abstract fun values ()Ljava/lang/Iterable;
}

public final class org/jetbrains/kotlinx/dataframe/columns/BaseColumnKt {
public static final fun getValues (Lorg/jetbrains/kotlinx/dataframe/columns/BaseColumn;)Ljava/lang/Iterable;
}

public abstract interface class org/jetbrains/kotlinx/dataframe/columns/ColumnAccessor : org/jetbrains/kotlinx/dataframe/columns/ColumnReference {
public abstract fun get (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnAccessor;
public fun getValue (Ljava/lang/Object;Lkotlin/reflect/KProperty;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnAccessor;
Expand Down Expand Up @@ -5540,6 +5557,14 @@ public final class org/jetbrains/kotlinx/dataframe/impl/api/ConvertToKt {
public static synthetic fun convertToImpl$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/reflect/KType;ZLorg/jetbrains/kotlinx/dataframe/api/ExcessiveColumns;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
}

public final class org/jetbrains/kotlinx/dataframe/impl/api/DuplicateKt {
public static final fun duplicateRowsImpl (Lorg/jetbrains/kotlinx/dataframe/DataFrame;ILjava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
}

public final class org/jetbrains/kotlinx/dataframe/impl/api/GroupByKt {
public static final fun groupByImpl (Lorg/jetbrains/kotlinx/dataframe/DataFrame;ZLkotlin/jvm/functions/Function2;)Lorg/jetbrains/kotlinx/dataframe/api/GroupBy;
}

public final class org/jetbrains/kotlinx/dataframe/impl/api/InsertKt {
public static final fun insertImpl (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnPath;Lorg/jetbrains/kotlinx/dataframe/DataColumn;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
}
Expand Down Expand Up @@ -5658,6 +5683,7 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/impl/columns/Tra

public final class org/jetbrains/kotlinx/dataframe/impl/columns/UtilsKt {
public static final fun asAnyFrameColumn (Lorg/jetbrains/kotlinx/dataframe/DataColumn;)Lorg/jetbrains/kotlinx/dataframe/columns/FrameColumn;
public static final fun transform (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/impl/columns/TransformableColumnSet;
}

public final class org/jetbrains/kotlinx/dataframe/impl/io/FastDoubleParser {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ internal interface DiffOrNullDocs
*/
@OptIn(ExperimentalTypeInference::class)
@OverloadResolutionByLambdaReturnType
public fun <T> DataRow<T>.diff(firstRowResult: Double, expression: RowExpression<T, Double>): Double =
public inline fun <T> DataRow<T>.diff(firstRowResult: Double, expression: RowExpression<T, Double>): Double =
prev()?.let { p -> expression(this, this) - expression(p, p) }
?: firstRowResult

Expand All @@ -121,21 +121,21 @@ public fun <T> DataRow<T>.diff(firstRowResult: Double, expression: RowExpression
@OptIn(ExperimentalTypeInference::class)
@OverloadResolutionByLambdaReturnType
// required to resolve `diff(0) { intValue }`
public fun <T> DataRow<T>.diff(firstRowResult: Int, expression: RowExpression<T, Int>): Int =
public inline fun <T> DataRow<T>.diff(firstRowResult: Int, expression: RowExpression<T, Int>): Int =
prev()?.let { p -> expression(this, this) - expression(p, p) }
?: firstRowResult

/**
* @include [DiffDocs]
*/
public fun <T> DataRow<T>.diff(firstRowResult: Long, expression: RowExpression<T, Long>): Long =
public inline fun <T> DataRow<T>.diff(firstRowResult: Long, expression: RowExpression<T, Long>): Long =
prev()?.let { p -> expression(this, this) - expression(p, p) }
?: firstRowResult

/**
* @include [DiffDocs]
*/
public fun <T> DataRow<T>.diff(firstRowResult: Float, expression: RowExpression<T, Float>): Float =
public inline fun <T> DataRow<T>.diff(firstRowResult: Float, expression: RowExpression<T, Float>): Float =
prev()?.let { p -> expression(this, this) - expression(p, p) }
?: firstRowResult

Expand All @@ -144,25 +144,25 @@ public fun <T> DataRow<T>.diff(firstRowResult: Float, expression: RowExpression<
*/
@OptIn(ExperimentalTypeInference::class)
@OverloadResolutionByLambdaReturnType
public fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Double>): Double? =
public inline fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Double>): Double? =
prev()?.let { p -> expression(this, this) - expression(p, p) }

/**
* @include [DiffOrNullDocs]
*/
public fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Int>): Int? =
public inline fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Int>): Int? =
prev()?.let { p -> expression(this, this) - expression(p, p) }

/**
* @include [DiffOrNullDocs]
*/
public fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Long>): Long? =
public inline fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Long>): Long? =
prev()?.let { p -> expression(this, this) - expression(p, p) }

/**
* @include [DiffOrNullDocs]
*/
public fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Float>): Float? =
public inline fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Float>): Float? =
prev()?.let { p -> expression(this, this) - expression(p, p) }

public fun AnyRow.columnsCount(): Int = df().ncol
Expand Down Expand Up @@ -205,7 +205,7 @@ public fun <T> DataRow<T>.relative(relativeIndices: IntRange): DataFrame<T> =
(relativeIndices.first + index).coerceIn(df().indices)..(relativeIndices.last + index).coerceIn(df().indices),
)

public fun <T> DataRow<T>.movingAverage(k: Int, expression: RowExpression<T, Number>): Double {
public inline fun <T> DataRow<T>.movingAverage(k: Int, expression: RowExpression<T, Number>): Double {
var count = 0
return backwardIterable().take(k).sumOf {
count++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ public class AddDsl<T>(
ColumnSelectionDsl<T> {

// TODO: support adding column into path
internal val columns = mutableListOf<AnyCol>()
@PublishedApi
internal val columns: MutableList<AnyCol> = mutableListOf<AnyCol>()

public fun add(column: AnyColumnReference): Boolean = columns.add(column.resolveSingle(df)!!.data)

Expand Down
15 changes: 10 additions & 5 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/all.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public fun AnyRow.allNA(): Boolean = owner.columns().all { it[index()].isNA }
// region DataFrame

/** Returns `true` if all [rows] match the given [predicate] or [rows] is empty. */
public fun <T> DataFrame<T>.all(predicate: RowFilter<T>): Boolean = rows().all { predicate(it, it) }
public inline fun <T> DataFrame<T>.all(predicate: RowFilter<T>): Boolean = rows().all { predicate(it, it) }

// endregion

Expand Down Expand Up @@ -1204,6 +1204,7 @@ public interface AllColumnsSelectionDsl<out _UNUSED> {
* else it simply returns a [(transformable) ColumnSet][TransformableColumnSet] from [this]
* (like when [this] is a [ColumnSet]).
*/
@PublishedApi
internal fun ColumnsResolver<*>.allColumnsInternal(removePaths: Boolean = false): TransformableColumnSet<*> =
transform { cols ->
if (this is SingleColumn<*> && cols.singleOrNull()?.isColumnGroup() == true) {
Expand All @@ -1225,7 +1226,8 @@ internal fun ColumnsResolver<*>.allColumnsInternal(removePaths: Boolean = false)
* @param colByPredicate a function that takes a ColumnWithPath and returns true if the column matches the predicate, false otherwise
* @return a new ColumnSet containing all columns after the first column that matches the given predicate
*/
internal fun ColumnsResolver<*>.allAfterInternal(colByPredicate: ColumnFilter<*>): ColumnSet<*> {
@PublishedApi
internal inline fun ColumnsResolver<*>.allAfterInternal(crossinline colByPredicate: ColumnFilter<*>): ColumnSet<*> {
var take = false
return colsInternal {
if (take) {
Expand All @@ -1243,7 +1245,8 @@ internal fun ColumnsResolver<*>.allAfterInternal(colByPredicate: ColumnFilter<*>
* @param colByPredicate the predicate used to determine if a column should be included in the resulting set
* @return a column set containing all columns that satisfy the predicate
*/
internal fun ColumnsResolver<*>.allFromInternal(colByPredicate: ColumnFilter<*>): ColumnSet<*> {
@PublishedApi
internal inline fun ColumnsResolver<*>.allFromInternal(crossinline colByPredicate: ColumnFilter<*>): ColumnSet<*> {
var take = false
return colsInternal {
if (take) {
Expand All @@ -1261,7 +1264,8 @@ internal fun ColumnsResolver<*>.allFromInternal(colByPredicate: ColumnFilter<*>)
* @param colByPredicate the predicate function used to determine if a column should be included in the returned ColumnSet
* @return a new ColumnSet containing all columns that come before the first column that satisfies the given predicate
*/
internal fun ColumnsResolver<*>.allBeforeInternal(colByPredicate: ColumnFilter<*>): ColumnSet<*> {
@PublishedApi
internal inline fun ColumnsResolver<*>.allBeforeInternal(crossinline colByPredicate: ColumnFilter<*>): ColumnSet<*> {
var take = true
return colsInternal {
if (!take) {
Expand All @@ -1279,7 +1283,8 @@ internal fun ColumnsResolver<*>.allBeforeInternal(colByPredicate: ColumnFilter<*
* @param colByPredicate a predicate function that takes a ColumnWithPath and returns true if the column satisfies the desired condition.
* @return a ColumnSet containing all columns up to the first column that satisfies the given predicate.
*/
internal fun ColumnsResolver<*>.allUpToInternal(colByPredicate: ColumnFilter<*>): ColumnSet<*> {
@PublishedApi
internal inline fun ColumnsResolver<*>.allUpToInternal(crossinline colByPredicate: ColumnFilter<*>): ColumnSet<*> {
var take = true
return colsInternal {
if (!take) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public fun <T> DataColumn<T>.any(predicate: Predicate<T>): Boolean = values.any(

// region DataFrame

public fun <T> DataFrame<T>.any(predicate: RowFilter<T>): Boolean = rows().any { predicate(it, it) }
public inline fun <T> DataFrame<T>.any(predicate: RowFilter<T>): Boolean = rows().any { predicate(it, it) }

// endregion
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import org.jetbrains.kotlinx.dataframe.RowExpression

// region DataFrame

public fun <T, V> DataFrame<T>.associateBy(transform: RowExpression<T, V>): Map<V, DataRow<T>> =
public inline fun <T, V> DataFrame<T>.associateBy(transform: RowExpression<T, V>): Map<V, DataRow<T>> =
rows().associateBy { transform(it, it) }

public fun <T, K, V> DataFrame<T>.associate(transform: RowExpression<T, Pair<K, V>>): Map<K, V> =
public inline fun <T, K, V> DataFrame<T>.associate(transform: RowExpression<T, Pair<K, V>>): Map<K, V> =
rows().associate { transform(it, it) }

// endregion
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,8 @@ public interface ColGroupsColumnsSelectionDsl {
* @return A [TransformableColumnSet] containing the column groups that satisfy the filter.
*/
@Suppress("UNCHECKED_CAST")
internal fun ColumnsResolver<*>.columnGroupsInternal(
filter: (ColumnGroup<*>) -> Boolean,
internal inline fun ColumnsResolver<*>.columnGroupsInternal(
crossinline filter: (ColumnGroup<*>) -> Boolean,
): TransformableColumnSet<AnyRow> = colsInternal { it.isColumnGroup() && filter(it) } as TransformableColumnSet<AnyRow>

// endregion
Original file line number Diff line number Diff line change
Expand Up @@ -1108,7 +1108,8 @@ internal fun SingleColumn<DataRow<*>>.colsInternal(refs: Iterable<ColumnReferenc
* Else, it returns a new [ColumnSet] containing all columns in this [ColumnsResolver] that
* match the given [predicate].
*/
internal fun ColumnsResolver<*>.colsInternal(predicate: ColumnFilter<*>): TransformableColumnSet<*> =
@PublishedApi
internal inline fun ColumnsResolver<*>.colsInternal(crossinline predicate: ColumnFilter<*>): TransformableColumnSet<*> =
allColumnsInternal().transform { it.filter(predicate) }

internal fun ColumnsResolver<*>.colsInternal(indices: IntArray): TransformableColumnSet<*> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,10 @@ public inline fun <reified C> SingleColumn<DataRow<*>>.colsOf(
* match the given [filter] and are the given [type].
*/
@Suppress("UNCHECKED_CAST")
internal fun <C> ColumnsResolver<*>.colsOfInternal(type: KType, filter: ColumnFilter<C>): TransformableColumnSet<C> =
internal inline fun <C> ColumnsResolver<*>.colsOfInternal(
type: KType,
crossinline filter: ColumnFilter<C>,
): TransformableColumnSet<C> =
colsInternal {
it.isSubtypeOf(type) && filter(it.cast())
} as TransformableColumnSet<C>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,9 @@ public interface ColsOfKindColumnsSelectionDsl {
* @param filter The filter function to apply on each column. Must accept a ColumnWithPath object and return a Boolean.
* @return A [TransformableColumnSet] containing the columns of given kinds that satisfy the filter.
*/
internal fun ColumnsResolver<*>.columnsOfKindInternal(
internal inline fun ColumnsResolver<*>.columnsOfKindInternal(
kinds: Set<ColumnKind>,
filter: ColumnFilter<*>,
crossinline filter: ColumnFilter<*>,
): TransformableColumnSet<*> = colsInternal { it.kind() in kinds && filter(it) }

// endregion
18 changes: 12 additions & 6 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/count.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ public fun <T> DataColumn<T>.count(predicate: Predicate<T>? = null): Int =

public fun AnyRow.count(): Int = columnsCount()

public fun AnyRow.count(predicate: Predicate<Any?>): Int = values().count(predicate)
public inline fun AnyRow.count(predicate: Predicate<Any?>): Int = values().count(predicate)

// endregion

// region DataFrame

public fun <T> DataFrame<T>.count(): Int = rowsCount()

public fun <T> DataFrame<T>.count(predicate: RowFilter<T>): Int = rows().count { predicate(it, it) }
public inline fun <T> DataFrame<T>.count(predicate: RowFilter<T>): Int = rows().count { predicate(it, it) }

// endregion

Expand All @@ -46,23 +46,29 @@ public fun <T> Grouped<T>.count(resultName: String = "count"): DataFrame<T> =

@Refine
@Interpretable("GroupByCount0")
public fun <T> Grouped<T>.count(resultName: String = "count", predicate: RowFilter<T>): DataFrame<T> =
aggregateValue(resultName) { count(predicate) default 0 }
public inline fun <T> Grouped<T>.count(
resultName: String = "count",
crossinline predicate: RowFilter<T>,
): DataFrame<T> = aggregateValue(resultName) { count(predicate) default 0 }

// endregion

// region Pivot

public fun <T> Pivot<T>.count(): DataRow<T> = delegate { count() }

public fun <T> Pivot<T>.count(predicate: RowFilter<T>): DataRow<T> = delegate { count(predicate) }
public inline fun <T> Pivot<T>.count(crossinline predicate: RowFilter<T>): DataRow<T> = delegate { count(predicate) }

// endregion

// region PivotGroupBy

public fun <T> PivotGroupBy<T>.count(): DataFrame<T> = aggregate { count() default 0 }

public fun <T> PivotGroupBy<T>.count(predicate: RowFilter<T>): DataFrame<T> = aggregate { count(predicate) default 0 }
public inline fun <T> PivotGroupBy<T>.count(crossinline predicate: RowFilter<T>): DataFrame<T> =
aggregate {
count(predicate) default
0
}

// endregion
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import kotlin.reflect.KProperty

// region DataColumn

public fun <T> DataColumn<T>.drop(predicate: Predicate<T>): DataColumn<T> = filter { !predicate(it) }
public inline fun <T> DataColumn<T>.drop(predicate: Predicate<T>): DataColumn<T> = filter { !predicate(it) }

public fun <T> DataColumn<T>.drop(n: Int): DataColumn<T> =
when {
Expand Down Expand Up @@ -62,13 +62,13 @@ public fun <T> DataFrame<T>.dropLast(n: Int = 1): DataFrame<T> {
/**
* Returns a DataFrame containing all rows except rows that satisfy the given [predicate].
*/
public fun <T> DataFrame<T>.drop(predicate: RowFilter<T>): DataFrame<T> = filter { !predicate(it, it) }
public inline fun <T> DataFrame<T>.drop(predicate: RowFilter<T>): DataFrame<T> = filter { !predicate(it, it) }

/**
* Returns a DataFrame containing all rows except first rows that satisfy the given [predicate].
*/
public fun <T> DataFrame<T>.dropWhile(predicate: RowFilter<T>): DataFrame<T> =
firstOrNull { !predicate(it, it) }?.let { drop(it.index) } ?: this
public inline fun <T> DataFrame<T>.dropWhile(predicate: RowFilter<T>): DataFrame<T> =
firstOrNull { !predicate(it, it) }?.let { drop(it.index()) } ?: this

// endregion

Expand Down
Loading