mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2026-03-11 21:02:37 +00:00
generate docs for a lot of API (test try)
This commit is contained in:
@@ -1,5 +1,15 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Breaks this list into a list of consecutive pairs.
|
||||
* Each element is paired with the next element in the list.
|
||||
* For a list of size n, the result will contain n-1 pairs.
|
||||
*
|
||||
* Example: `[1, 2, 3, 4].breakAsPairs()` returns `[(1, 2), (2, 3), (3, 4)]`
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @return A list of pairs where each pair consists of consecutive elements
|
||||
*/
|
||||
fun <T> List<T>.breakAsPairs(): List<Pair<T, T>> {
|
||||
val result = mutableListOf<Pair<T, T>>()
|
||||
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Executes the given [block] and returns its result if this Boolean is true, otherwise returns null.
|
||||
*
|
||||
* @param T The return type of the block
|
||||
* @param block The function to execute if this Boolean is true
|
||||
* @return The result of [block] if true, null otherwise
|
||||
*/
|
||||
inline fun <T> Boolean.letIfTrue(block: () -> T): T? {
|
||||
return if (this) {
|
||||
block()
|
||||
@@ -8,6 +15,13 @@ inline fun <T> Boolean.letIfTrue(block: () -> T): T? {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the given [block] and returns its result if this Boolean is false, otherwise returns null.
|
||||
*
|
||||
* @param T The return type of the block
|
||||
* @param block The function to execute if this Boolean is false
|
||||
* @return The result of [block] if false, null otherwise
|
||||
*/
|
||||
inline fun <T> Boolean.letIfFalse(block: () -> T): T? {
|
||||
return if (this) {
|
||||
null
|
||||
@@ -16,16 +30,37 @@ inline fun <T> Boolean.letIfFalse(block: () -> T): T? {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the given [block] if this Boolean is true and returns this Boolean.
|
||||
* Similar to [also], but only executes the block when the Boolean is true.
|
||||
*
|
||||
* @param block The function to execute if this Boolean is true
|
||||
* @return This Boolean value
|
||||
*/
|
||||
inline fun Boolean.alsoIfTrue(block: () -> Unit): Boolean {
|
||||
letIfTrue(block)
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the given [block] if this Boolean is false and returns this Boolean.
|
||||
* Similar to [also], but only executes the block when the Boolean is false.
|
||||
*
|
||||
* @param block The function to execute if this Boolean is false
|
||||
* @return This Boolean value
|
||||
*/
|
||||
inline fun Boolean.alsoIfFalse(block: () -> Unit): Boolean {
|
||||
letIfFalse(block)
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for [letIfTrue]. Executes the given [block] and returns its result if this Boolean is true.
|
||||
*
|
||||
* @param T The return type of the block
|
||||
* @param block The function to execute if this Boolean is true
|
||||
* @return The result of [block] if true, null otherwise
|
||||
*/
|
||||
inline fun <T> Boolean.ifTrue(block: () -> T): T? {
|
||||
return if (this) {
|
||||
block()
|
||||
@@ -34,6 +69,13 @@ inline fun <T> Boolean.ifTrue(block: () -> T): T? {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for [letIfFalse]. Executes the given [block] and returns its result if this Boolean is false.
|
||||
*
|
||||
* @param T The return type of the block
|
||||
* @param block The function to execute if this Boolean is false
|
||||
* @return The result of [block] if false, null otherwise
|
||||
*/
|
||||
inline fun <T> Boolean.ifFalse(block: () -> T): T? {
|
||||
return if (this) {
|
||||
null
|
||||
|
||||
@@ -6,19 +6,45 @@ import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
|
||||
/**
|
||||
* A function type that allocates and returns a [ByteArray].
|
||||
*/
|
||||
typealias ByteArrayAllocator = () -> ByteArray
|
||||
|
||||
/**
|
||||
* A suspending function type that allocates and returns a [ByteArray].
|
||||
*/
|
||||
typealias SuspendByteArrayAllocator = suspend () -> ByteArray
|
||||
|
||||
/**
|
||||
* Converts this [ByteArray] to a [ByteArrayAllocator] that returns this array.
|
||||
*/
|
||||
val ByteArray.asAllocator: ByteArrayAllocator
|
||||
get() = { this }
|
||||
|
||||
/**
|
||||
* Converts this [ByteArray] to a [SuspendByteArrayAllocator] that returns this array.
|
||||
*/
|
||||
val ByteArray.asSuspendAllocator: SuspendByteArrayAllocator
|
||||
get() = { this }
|
||||
|
||||
/**
|
||||
* Converts this [ByteArrayAllocator] to a [SuspendByteArrayAllocator].
|
||||
*/
|
||||
val ByteArrayAllocator.asSuspendAllocator: SuspendByteArrayAllocator
|
||||
get() = { this() }
|
||||
|
||||
/**
|
||||
* Converts this [SuspendByteArrayAllocator] to a [ByteArrayAllocator] by invoking it and
|
||||
* wrapping the result in a non-suspending allocator.
|
||||
*/
|
||||
suspend fun SuspendByteArrayAllocator.asAllocator(): ByteArrayAllocator {
|
||||
return invoke().asAllocator
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializer for [ByteArrayAllocator]. Serializes the result of invoking the allocator.
|
||||
*/
|
||||
object ByteArrayAllocatorSerializer : KSerializer<ByteArrayAllocator> {
|
||||
private val realSerializer = ByteArraySerializer()
|
||||
override val descriptor: SerialDescriptor = realSerializer.descriptor
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Returns the first non-null element in this iterable.
|
||||
*
|
||||
* @param T The type of elements in the iterable (nullable)
|
||||
* @return The first non-null element
|
||||
* @throws NoSuchElementException if the iterable contains no non-null elements
|
||||
*/
|
||||
fun <T> Iterable<T?>.firstNotNull() = first { it != null }!!
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Joins elements of this iterable into a list with separators between elements.
|
||||
* Each element is transformed using [transform], and separators are generated using [separatorFun].
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null values from transformations or separator function are skipped.
|
||||
*
|
||||
* @param I The type of elements in the input iterable
|
||||
* @param R The type of elements in the result list
|
||||
* @param separatorFun A function that generates a separator based on the current element
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @param transform A function to transform each element
|
||||
* @return A list of transformed elements with separators
|
||||
*/
|
||||
inline fun <I, R> Iterable<I>.joinTo(
|
||||
separatorFun: (I) -> R?,
|
||||
prefix: R? = null,
|
||||
@@ -25,6 +39,20 @@ inline fun <I, R> Iterable<I>.joinTo(
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Joins elements of this iterable into a list with a constant separator between elements.
|
||||
* Each element is transformed using [transform].
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null values from transformations or separators are skipped.
|
||||
*
|
||||
* @param I The type of elements in the input iterable
|
||||
* @param R The type of elements in the result list
|
||||
* @param separator The separator to insert between elements
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @param transform A function to transform each element
|
||||
* @return A list of transformed elements with separators
|
||||
*/
|
||||
inline fun <I, R> Iterable<I>.joinTo(
|
||||
separator: R? = null,
|
||||
prefix: R? = null,
|
||||
@@ -32,18 +60,55 @@ inline fun <I, R> Iterable<I>.joinTo(
|
||||
transform: (I) -> R?
|
||||
): List<R> = joinTo({ separator }, prefix, postfix, transform)
|
||||
|
||||
/**
|
||||
* Joins elements of this iterable into a list with separators between elements.
|
||||
* Separators are generated using [separatorFun].
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null values from separator function are skipped.
|
||||
*
|
||||
* @param I The type of elements
|
||||
* @param separatorFun A function that generates a separator based on the current element
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @return A list of elements with separators
|
||||
*/
|
||||
inline fun <I> Iterable<I>.joinTo(
|
||||
separatorFun: (I) -> I?,
|
||||
prefix: I? = null,
|
||||
postfix: I? = null
|
||||
): List<I> = joinTo<I, I>(separatorFun, prefix, postfix) { it }
|
||||
|
||||
/**
|
||||
* Joins elements of this iterable into a list with a constant separator between elements.
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null separators are skipped.
|
||||
*
|
||||
* @param I The type of elements
|
||||
* @param separator The separator to insert between elements
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @return A list of elements with separators
|
||||
*/
|
||||
inline fun <I> Iterable<I>.joinTo(
|
||||
separator: I? = null,
|
||||
prefix: I? = null,
|
||||
postfix: I? = null
|
||||
): List<I> = joinTo<I>({ separator }, prefix, postfix)
|
||||
|
||||
/**
|
||||
* Joins elements of this array into an array with separators between elements.
|
||||
* Each element is transformed using [transform], and separators are generated using [separatorFun].
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null values from transformations or separator function are skipped.
|
||||
*
|
||||
* @param I The type of elements in the input array
|
||||
* @param R The type of elements in the result array
|
||||
* @param separatorFun A function that generates a separator based on the current element
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @param transform A function to transform each element
|
||||
* @return An array of transformed elements with separators
|
||||
*/
|
||||
inline fun <I, reified R> Array<I>.joinTo(
|
||||
separatorFun: (I) -> R?,
|
||||
prefix: R? = null,
|
||||
@@ -51,6 +116,20 @@ inline fun <I, reified R> Array<I>.joinTo(
|
||||
transform: (I) -> R?
|
||||
): Array<R> = asIterable().joinTo(separatorFun, prefix, postfix, transform).toTypedArray()
|
||||
|
||||
/**
|
||||
* Joins elements of this array into an array with a constant separator between elements.
|
||||
* Each element is transformed using [transform].
|
||||
* Optional [prefix] and [postfix] can be added to the result.
|
||||
* Null values from transformations or separators are skipped.
|
||||
*
|
||||
* @param I The type of elements in the input array
|
||||
* @param R The type of elements in the result array
|
||||
* @param separator The separator to insert between elements
|
||||
* @param prefix Optional prefix to add at the beginning of the result
|
||||
* @param postfix Optional postfix to add at the end of the result
|
||||
* @param transform A function to transform each element
|
||||
* @return An array of transformed elements with separators
|
||||
*/
|
||||
inline fun <I, reified R> Array<I>.joinTo(
|
||||
separator: R? = null,
|
||||
prefix: R? = null,
|
||||
|
||||
@@ -2,16 +2,43 @@ package dev.inmo.micro_utils.common
|
||||
|
||||
import kotlin.jvm.JvmName
|
||||
|
||||
/**
|
||||
* A bidirectional mapper that can convert between two types [T1] and [T2].
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
*/
|
||||
interface SimpleMapper<T1, T2> {
|
||||
fun convertToT1(from: T2): T1
|
||||
fun convertToT2(from: T1): T2
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts [from] of type [T2] to type [T1] using this mapper.
|
||||
*
|
||||
* @param from The value to convert
|
||||
* @return The converted value of type [T1]
|
||||
*/
|
||||
@JvmName("convertFromT2")
|
||||
fun <T1, T2> SimpleMapper<T1, T2>.convert(from: T2) = convertToT1(from)
|
||||
|
||||
/**
|
||||
* Converts [from] of type [T1] to type [T2] using this mapper.
|
||||
*
|
||||
* @param from The value to convert
|
||||
* @return The converted value of type [T2]
|
||||
*/
|
||||
@JvmName("convertFromT1")
|
||||
fun <T1, T2> SimpleMapper<T1, T2>.convert(from: T1) = convertToT2(from)
|
||||
|
||||
/**
|
||||
* Implementation of [SimpleMapper] that uses lambda functions for conversion.
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
* @param t1 Function to convert from [T2] to [T1]
|
||||
* @param t2 Function to convert from [T1] to [T2]
|
||||
*/
|
||||
class SimpleMapperImpl<T1, T2>(
|
||||
private val t1: (T2) -> T1,
|
||||
private val t2: (T1) -> T2,
|
||||
@@ -21,22 +48,58 @@ class SimpleMapperImpl<T1, T2>(
|
||||
override fun convertToT2(from: T1): T2 = t2.invoke(from)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a [SimpleMapper] using the provided conversion functions.
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
* @param t1 Function to convert from [T2] to [T1]
|
||||
* @param t2 Function to convert from [T1] to [T2]
|
||||
* @return A new [SimpleMapperImpl] instance
|
||||
*/
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun <T1, T2> simpleMapper(
|
||||
noinline t1: (T2) -> T1,
|
||||
noinline t2: (T1) -> T2,
|
||||
) = SimpleMapperImpl(t1, t2)
|
||||
|
||||
/**
|
||||
* A bidirectional mapper that can convert between two types [T1] and [T2] using suspending functions.
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
*/
|
||||
interface SimpleSuspendableMapper<T1, T2> {
|
||||
suspend fun convertToT1(from: T2): T1
|
||||
suspend fun convertToT2(from: T1): T2
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts [from] of type [T2] to type [T1] using this suspending mapper.
|
||||
*
|
||||
* @param from The value to convert
|
||||
* @return The converted value of type [T1]
|
||||
*/
|
||||
@JvmName("convertFromT2")
|
||||
suspend fun <T1, T2> SimpleSuspendableMapper<T1, T2>.convert(from: T2) = convertToT1(from)
|
||||
|
||||
/**
|
||||
* Converts [from] of type [T1] to type [T2] using this suspending mapper.
|
||||
*
|
||||
* @param from The value to convert
|
||||
* @return The converted value of type [T2]
|
||||
*/
|
||||
@JvmName("convertFromT1")
|
||||
suspend fun <T1, T2> SimpleSuspendableMapper<T1, T2>.convert(from: T1) = convertToT2(from)
|
||||
|
||||
/**
|
||||
* Implementation of [SimpleSuspendableMapper] that uses suspending lambda functions for conversion.
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
* @param t1 Suspending function to convert from [T2] to [T1]
|
||||
* @param t2 Suspending function to convert from [T1] to [T2]
|
||||
*/
|
||||
class SimpleSuspendableMapperImpl<T1, T2>(
|
||||
private val t1: suspend (T2) -> T1,
|
||||
private val t2: suspend (T1) -> T2,
|
||||
@@ -46,6 +109,15 @@ class SimpleSuspendableMapperImpl<T1, T2>(
|
||||
override suspend fun convertToT2(from: T1): T2 = t2.invoke(from)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a [SimpleSuspendableMapper] using the provided suspending conversion functions.
|
||||
*
|
||||
* @param T1 The first type
|
||||
* @param T2 The second type
|
||||
* @param t1 Suspending function to convert from [T2] to [T1]
|
||||
* @param t2 Suspending function to convert from [T1] to [T2]
|
||||
* @return A new [SimpleSuspendableMapperImpl] instance
|
||||
*/
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun <T1, T2> simpleSuspendableMapper(
|
||||
noinline t1: suspend (T2) -> T1,
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Pads this sequence to the specified [size] using a custom [inserter] function.
|
||||
* The [inserter] is repeatedly called until the sequence reaches the desired size.
|
||||
*
|
||||
* @param T The type of elements in the sequence
|
||||
* @param size The target size of the padded sequence
|
||||
* @param inserter A function that takes the current sequence and returns a new padded sequence
|
||||
* @return A sequence padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> Sequence<T>.padWith(size: Int, inserter: (Sequence<T>) -> Sequence<T>): Sequence<T> {
|
||||
var result = this
|
||||
while (result.count() < size) {
|
||||
@@ -8,10 +17,36 @@ inline fun <T> Sequence<T>.padWith(size: Int, inserter: (Sequence<T>) -> Sequenc
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Pads this sequence at the end to the specified [size].
|
||||
* New elements are generated using [padBlock], which receives the current size as a parameter.
|
||||
*
|
||||
* @param T The type of elements in the sequence
|
||||
* @param size The target size of the padded sequence
|
||||
* @param padBlock A function that generates padding elements based on the current sequence size
|
||||
* @return A sequence padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> Sequence<T>.padEnd(size: Int, padBlock: (Int) -> T): Sequence<T> = padWith(size) { it + padBlock(it.count()) }
|
||||
|
||||
/**
|
||||
* Pads this sequence at the end to the specified [size] using the given element [o].
|
||||
*
|
||||
* @param T The type of elements in the sequence
|
||||
* @param size The target size of the padded sequence
|
||||
* @param o The element to use for padding
|
||||
* @return A sequence padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> Sequence<T>.padEnd(size: Int, o: T) = padEnd(size) { o }
|
||||
|
||||
/**
|
||||
* Pads this list to the specified [size] using a custom [inserter] function.
|
||||
* The [inserter] is repeatedly called until the list reaches the desired size.
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @param size The target size of the padded list
|
||||
* @param inserter A function that takes the current list and returns a new padded list
|
||||
* @return A list padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> List<T>.padWith(size: Int, inserter: (List<T>) -> List<T>): List<T> {
|
||||
var result = this
|
||||
while (result.size < size) {
|
||||
@@ -19,14 +54,66 @@ inline fun <T> List<T>.padWith(size: Int, inserter: (List<T>) -> List<T>): List<
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Pads this list at the end to the specified [size].
|
||||
* New elements are generated using [padBlock], which receives the current size as a parameter.
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @param size The target size of the padded list
|
||||
* @param padBlock A function that generates padding elements based on the current list size
|
||||
* @return A list padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> List<T>.padEnd(size: Int, padBlock: (Int) -> T): List<T> = asSequence().padEnd(size, padBlock).toList()
|
||||
|
||||
/**
|
||||
* Pads this list at the end to the specified [size] using the given element [o].
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @param size The target size of the padded list
|
||||
* @param o The element to use for padding
|
||||
* @return A list padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> List<T>.padEnd(size: Int, o: T): List<T> = asSequence().padEnd(size, o).toList()
|
||||
|
||||
/**
|
||||
* Pads this sequence at the start to the specified [size].
|
||||
* New elements are generated using [padBlock], which receives the current size as a parameter.
|
||||
*
|
||||
* @param T The type of elements in the sequence
|
||||
* @param size The target size of the padded sequence
|
||||
* @param padBlock A function that generates padding elements based on the current sequence size
|
||||
* @return A sequence padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> Sequence<T>.padStart(size: Int, padBlock: (Int) -> T): Sequence<T> = padWith(size) { sequenceOf(padBlock(it.count())) + it }
|
||||
|
||||
/**
|
||||
* Pads this sequence at the start to the specified [size] using the given element [o].
|
||||
*
|
||||
* @param T The type of elements in the sequence
|
||||
* @param size The target size of the padded sequence
|
||||
* @param o The element to use for padding
|
||||
* @return A sequence padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> Sequence<T>.padStart(size: Int, o: T) = padStart(size) { o }
|
||||
|
||||
/**
|
||||
* Pads this list at the start to the specified [size].
|
||||
* New elements are generated using [padBlock], which receives the current size as a parameter.
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @param size The target size of the padded list
|
||||
* @param padBlock A function that generates padding elements based on the current list size
|
||||
* @return A list padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> List<T>.padStart(size: Int, padBlock: (Int) -> T): List<T> = asSequence().padStart(size, padBlock).toList()
|
||||
|
||||
/**
|
||||
* Pads this list at the start to the specified [size] using the given element [o].
|
||||
*
|
||||
* @param T The type of elements in the list
|
||||
* @param size The target size of the padded list
|
||||
* @param o The element to use for padding
|
||||
* @return A list padded to at least the specified size
|
||||
*/
|
||||
inline fun <T> List<T>.padStart(size: Int, o: T): List<T> = asSequence().padStart(size, o).toList()
|
||||
|
||||
@@ -1,17 +1,39 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Computes the intersection of this range with [other]. Returns a pair representing
|
||||
* the intersecting range, or null if the ranges don't overlap.
|
||||
*
|
||||
* @param T The type of comparable values in the range
|
||||
* @param other The other range to intersect with
|
||||
* @return A pair (start, end) representing the intersection, or null if no intersection exists
|
||||
*/
|
||||
fun <T : Comparable<T>> ClosedRange<T>.intersect(other: ClosedRange<T>): Pair<T, T>? = when {
|
||||
start == other.start && endInclusive == other.endInclusive -> start to endInclusive
|
||||
start > other.endInclusive || other.start > endInclusive -> null
|
||||
else -> maxOf(start, other.start) to minOf(endInclusive, other.endInclusive)
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the intersection of this [IntRange] with [other].
|
||||
* Returns the intersecting range, or null if the ranges don't overlap.
|
||||
*
|
||||
* @param other The other range to intersect with
|
||||
* @return An [IntRange] representing the intersection, or null if no intersection exists
|
||||
*/
|
||||
fun IntRange.intersect(
|
||||
other: IntRange
|
||||
): IntRange? = (this as ClosedRange<Int>).intersect(other as ClosedRange<Int>) ?.let {
|
||||
it.first .. it.second
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the intersection of this [LongRange] with [other].
|
||||
* Returns the intersecting range, or null if the ranges don't overlap.
|
||||
*
|
||||
* @param other The other range to intersect with
|
||||
* @return A [LongRange] representing the intersection, or null if no intersection exists
|
||||
*/
|
||||
fun LongRange.intersect(
|
||||
other: LongRange
|
||||
): LongRange? = (this as ClosedRange<Long>).intersect(other as ClosedRange<Long>) ?.let {
|
||||
|
||||
@@ -1,5 +1,24 @@
|
||||
package dev.inmo.micro_utils.common
|
||||
|
||||
/**
|
||||
* Returns a new list with the element at index [i] replaced by applying [block] to it.
|
||||
* All other elements remain unchanged.
|
||||
*
|
||||
* @param T The type of elements in the iterable
|
||||
* @param i The index of the element to replace
|
||||
* @param block A function that transforms the element at the given index
|
||||
* @return A new list with the replaced element
|
||||
*/
|
||||
fun <T> Iterable<T>.withReplacedAt(i: Int, block: (T) -> T): List<T> = take(i) + block(elementAt(i)) + drop(i + 1)
|
||||
|
||||
/**
|
||||
* Returns a new list with the first occurrence of element [t] replaced by applying [block] to it.
|
||||
* All other elements remain unchanged.
|
||||
*
|
||||
* @param T The type of elements in the iterable
|
||||
* @param t The element to replace
|
||||
* @param block A function that transforms the found element
|
||||
* @return A new list with the replaced element
|
||||
*/
|
||||
fun <T> Iterable<T>.withReplaced(t: T, block: (T) -> T): List<T> = withReplacedAt(indexOf(t), block)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user