Skip to content

Commit

Permalink
Move provider extension functions to root provider package
Browse files Browse the repository at this point in the history
  • Loading branch information
NichtStudioCode committed Oct 13, 2024
1 parent bf11292 commit 6db7663
Show file tree
Hide file tree
Showing 19 changed files with 141 additions and 172 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,38 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.mutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import java.util.concurrent.locks.ReentrantLock

/**
* A [Provider] that always returns `null`.
*/
val NULL_PROVIDER: Provider<Nothing?> = provider(null)

/**
* Creates a new [Provider] that loads its value using the given [lazyValue] function.
*/
fun <T> provider(lazyValue: () -> T): Provider<T> =
object : AbstractProvider<T>(ReentrantLock()) {

override fun pull(): T {
return lazyValue()
}

}

/**
* Creates a new [Provider] with the given [value].
*/
fun <T> provider(value: T): Provider<T> =
object : AbstractProvider<T>(ReentrantLock()) {

override fun pull(): T {
return value
}

}

/**
* Creates a new [MutableProvider] with the given [initialValue].
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.immutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import xyz.xenondevs.commons.provider.addAsChildTo
import xyz.xenondevs.commons.provider.changeLocks
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.immutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import xyz.xenondevs.commons.provider.addAsChildTo
import xyz.xenondevs.commons.provider.changeLocks
import xyz.xenondevs.commons.tuple.Tuple10
import xyz.xenondevs.commons.tuple.Tuple2
import xyz.xenondevs.commons.tuple.Tuple3
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.mutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import xyz.xenondevs.commons.provider.immutable.provider
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.mutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import kotlin.concurrent.withLock

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,44 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.mutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import xyz.xenondevs.commons.provider.immutable.provider
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock

/**
* Creates and returns a new [Provider] that returns a fallback [value] if the value of [this][Provider] is null.
*/
fun <T> Provider<T?>.orElse(value: T): Provider<T> =
map { it ?: value }

/**
* Creates and returns a new [Provider] that returns a fallback value obtained through [provider] if the value of [this][Provider] is null.
*/
fun <T> Provider<T?>.orElse(provider: Provider<T>): Provider<T> {
this as AbstractProvider<T?>
provider as AbstractProvider<T>

provider.changeLock(lock)
lock.withLock {
val orElse = map { it ?: provider.get() } as AbstractProvider<T>
orElse.addInactiveParent(provider)
provider.addChild(orElse)
return orElse
}
}

/**
* Creates and returns a new [Provider] that returns a fallback value obtained through [provider] if the value of [this][Provider] is null.
*/
fun <T> Provider<T?>.orElseLazily(lazyValue: () -> T): Provider<T> = // naming this function orElse would lead to a resolution ambiguity with orElse(value: T)
orElse(provider(lazyValue))

/**
* Creates a new [Provider] that returns a fallback value which is re-created through the [newValue] lambda every time the value of [this][Provider] is set to null.
*/
fun <T> Provider<T?>.orElseNew(newValue: () -> T): Provider<T> =
map { it ?: newValue() }

/**
* Creates a new [MutableProvider] that returns a fallback [value] if the value of [this][MutableProvider] is null.
* Conversely, if the returned provider's value is set a value equal to [value], the value of [this][MutableProvider] will be set to null.
Expand Down Expand Up @@ -38,9 +67,9 @@ fun <T : Any> MutableProvider<T?>.orElseLazily(lazyValue: () -> T): MutableProvi
orElse(provider(lazyValue))

/**
* Creates a new [MutableProvider] that returns a fallback value which is re-created through the [newValue] lambda every time the value of [this][MutableProvider] is set to null.
* Creates a new [MutableProvider] that returns a fallback value which is re-created through the [newValue] lambda every time the value of [this][MutableProvider] is set to null.
* Conversely, if the returned provider's value is set to a value equal to one returned by [newValue], the value of [this][MutableProvider] will be set to null.
*
*
* For mutable data types, it is required that the [newValue] lambda returns a new instance every time it is called, and that all of those instances are [equal][Any.equals] to each other.
*/
fun <T : Any> MutableProvider<T?>.orElseNew(newValue: () -> T): MutableProvider<T> =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.immutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import kotlin.concurrent.withLock

/**
Expand Down Expand Up @@ -196,4 +192,40 @@ private class FlatMappingProvider<P, T>(
return provider.get()
}

}

/**
* Creates and returns a new [MutableProvider] that maps the value of [this][MutableProvider]
* bi-directionally using the provided [transform] and [untransform] functions.
*/
fun <T, R> MutableProvider<T>.map(transform: (T) -> R, untransform: (R) -> T): MutableProvider<R> =
MutableMappingProvider(this as AbstractProvider<T>, transform, untransform)

/**
* Creates and returns a new [MutableProvider] that maps non-null values of [this][MutableProvider]
* bi-directionally using the provided [transform] and [untransform] functions.
* Null values will be passed through without transformation.
*/
inline fun <T : Any, R : Any> MutableProvider<T?>.mapNonNull(
crossinline transform: (T) -> R?,
crossinline untransform: (R) -> T?
): MutableProvider<R?> = map({ it?.let(transform) }, { it?.let(untransform) })

private class MutableMappingProvider<P, T>(
private val parent: AbstractProvider<P>,
private val transform: (P) -> T,
private val untransform: (T) -> P
) : AbstractProvider<T>(parent.lock) {

init {
lock.withLock {
addParent(parent) { untransform(it) }
parent.addChild(this)
}
}

override fun pull(): T {
return transform(parent.get())
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
@file:OptIn(UnstableProviderApi::class)

package xyz.xenondevs.commons.provider.mutable
package xyz.xenondevs.commons.provider

import xyz.xenondevs.commons.collections.observed.ObservableList
import xyz.xenondevs.commons.collections.observed.ObservableMap
import xyz.xenondevs.commons.collections.observed.ObservableSet
import xyz.xenondevs.commons.provider.AbstractProvider
import xyz.xenondevs.commons.provider.MutableProvider
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.UnstableProviderApi
import kotlin.concurrent.withLock

/**
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package xyz.xenondevs.commons.provider

import org.junit.jupiter.api.Test
import xyz.xenondevs.commons.provider.immutable.map
import xyz.xenondevs.commons.provider.mutable.map
import xyz.xenondevs.commons.provider.mutable.mutableProvider
import kotlin.test.assertEquals

class ProviderTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,20 @@ package xyz.xenondevs.commons.provider.immutable
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import xyz.xenondevs.commons.provider.Provider
import xyz.xenondevs.commons.provider.mutable.mutableProvider
import xyz.xenondevs.commons.provider.flatMap
import xyz.xenondevs.commons.provider.flatMapCollection
import xyz.xenondevs.commons.provider.flatMapMutable
import xyz.xenondevs.commons.provider.flattenIterables
import xyz.xenondevs.commons.provider.map
import xyz.xenondevs.commons.provider.mapEach
import xyz.xenondevs.commons.provider.mapEachNotNull
import xyz.xenondevs.commons.provider.mapNonNull
import xyz.xenondevs.commons.provider.mergeMaps
import xyz.xenondevs.commons.provider.mutableProvider
import xyz.xenondevs.commons.provider.orElse
import xyz.xenondevs.commons.provider.provider
import xyz.xenondevs.commons.provider.require
import xyz.xenondevs.commons.provider.requireNotNull
import kotlin.test.assertEquals

class MappingProviderTests {
Expand Down
Loading

0 comments on commit 6db7663

Please sign in to comment.