Skip to content

Commit 6123ded

Browse files
committed
wrapAsNonEmpty functions
1 parent ff3db0f commit 6123ded

5 files changed

Lines changed: 94 additions & 1 deletion

File tree

arrow-libs/core/arrow-core/api/android/arrow-core.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,8 +499,11 @@ public final class arrow/core/NonEmptyListKt {
499499
public static final fun nonEmptyListOf (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/util/List;
500500
public static final fun toNonEmptyListOrNone (Ljava/lang/Iterable;)Larrow/core/Option;
501501
public static final fun toNonEmptyListOrNull (Ljava/lang/Iterable;)Ljava/util/List;
502+
public static final fun toNonEmptyListOrThrow (Ljava/lang/Iterable;)Ljava/util/List;
502503
public static final fun unzip-GZgkXh4 (Ljava/util/List;)Lkotlin/Pair;
503504
public static final fun unzip-ZALtuoE (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair;
505+
public static final fun wrapAsNonEmptyListOrNull (Ljava/util/List;)Ljava/util/List;
506+
public static final fun wrapAsNonEmptyListOrThrow (Ljava/util/List;)Ljava/util/List;
504507
}
505508

506509
public final class arrow/core/NonEmptySet : arrow/core/NonEmptyCollection, java/util/Set, kotlin/jvm/internal/markers/KMappedMarker {
@@ -572,6 +575,9 @@ public final class arrow/core/NonEmptySetKt {
572575
public static final synthetic fun toNonEmptySetOrNone (Ljava/util/Set;)Larrow/core/Option;
573576
public static final fun toNonEmptySetOrNull (Ljava/lang/Iterable;)Ljava/util/Set;
574577
public static final synthetic fun toNonEmptySetOrNull (Ljava/util/Set;)Ljava/util/Set;
578+
public static final fun toNonEmptySetOrThrow (Ljava/lang/Iterable;)Ljava/util/Set;
579+
public static final fun wrapAsNonEmptySetOrNull (Ljava/util/Set;)Ljava/util/Set;
580+
public static final fun wrapAsNonEmptySetOrThrow (Ljava/util/Set;)Ljava/util/Set;
575581
}
576582

577583
public final class arrow/core/NonFatalKt {

arrow-libs/core/arrow-core/api/arrow-core.klib.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,13 +811,19 @@ final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/split()
811811
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/tail(): kotlin.collections/List<#A> // arrow.core/tail|tail@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
812812
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptyListOrNone(): arrow.core/Option<arrow.core/NonEmptyList<#A>> // arrow.core/toNonEmptyListOrNone|toNonEmptyListOrNone@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
813813
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptyListOrNull(): arrow.core/NonEmptyList<#A>? // arrow.core/toNonEmptyListOrNull|toNonEmptyListOrNull@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
814+
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptyListOrThrow(): arrow.core/NonEmptyList<#A>? // arrow.core/toNonEmptyListOrThrow|toNonEmptyListOrThrow@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
814815
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptySetOrNone(): arrow.core/Option<arrow.core/NonEmptySet<#A>> // arrow.core/toNonEmptySetOrNone|toNonEmptySetOrNone@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
815816
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptySetOrNull(): arrow.core/NonEmptySet<#A>? // arrow.core/toNonEmptySetOrNull|toNonEmptySetOrNull@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
817+
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/toNonEmptySetOrThrow(): arrow.core/NonEmptySet<#A>? // arrow.core/toNonEmptySetOrThrow|toNonEmptySetOrThrow@kotlin.collections.Iterable<0:0>(){0§<kotlin.Any?>}[0]
816818
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<arrow.core/Option<#A>>).arrow.core/filterOption(): kotlin.collections/List<#A> // arrow.core/filterOption|filterOption@kotlin.collections.Iterable<arrow.core.Option<0:0>>(){0§<kotlin.Any?>}[0]
817819
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<arrow.core/Option<#A>>).arrow.core/flattenOption(): kotlin.collections/List<#A> // arrow.core/flattenOption|flattenOption@kotlin.collections.Iterable<arrow.core.Option<0:0>>(){0§<kotlin.Any?>}[0]
818820
final fun <#A: kotlin/Any?> (kotlin.collections/Iterable<kotlin.collections/Iterable<#A>>).arrow.core/flatten(): kotlin.collections/List<#A> // arrow.core/flatten|flatten@kotlin.collections.Iterable<kotlin.collections.Iterable<0:0>>(){0§<kotlin.Any?>}[0]
821+
final fun <#A: kotlin/Any?> (kotlin.collections/List<#A>).arrow.core/wrapAsNonEmptyListOrNull(): arrow.core/NonEmptyList<#A>? // arrow.core/wrapAsNonEmptyListOrNull|wrapAsNonEmptyListOrNull@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}[0]
822+
final fun <#A: kotlin/Any?> (kotlin.collections/List<#A>).arrow.core/wrapAsNonEmptyListOrThrow(): arrow.core/NonEmptyList<#A> // arrow.core/wrapAsNonEmptyListOrThrow|wrapAsNonEmptyListOrThrow@kotlin.collections.List<0:0>(){0§<kotlin.Any?>}[0]
819823
final fun <#A: kotlin/Any?> (kotlin.collections/Set<#A>).arrow.core/toNonEmptySetOrNone(): arrow.core/Option<arrow.core/NonEmptySet<#A>> // arrow.core/toNonEmptySetOrNone|toNonEmptySetOrNone@kotlin.collections.Set<0:0>(){0§<kotlin.Any?>}[0]
820824
final fun <#A: kotlin/Any?> (kotlin.collections/Set<#A>).arrow.core/toNonEmptySetOrNull(): arrow.core/NonEmptySet<#A>? // arrow.core/toNonEmptySetOrNull|toNonEmptySetOrNull@kotlin.collections.Set<0:0>(){0§<kotlin.Any?>}[0]
825+
final fun <#A: kotlin/Any?> (kotlin.collections/Set<#A>).arrow.core/wrapAsNonEmptySetOrNull(): arrow.core/NonEmptySet<#A>? // arrow.core/wrapAsNonEmptySetOrNull|wrapAsNonEmptySetOrNull@kotlin.collections.Set<0:0>(){0§<kotlin.Any?>}[0]
826+
final fun <#A: kotlin/Any?> (kotlin.collections/Set<#A>).arrow.core/wrapAsNonEmptySetOrThrow(): arrow.core/NonEmptySet<#A> // arrow.core/wrapAsNonEmptySetOrThrow|wrapAsNonEmptySetOrThrow@kotlin.collections.Set<0:0>(){0§<kotlin.Any?>}[0]
821827
final fun <#A: kotlin/Any?> (kotlin.coroutines.cancellation/CancellationException).arrow.core.raise/raisedOrRethrow(arrow.core.raise/DefaultRaise): #A // arrow.core.raise/raisedOrRethrow|raisedOrRethrow@kotlin.coroutines.cancellation.CancellationException(arrow.core.raise.DefaultRaise){0§<kotlin.Any?>}[0]
822828
final fun <#A: kotlin/Any?> (kotlin.sequences/Sequence<#A>).arrow.core/interleave(kotlin.sequences/Sequence<#A>): kotlin.sequences/Sequence<#A> // arrow.core/interleave|interleave@kotlin.sequences.Sequence<0:0>(kotlin.sequences.Sequence<0:0>){0§<kotlin.Any?>}[0]
823829
final fun <#A: kotlin/Any?> (kotlin.sequences/Sequence<#A>).arrow.core/many(): kotlin.sequences/Sequence<kotlin.sequences/Sequence<#A>> // arrow.core/many|many@kotlin.sequences.Sequence<0:0>(){0§<kotlin.Any?>}[0]

arrow-libs/core/arrow-core/api/jvm/arrow-core.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,11 @@ public final class arrow/core/NonEmptyListKt {
495495
public static final fun nonEmptyListOf (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/util/List;
496496
public static final fun toNonEmptyListOrNone (Ljava/lang/Iterable;)Larrow/core/Option;
497497
public static final fun toNonEmptyListOrNull (Ljava/lang/Iterable;)Ljava/util/List;
498+
public static final fun toNonEmptyListOrThrow (Ljava/lang/Iterable;)Ljava/util/List;
498499
public static final fun unzip-GZgkXh4 (Ljava/util/List;)Lkotlin/Pair;
499500
public static final fun unzip-ZALtuoE (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair;
501+
public static final fun wrapAsNonEmptyListOrNull (Ljava/util/List;)Ljava/util/List;
502+
public static final fun wrapAsNonEmptyListOrThrow (Ljava/util/List;)Ljava/util/List;
500503
}
501504

502505
public final class arrow/core/NonEmptySet : arrow/core/NonEmptyCollection, java/util/Set, kotlin/jvm/internal/markers/KMappedMarker {
@@ -568,6 +571,9 @@ public final class arrow/core/NonEmptySetKt {
568571
public static final synthetic fun toNonEmptySetOrNone (Ljava/util/Set;)Larrow/core/Option;
569572
public static final fun toNonEmptySetOrNull (Ljava/lang/Iterable;)Ljava/util/Set;
570573
public static final synthetic fun toNonEmptySetOrNull (Ljava/util/Set;)Ljava/util/Set;
574+
public static final fun toNonEmptySetOrThrow (Ljava/lang/Iterable;)Ljava/util/Set;
575+
public static final fun wrapAsNonEmptySetOrNull (Ljava/util/Set;)Ljava/util/Set;
576+
public static final fun wrapAsNonEmptySetOrThrow (Ljava/util/Set;)Ljava/util/Set;
571577
}
572578

573579
public final class arrow/core/NonFatalKt {

arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptyList.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,13 +416,51 @@ public inline fun <Error, E, T> NonEmptyList<E>.mapOrAccumulate(
416416
): Either<NonEmptyList<Error>, NonEmptyList<T>> =
417417
all.mapOrAccumulate(transform).map { requireNotNull(it.toNonEmptyListOrNull()) }
418418

419+
/**
420+
* Returns a [NonEmptyList] that contains a **copy** of the elements in [this].
421+
*/
419422
@JvmName("toNonEmptyListOrNull")
420423
public fun <T> Iterable<T>.toNonEmptyListOrNull(): NonEmptyList<T>? {
421424
val iter = iterator()
422425
if (!iter.hasNext()) return null
423426
return NonEmptyList(iter.next(), Iterable { iter }.toList())
424427
}
425428

429+
/**
430+
* Returns a [NonEmptyList] that contains a **copy** of the elements in [this].
431+
*/
426432
@JvmName("toNonEmptyListOrNone")
427433
public fun <T> Iterable<T>.toNonEmptyListOrNone(): Option<NonEmptyList<T>> =
428434
toNonEmptyListOrNull().toOption()
435+
436+
/**
437+
* Returns a [NonEmptyList] that contains a **copy** of the elements in [this].
438+
*/
439+
@JvmName("toNonEmptyListOrThrow")
440+
public fun <T> Iterable<T>.toNonEmptyListOrThrow(): NonEmptyList<T>? {
441+
val iter = iterator()
442+
require(iter.hasNext())
443+
return NonEmptyList(Iterable { iter }.toList())
444+
}
445+
446+
/**
447+
* Returns a [NonEmptyList] that wraps the given [this], avoiding an additional copy.
448+
*
449+
* Any modification made to [this] will also be visible through the returned [NonEmptyList].
450+
* You are responsible for keeping the non-emptiness invariant at all times.
451+
*/
452+
public fun <T> List<T>.wrapAsNonEmptyListOrThrow(): NonEmptyList<T> {
453+
require(isNotEmpty())
454+
return NonEmptyList(this)
455+
}
456+
457+
/**
458+
* Returns a [NonEmptyList] that wraps the given [this], avoiding an additional copy.
459+
*
460+
* Any modification made to [this] will also be visible through the returned [NonEmptyList].
461+
* You are responsible for keeping the non-emptiness invariant at all times.
462+
*/
463+
public fun <T> List<T>.wrapAsNonEmptyListOrNull(): NonEmptyList<T>? = when {
464+
isEmpty() -> null
465+
else -> NonEmptyList(this)
466+
}

arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptySet.kt

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import kotlin.experimental.ExperimentalTypeInference
77
import kotlin.jvm.JvmInline
88

99
@JvmInline
10-
public value class NonEmptySet<out E> private constructor(
10+
public value class NonEmptySet<out E> internal constructor(
1111
@PublishedApi internal val elements: Set<E>
1212
) : Set<E> by elements, NonEmptyCollection<E> {
1313

@@ -68,19 +68,56 @@ public inline fun <Error, E, T> NonEmptySet<E>.mapOrAccumulate(
6868
public fun <E> nonEmptySetOf(first: E, vararg rest: E): NonEmptySet<E> =
6969
NonEmptySet(first, rest.asIterable())
7070

71+
/**
72+
* Returns a [NonEmptySet] that contains a **copy** of the elements in [this].
73+
*/
7174
public fun <T> Iterable<T>.toNonEmptySetOrNull(): NonEmptySet<T>? {
7275
val iter = iterator()
7376
if (!iter.hasNext()) return null
7477
return NonEmptySet(iter.next(), Iterable { iter })
7578
}
7679

80+
/**
81+
* Returns a [NonEmptySet] that contains a **copy** of the elements in [this].
82+
*/
7783
public fun <T> Iterable<T>.toNonEmptySetOrNone(): Option<NonEmptySet<T>> =
7884
toNonEmptySetOrNull().toOption()
7985

86+
/**
87+
* Returns a [NonEmptySet] that contains a **copy** of the elements in [this].
88+
*/
89+
public fun <T> Iterable<T>.toNonEmptySetOrThrow(): NonEmptySet<T>? {
90+
val iter = iterator()
91+
require(iter.hasNext())
92+
return NonEmptySet(Iterable { iter }.toSet())
93+
}
94+
8095
@Deprecated("Same as Iterable extension", level = DeprecationLevel.HIDDEN)
8196
public fun <E> Set<E>.toNonEmptySetOrNull(): NonEmptySet<E>? =
8297
(this as Iterable<E>).toNonEmptySetOrNull()
8398

8499
@Deprecated("Same as Iterable extension", level = DeprecationLevel.HIDDEN)
85100
public fun <E> Set<E>.toNonEmptySetOrNone(): Option<NonEmptySet<E>> =
86101
toNonEmptySetOrNull().toOption()
102+
103+
/**
104+
* Returns a [NonEmptySet] that wraps the given [this], avoiding an additional copy.
105+
*
106+
* Any modification made to [this] will also be visible through the returned [NonEmptySet].
107+
* You are responsible for keeping the non-emptiness invariant at all times.
108+
*/
109+
public fun <T> Set<T>.wrapAsNonEmptySetOrThrow(): NonEmptySet<T> {
110+
require(isNotEmpty())
111+
return NonEmptySet(this)
112+
}
113+
114+
/**
115+
* Returns a [NonEmptySet] that wraps the given [this], avoiding an additional copy.
116+
*
117+
* Any modification made to [this] will also be visible through the returned [NonEmptySet].
118+
* You are responsible for keeping the non-emptiness invariant at all times.
119+
*/
120+
public fun <T> Set<T>.wrapAsNonEmptySetOrNull(): NonEmptySet<T>? = when {
121+
isEmpty() -> null
122+
else -> NonEmptySet(this)
123+
}

0 commit comments

Comments
 (0)