diff --git a/ethers-core/src/main/kotlin/io/ethers/core/Result.kt b/ethers-core/src/main/kotlin/io/ethers/core/Result.kt index 602d47ff..4166205a 100644 --- a/ethers-core/src/main/kotlin/io/ethers/core/Result.kt +++ b/ethers-core/src/main/kotlin/io/ethers/core/Result.kt @@ -13,8 +13,8 @@ import kotlin.contracts.contract sealed class Result { class Success(val value: T) : Result() { override fun fold( - onSuccess: ResultTransformer, R>, - onFailure: ResultTransformer, R>, + onSuccess: Transformer, R>, + onFailure: Transformer, R>, ): R { return onSuccess(this) } @@ -24,8 +24,8 @@ sealed class Result { class Failure(val error: E) : Result() { override fun fold( - onSuccess: ResultTransformer, R>, - onFailure: ResultTransformer, R>, + onSuccess: Transformer, R>, + onFailure: Transformer, R>, ): R { return onFailure(this) } @@ -51,13 +51,13 @@ sealed class Result { * Maps a [Result]<[T], [E]> to [Result]<[R], [E]> by applying a function to a [Success] value, leaving a * [Failure] value untouched. * */ - fun map(mapper: ResultTransformer): Result = fold({ Success(mapper(it.value)) }, { it }) + fun map(mapper: Transformer): Result = fold({ Success(mapper(it.value)) }, { it }) /** * Maps a [Result]<[T], [E]> to [Result]<[T], [R]> by applying a function to a [Failure], leaving a * [Success] value untouched. * */ - fun mapError(mapper: ResultTransformer): Result { + fun mapError(mapper: Transformer): Result { return fold({ it }, { Failure(mapper(it.error)) }) } @@ -65,7 +65,7 @@ sealed class Result { * Call the function with value of [Success], expecting another result, and skipping if [Result] is [Failure]. * Useful when chaining multiple fallible operations on the result. * */ - fun andThen(mapper: ResultTransformer>): Result { + fun andThen(mapper: Transformer>): Result { return fold({ mapper(it.value) }, { it }) } @@ -73,7 +73,7 @@ sealed class Result { * Call the function with error of [Failure], expecting another result, and skipping if [Result] is [Success]. * Useful when chaining multiple fallible operations on the error (e.g. trying to recover from an error). * */ - fun orElse(mapper: ResultTransformer>): Result { + fun orElse(mapper: Transformer>): Result { return fold({ it }, { mapper(it.error) }) } @@ -95,7 +95,7 @@ sealed class Result { /** * Unwrap the value if [Result] is [Success], or return the result of [default] function if [Result] is [Failure]. * */ - fun unwrapOrElse(default: ResultTransformer): T { + fun unwrapOrElse(default: Transformer): T { return fold({ it.value }, { default(it.error) }) } @@ -117,27 +117,27 @@ sealed class Result { /** * Unwrap the error if [Result] is [Failure], or return the result of [default] function if [Result] is [Success]. * */ - fun unwrapErrorOrElse(default: ResultTransformer): E { + fun unwrapErrorOrElse(default: Transformer): E { return fold({ default(it.value) }, { it.error }) } /** * Callback called if [Result] is [Success]. * */ - fun onSuccess(block: ResultConsumer) = fold({ block(it.value) }, {}) + fun onSuccess(block: Consumer) = fold({ block(it.value) }, {}) /** * Callback called if [Result] is [Failure]. * */ - fun onFailure(block: ResultConsumer) = fold({}, { block(it.error) }) + fun onFailure(block: Consumer) = fold({}, { block(it.error) }) /** * Call [onSuccess] if [Result] is [Success] or [onFailure] if [Result] is [Failure], returning the result of * the called function. * */ abstract fun fold( - onSuccess: ResultTransformer, R>, - onFailure: ResultTransformer, R>, + onSuccess: Transformer, R>, + onFailure: Transformer, R>, ): R /** @@ -162,6 +162,22 @@ sealed class Result { } } + /** + * Custom functional interface for better java interop with kotlin lambdas. Prevents the java caller having to + * explicitly return `Unit.INSTANCE`. + * */ + fun interface Consumer { + operator fun invoke(t: T) + } + + /** + * Custom functional interface for better java interop with kotlin lambdas. Prevents the java caller having to + * explicitly return `Unit.INSTANCE`. + * */ + fun interface Transformer { + operator fun invoke(t: T): R + } + companion object { /** * Return a [Result.Success] with the given [value]. @@ -215,22 +231,6 @@ inline fun Result.Error.asTypeOrNull(): T? { return asTypeOrNull(T::class.java) } -/** - * Custom functional interface for better java interop with kotlin lambdas. Prevents the java caller having to - * explicitly return `Unit.INSTANCE`. - * */ -fun interface ResultConsumer { - operator fun invoke(t: T) -} - -/** - * Custom functional interface for better java interop with kotlin lambdas. Prevents the java caller having to - * explicitly return `Unit.INSTANCE`. - * */ -fun interface ResultTransformer { - operator fun invoke(t: T): R -} - /** * Return a [Result.Success] with the given [value]. * */ diff --git a/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcRequest.kt b/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcRequest.kt index e051459c..f84c7b2b 100644 --- a/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcRequest.kt +++ b/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcRequest.kt @@ -2,7 +2,6 @@ package io.ethers.providers.types import com.fasterxml.jackson.core.JsonParser import io.ethers.core.Result -import io.ethers.core.ResultTransformer import io.ethers.providers.JsonRpcClient import io.ethers.providers.RpcError import java.util.concurrent.CompletableFuture @@ -29,7 +28,7 @@ abstract class RpcRequest { * * The function will be executed asynchronously after the request is sent and response received. */ - fun map(mapper: ResultTransformer): RpcRequest { + fun map(mapper: Result.Transformer): RpcRequest { return MappingRpcRequest(this) { it.map(mapper) } } @@ -38,7 +37,7 @@ abstract class RpcRequest { * * The function will be executed asynchronously after the request is sent and response received. */ - fun mapError(mapper: ResultTransformer): RpcRequest { + fun mapError(mapper: Result.Transformer): RpcRequest { return MappingRpcRequest(this) { it.mapError(mapper) } } @@ -48,7 +47,7 @@ abstract class RpcRequest { * * The function will be executed asynchronously after the request is sent and response received. */ - fun andThen(mapper: ResultTransformer>): RpcRequest { + fun andThen(mapper: Result.Transformer>): RpcRequest { return MappingRpcRequest(this) { it.andThen(mapper) } } @@ -58,7 +57,7 @@ abstract class RpcRequest { * * The function will be executed asynchronously after the request is sent and response received. */ - fun orElse(mapper: ResultTransformer>): RpcRequest { + fun orElse(mapper: Result.Transformer>): RpcRequest { return MappingRpcRequest(this) { it.orElse(mapper) } } } diff --git a/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcSubscribe.kt b/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcSubscribe.kt index e5763e9a..8cbb4c4a 100644 --- a/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcSubscribe.kt +++ b/ethers-providers/src/main/kotlin/io/ethers/providers/types/RpcSubscribe.kt @@ -2,7 +2,6 @@ package io.ethers.providers.types import com.fasterxml.jackson.core.JsonParser import io.ethers.core.Result -import io.ethers.core.ResultTransformer import io.ethers.providers.JsonPubSubClient import io.ethers.providers.RpcError import io.ethers.providers.SubscriptionStream @@ -25,7 +24,7 @@ interface RpcSubscribe { * * The function will be executed asynchronously after the request is sent and response received. */ - fun map(mapper: ResultTransformer, SubscriptionStream>): RpcSubscribe { + fun map(mapper: Result.Transformer, SubscriptionStream>): RpcSubscribe { return MappingRpcSubscribe(this) { it.map(mapper) } } @@ -34,7 +33,7 @@ interface RpcSubscribe { * * The function will be executed asynchronously after the request is sent and response received. */ - fun mapError(mapper: ResultTransformer): RpcSubscribe { + fun mapError(mapper: Result.Transformer): RpcSubscribe { return MappingRpcSubscribe(this) { it.mapError(mapper) } } @@ -44,7 +43,7 @@ interface RpcSubscribe { * * The function will be executed asynchronously after the request is sent and response received. */ - fun andThen(mapper: ResultTransformer, Result, E>>): RpcSubscribe { + fun andThen(mapper: Result.Transformer, Result, E>>): RpcSubscribe { return MappingRpcSubscribe(this) { it.andThen(mapper) } } @@ -54,7 +53,7 @@ interface RpcSubscribe { * * The function will be executed asynchronously after the request is sent and response received. */ - fun orElse(mapper: ResultTransformer, R>>): RpcSubscribe { + fun orElse(mapper: Result.Transformer, R>>): RpcSubscribe { return MappingRpcSubscribe(this) { it.orElse(mapper) } } }