-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from Irineu333/release/v1.0
Release/v1.0
- Loading branch information
Showing
9 changed files
with
462 additions
and
1 deletion.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
sealed class Resource<out T, out E> { | ||
|
||
sealed class Result<out T, out E> : Resource<T, E>() { | ||
|
||
data class Success<T>(val data: T) : Result<T, Nothing>() | ||
|
||
data class Failure<E>(val error: E) : Result<Nothing, E>() | ||
} | ||
|
||
data object Loading : Resource<Nothing, Nothing>() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package extension | ||
|
||
import Resource | ||
|
||
// basic | ||
|
||
inline val Resource<*, *>.isLoading get() = this == Resource.Loading | ||
inline val Resource<*, *>.isSuccess get() = this is Resource.Result.Success | ||
inline val Resource<*, *>.isError get() = this is Resource.Result.Failure | ||
|
||
fun <T, E> Resource.Result<T, E>.asResource() = this as Resource<T, E> | ||
|
||
// map | ||
|
||
inline fun <T, E, T2> Resource<T, E>.mapSuccess( | ||
transform: (T) -> T2 | ||
) = when (this) { | ||
is Resource.Result.Failure -> Resource.Result.Failure(error) | ||
is Resource.Result.Success -> Resource.Result.Success(transform(data)) | ||
Resource.Loading -> Resource.Loading | ||
} | ||
|
||
inline fun <T, E, T2> Resource.Result<T, E>.mapSuccess( | ||
transform: (T) -> T2 | ||
) = when (this) { | ||
is Resource.Result.Failure -> Resource.Result.Failure(error) | ||
is Resource.Result.Success -> Resource.Result.Success(transform(data)) | ||
} | ||
|
||
inline fun <T, E, E2> Resource<T, E>.mapError( | ||
transform: (E) -> E2 | ||
) = when (this) { | ||
is Resource.Result.Failure -> Resource.Result.Failure(transform(error)) | ||
is Resource.Result.Success -> Resource.Result.Success(data) | ||
Resource.Loading -> Resource.Loading | ||
} | ||
|
||
inline fun <T, E, E2> Resource.Result<T, E>.mapError( | ||
transform: (E) -> E2 | ||
) = when (this) { | ||
is Resource.Result.Failure -> Resource.Result.Failure(transform(error)) | ||
is Resource.Result.Success -> Resource.Result.Success(data) | ||
} | ||
|
||
// action | ||
|
||
inline fun <T, E> Resource<T, E>.ifSuccess( | ||
onSuccess: (T) -> Unit, | ||
) = apply { | ||
if (this is Resource.Result.Success) { | ||
onSuccess(data) | ||
} | ||
} | ||
|
||
inline fun <T, E> Resource<T, E>.ifFailure( | ||
onError: (E) -> Unit, | ||
) = apply { | ||
if (this is Resource.Result.Failure) { | ||
onError(error) | ||
} | ||
} | ||
|
||
inline fun <T, E> Resource<T, E>.ifLoading( | ||
onLoading: () -> Unit, | ||
) = apply { | ||
if (this == Resource.Loading) { | ||
onLoading() | ||
} | ||
} | ||
|
||
// getter | ||
|
||
inline fun <R, T : R, E> Resource<T, E>.getOrElse(onElse: () -> R): R { | ||
|
||
ifSuccess { return it } | ||
|
||
return onElse() | ||
} | ||
|
||
|
||
fun <T, E> Resource<T, E>.getOrNull() = getOrElse { null } | ||
|
||
|
||
fun <T> Resource<T, *>.getOrThrow( | ||
error: Throwable = Throwable("$this isn't success"), | ||
) = getOrElse { throw error } | ||
|
||
// parser | ||
|
||
fun <T> Resource.Result<T, Throwable>.toResult() = when (this) { | ||
is Resource.Result.Success -> Result.success(data) | ||
is Resource.Result.Failure -> Result.failure(error) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package extension | ||
|
||
fun <T> Result<T>.toResource(): Resource.Result<T, Throwable> { | ||
return Resource.Result.Success( | ||
getOrElse { | ||
return Resource.Result.Failure(it) | ||
} | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import extension.asResource | ||
import org.junit.jupiter.api.Assertions.* | ||
import org.junit.jupiter.api.Test | ||
|
||
class ResourceTest { | ||
|
||
@Test | ||
fun successResult_shouldHoldData() { | ||
val success = Resource.Result.Success("Test Data") | ||
assertEquals("Test Data", success.data) | ||
} | ||
|
||
@Test | ||
fun failureResult_shouldHoldError() { | ||
val failure = Resource.Result.Failure("Test Error") | ||
assertEquals("Test Error", failure.error) | ||
} | ||
|
||
@Test | ||
fun loadingResource_shouldBeAlwaysEquals() { | ||
assertEquals(Resource.Loading, Resource.Loading) | ||
} | ||
|
||
@Test | ||
fun resource_whenRemainingBranches() { | ||
when (Resource.Result.Success("testing").asResource()) { | ||
is Resource.Result.Success -> Unit | ||
is Resource.Result.Failure -> Unit | ||
Resource.Loading -> Unit | ||
} | ||
} | ||
} |
Oops, something went wrong.