Skip to content

Commit 7af325c

Browse files
committed
Add Try type
1 parent 8c3a7c6 commit 7af325c

File tree

1 file changed

+46
-0
lines changed
  • src/commonMain/kotlin/fr/acinq/bitcoin/utils

1 file changed

+46
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package fr.acinq.bitcoin.utils
2+
3+
public sealed class Try<T> {
4+
public abstract val isSuccess: Boolean
5+
public val isFailure: Boolean get() = !isSuccess
6+
public abstract fun get(): T
7+
public abstract fun getOrElse(f: () -> T): T
8+
public abstract fun recoverWith(f: () -> Try<T>): Try<T>
9+
public abstract fun <R> map(f: (T) -> R): Try<R>
10+
11+
public data class Success<T>(val result: T) : Try<T>() {
12+
override val isSuccess: Boolean = true
13+
override fun get(): T = result
14+
override fun getOrElse(f: () -> T): T = result
15+
override fun recoverWith(f: () -> Try<T>): Try<T> = this
16+
override fun <R> map(f: (T) -> R): Try<R> = runTrying { f(result) }
17+
}
18+
19+
public data class Failure<T>(val error: Throwable) : Try<T>() {
20+
override val isSuccess: Boolean = false
21+
override fun get(): T = throw error
22+
override fun getOrElse(f: () -> T): T = f()
23+
override fun recoverWith(f: () -> Try<T>): Try<T> = f()
24+
25+
@Suppress("UNCHECKED_CAST")
26+
override fun <R> map(f: (T) -> R): Try<R> = this as Try<R>
27+
}
28+
29+
public companion object {
30+
public operator fun <T> invoke(block: () -> T): Try<T> = runTrying(block)
31+
}
32+
}
33+
34+
public inline fun <R> runTrying(block: () -> R): Try<R> =
35+
try {
36+
Try.Success(block())
37+
} catch (e: Throwable) {
38+
Try.Failure(e)
39+
}
40+
41+
public inline fun <T, R> T.runTrying(block: T.() -> R): Try<R> =
42+
try {
43+
Try.Success(block())
44+
} catch (e: Throwable) {
45+
Try.Failure(e)
46+
}

0 commit comments

Comments
 (0)