
commonMain.arrow.core.NonEmptySet.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of arrow-core Show documentation
Show all versions of arrow-core Show documentation
Functional companion to Kotlin's Standard Library
@file:OptIn(ExperimentalTypeInference::class)
package arrow.core
import arrow.core.raise.RaiseAccumulate
import kotlin.experimental.ExperimentalTypeInference
import kotlin.jvm.JvmInline
@JvmInline
public value class NonEmptySet private constructor(
@PublishedApi internal val elements: Set
) : Set by elements, NonEmptyCollection {
public constructor(first: E, rest: Iterable) : this(setOf(first) + rest)
public override operator fun plus(elements: Iterable<@UnsafeVariance E>): NonEmptySet =
NonEmptySet(this.elements + elements)
public override operator fun plus(element: @UnsafeVariance E): NonEmptySet =
NonEmptySet(this.elements + element)
override fun isEmpty(): Boolean = false
override val head: E get() = elements.first()
override fun lastOrNull(): E = elements.last()
override fun toString(): String = "NonEmptySet(${this.joinToString()})"
@Suppress("RESERVED_MEMBER_INSIDE_VALUE_CLASS")
override fun equals(other: Any?): Boolean =
elements == other
@Suppress("RESERVED_MEMBER_INSIDE_VALUE_CLASS")
override fun hashCode(): Int =
elements.hashCode()
public override fun distinct(): NonEmptyList =
NonEmptyList(elements.distinct())
public override fun distinctBy(selector: (E) -> K): NonEmptyList =
NonEmptyList(elements.distinctBy(selector))
public override fun map(transform: (E) -> T): NonEmptyList =
NonEmptyList(elements.map(transform))
public override fun flatMap(transform: (E) -> NonEmptyCollection): NonEmptyList =
NonEmptyList(elements.flatMap(transform))
public override fun mapIndexed(transform: (index: Int, E) -> T): NonEmptyList =
NonEmptyList(elements.mapIndexed(transform))
override fun zip(other: NonEmptyCollection): NonEmptyList> =
NonEmptyList(elements.zip(other))
}
public inline fun NonEmptySet.mapOrAccumulate(
combine: (Error, Error) -> Error,
@BuilderInference transform: RaiseAccumulate.(E) -> T
): Either> =
elements.mapOrAccumulate(combine, transform).map { requireNotNull(it.toNonEmptySetOrNull()) }
public inline fun NonEmptySet.mapOrAccumulate(
@BuilderInference transform: RaiseAccumulate.(E) -> T
): Either, NonEmptySet> =
elements.mapOrAccumulate(transform).map { requireNotNull(it.toNonEmptySetOrNull()) }
public fun nonEmptySetOf(first: E, vararg rest: E): NonEmptySet =
NonEmptySet(first, rest.asIterable())
public fun Iterable.toNonEmptySetOrNull(): NonEmptySet? {
val iter = iterator()
if (!iter.hasNext()) return null
return NonEmptySet(iter.next(), Iterable { iter })
}
public fun Iterable.toNonEmptySetOrNone(): Option> =
toNonEmptySetOrNull().toOption()
@Deprecated("Same as Iterable extension", level = DeprecationLevel.HIDDEN)
public fun Set.toNonEmptySetOrNull(): NonEmptySet? =
(this as Iterable).toNonEmptySetOrNull()
@Deprecated("Same as Iterable extension", level = DeprecationLevel.HIDDEN)
public fun Set.toNonEmptySetOrNone(): Option> =
toNonEmptySetOrNull().toOption()
© 2015 - 2025 Weber Informatics LLC | Privacy Policy