All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.arrow.core.NonEmptySet.kt Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
@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