diff --git a/arrow-libs/core/arrow-atomic/build.gradle.kts b/arrow-libs/core/arrow-atomic/build.gradle.kts index a3d499df493..1fe23d392b5 100644 --- a/arrow-libs/core/arrow-atomic/build.gradle.kts +++ b/arrow-libs/core/arrow-atomic/build.gradle.kts @@ -1,13 +1,8 @@ -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi - plugins { id("arrow.kotlin") } kotlin { - @OptIn(ExperimentalKotlinGradlePluginApi::class) - compilerOptions.freeCompilerArgs.add("-Xexpect-actual-classes") - sourceSets { commonTest { dependencies { diff --git a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/Atomic.kt b/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/Atomic.kt deleted file mode 100644 index 1c2b3ac380b..00000000000 --- a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/Atomic.kt +++ /dev/null @@ -1,25 +0,0 @@ -package arrow.atomic - -public actual class Atomic actual constructor(initialValue: V) { - private var internalValue: V = initialValue - - public actual fun get(): V = internalValue - - public actual fun set(value: V) { - internalValue = value - } - - public actual fun compareAndSet(expected: V, new: V): Boolean = - if (expected === internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: V): V { - val old = internalValue - internalValue = value - return old - } -} diff --git a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicInt.kt b/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicInt.kt deleted file mode 100644 index cc2d4825873..00000000000 --- a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicInt.kt +++ /dev/null @@ -1,34 +0,0 @@ -package arrow.atomic - -public actual class AtomicInt actual constructor(initialValue: Int) { - private var internalValue: Int = initialValue - - public actual fun get(): Int = internalValue - - public actual fun set(newValue: Int) { - internalValue = newValue - } - - public actual fun addAndGet(delta: Int): Int { - internalValue += delta - return internalValue - } - - public actual fun incrementAndGet(): Int = addAndGet(1) - - public actual fun decrementAndGet(): Int = addAndGet(-1) - - public actual fun compareAndSet(expected: Int, new: Int): Boolean = - if (expected == internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: Int): Int { - val current = internalValue - internalValue = value - return current - } -} diff --git a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicLong.kt b/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicLong.kt deleted file mode 100644 index 3fed6d455d9..00000000000 --- a/arrow-libs/core/arrow-atomic/src/jsMain/kotlin/arrow/atomic/AtomicLong.kt +++ /dev/null @@ -1,34 +0,0 @@ -package arrow.atomic - -public actual class AtomicLong actual constructor(initialValue: Long) { - private var internalValue: Long = initialValue - - public actual fun get(): Long = internalValue - - public actual fun set(newValue: Long) { - internalValue = newValue - } - - public actual fun addAndGet(delta: Long): Long { - internalValue += delta - return internalValue - } - - public actual fun incrementAndGet(): Long = addAndGet(1) - - public actual fun decrementAndGet(): Long = addAndGet(-1) - - public actual fun compareAndSet(expected: Long, new: Long): Boolean = - if (expected == internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: Long): Long { - val current = internalValue - internalValue = value - return current - } -} diff --git a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/Atomic.kt b/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/Atomic.kt deleted file mode 100644 index 117a128b971..00000000000 --- a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/Atomic.kt +++ /dev/null @@ -1,19 +0,0 @@ -package arrow.atomic - -import kotlin.concurrent.AtomicReference - -public actual class Atomic actual constructor(initialValue: V) { - private val inner = AtomicReference(initialValue) - - public actual fun get(): V = inner.value - - public actual fun set(value: V) { - inner.value = value - } - - public actual fun compareAndSet(expected: V, new: V): Boolean = - inner.compareAndSet(expected, new) - - public actual fun getAndSet(value: V): V = - inner.getAndSet(value) -} diff --git a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicInt.kt b/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicInt.kt deleted file mode 100644 index 9b3ec716938..00000000000 --- a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicInt.kt +++ /dev/null @@ -1,28 +0,0 @@ -package arrow.atomic - -import kotlin.concurrent.AtomicInt - -public actual class AtomicInt actual constructor(initialValue: Int) { - private val inner = AtomicInt(initialValue) - - public actual fun get(): Int = inner.value - - public actual fun set(newValue: Int) { - inner.value = newValue - } - - public actual fun incrementAndGet(): Int = - inner.incrementAndGet() - - public actual fun decrementAndGet(): Int = - inner.decrementAndGet() - - public actual fun addAndGet(delta: Int): Int = - inner.addAndGet(delta) - - public actual fun compareAndSet(expected: Int, new: Int): Boolean = - inner.compareAndSet(expected, new) - - public actual fun getAndSet(value: Int): Int = - inner.getAndSet(value) -} diff --git a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicLong.kt b/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicLong.kt deleted file mode 100644 index e0d099c1831..00000000000 --- a/arrow-libs/core/arrow-atomic/src/nativeMain/kotlin/arrow/atomic/AtomicLong.kt +++ /dev/null @@ -1,29 +0,0 @@ -package arrow.atomic - -import kotlin.concurrent.AtomicLong - -public actual class AtomicLong actual constructor(initialValue: Long) { - private val inner = AtomicLong(initialValue) - - public actual fun get(): Long = inner.value - - public actual fun set(newValue: Long) { - inner.value = newValue - } - - public actual fun incrementAndGet(): Long = - inner.incrementAndGet() - - public actual fun decrementAndGet(): Long = - inner.decrementAndGet() - - public actual fun addAndGet(delta: Long): Long = - inner.addAndGet(delta) - - public actual fun compareAndSet(expected: Long, new: Long): Boolean = - inner.compareAndSet(expected, new) - - public actual fun getAndSet(value: Long): Long = - inner.getAndSet(value) -} - diff --git a/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/Atomic.kt b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/Atomic.kt new file mode 100644 index 00000000000..367ee0ae82f --- /dev/null +++ b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/Atomic.kt @@ -0,0 +1,20 @@ +@file:OptIn(ExperimentalAtomicApi::class) + +package arrow.atomic + +import kotlin.concurrent.atomics.ExperimentalAtomicApi +import kotlin.concurrent.atomics.AtomicReference as KtAtomicReference + +public actual class Atomic actual constructor(initialValue: V) { + private val inner = KtAtomicReference(initialValue) + + public actual fun get(): V = inner.load() + public actual fun set(value: V) { inner.store(value) } + public actual fun getAndSet(value: V): V = inner.exchange(value) + + /** + * Compare current value with expected and set to new if they're the same. Note, 'compare' is checking + * the actual object id, not 'equals'. + */ + public actual fun compareAndSet(expected: V, new: V): Boolean = inner.compareAndSet(expected, new) +} diff --git a/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicInt.kt b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicInt.kt new file mode 100644 index 00000000000..f12ccb09436 --- /dev/null +++ b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicInt.kt @@ -0,0 +1,23 @@ +@file:OptIn(ExperimentalAtomicApi::class) + +package arrow.atomic + +import kotlin.concurrent.atomics.ExperimentalAtomicApi +import kotlin.concurrent.atomics.decrementAndFetch +import kotlin.concurrent.atomics.incrementAndFetch +import kotlin.concurrent.atomics.AtomicInt as KtAtomicInt + +public actual class AtomicInt actual constructor(initialValue: Int) { + private val inner = KtAtomicInt(initialValue) + + public actual fun get(): Int = inner.load() + public actual fun set(newValue: Int) { inner.store(newValue) } + public actual fun getAndSet(value: Int): Int = inner.exchange(value) + + public actual fun incrementAndGet(): Int = inner.incrementAndFetch() + public actual fun decrementAndGet(): Int = inner.decrementAndFetch() + + public actual fun addAndGet(delta: Int): Int = inner.addAndFetch(delta) + + public actual fun compareAndSet(expected: Int, new: Int): Boolean = inner.compareAndSet(expected, new) +} diff --git a/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicLong.kt b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicLong.kt new file mode 100644 index 00000000000..2e110a7b75c --- /dev/null +++ b/arrow-libs/core/arrow-atomic/src/nonJvmMain/kotlin/arrow/atomic/AtomicLong.kt @@ -0,0 +1,23 @@ +@file:OptIn(ExperimentalAtomicApi::class) + +package arrow.atomic + +import kotlin.concurrent.atomics.AtomicLong as KtAtomicLong +import kotlin.concurrent.atomics.ExperimentalAtomicApi +import kotlin.concurrent.atomics.decrementAndFetch +import kotlin.concurrent.atomics.incrementAndFetch + +public actual class AtomicLong actual constructor(initialValue: Long) { + private val inner = KtAtomicLong(initialValue) + + public actual fun get(): Long = inner.load() + public actual fun set(newValue: Long) { inner.store(newValue) } + public actual fun getAndSet(value: Long): Long = inner.exchange(value) + + public actual fun incrementAndGet(): Long = inner.incrementAndFetch() + public actual fun decrementAndGet(): Long = inner.decrementAndFetch() + + public actual fun addAndGet(delta: Long): Long = inner.addAndFetch(delta) + + public actual fun compareAndSet(expected: Long, new: Long): Boolean = inner.compareAndSet(expected, new) +} diff --git a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/Atomic.kt b/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/Atomic.kt deleted file mode 100644 index 1c2b3ac380b..00000000000 --- a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/Atomic.kt +++ /dev/null @@ -1,25 +0,0 @@ -package arrow.atomic - -public actual class Atomic actual constructor(initialValue: V) { - private var internalValue: V = initialValue - - public actual fun get(): V = internalValue - - public actual fun set(value: V) { - internalValue = value - } - - public actual fun compareAndSet(expected: V, new: V): Boolean = - if (expected === internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: V): V { - val old = internalValue - internalValue = value - return old - } -} diff --git a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicInt.kt b/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicInt.kt deleted file mode 100644 index cc2d4825873..00000000000 --- a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicInt.kt +++ /dev/null @@ -1,34 +0,0 @@ -package arrow.atomic - -public actual class AtomicInt actual constructor(initialValue: Int) { - private var internalValue: Int = initialValue - - public actual fun get(): Int = internalValue - - public actual fun set(newValue: Int) { - internalValue = newValue - } - - public actual fun addAndGet(delta: Int): Int { - internalValue += delta - return internalValue - } - - public actual fun incrementAndGet(): Int = addAndGet(1) - - public actual fun decrementAndGet(): Int = addAndGet(-1) - - public actual fun compareAndSet(expected: Int, new: Int): Boolean = - if (expected == internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: Int): Int { - val current = internalValue - internalValue = value - return current - } -} diff --git a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicLong.kt b/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicLong.kt deleted file mode 100644 index 3fed6d455d9..00000000000 --- a/arrow-libs/core/arrow-atomic/src/wasmJsMain/kotlin/arrow/atomic/AtomicLong.kt +++ /dev/null @@ -1,34 +0,0 @@ -package arrow.atomic - -public actual class AtomicLong actual constructor(initialValue: Long) { - private var internalValue: Long = initialValue - - public actual fun get(): Long = internalValue - - public actual fun set(newValue: Long) { - internalValue = newValue - } - - public actual fun addAndGet(delta: Long): Long { - internalValue += delta - return internalValue - } - - public actual fun incrementAndGet(): Long = addAndGet(1) - - public actual fun decrementAndGet(): Long = addAndGet(-1) - - public actual fun compareAndSet(expected: Long, new: Long): Boolean = - if (expected == internalValue) { - internalValue = new - true - } else { - false - } - - public actual fun getAndSet(value: Long): Long { - val current = internalValue - internalValue = value - return current - } -}