Skip to content

ProgressiveOutcome

sealed class ProgressiveOutcome<out Failure, out Value>

A Outcome with integrated Progress management.

There are three possible cases:

Note that in cases, a progressive outcome may be currently loading.

  • Incomplete must be loading,

  • Success may be loading if the task is currently querying a newer value than the one it stores,

  • Failure may be loading if the task is currently retrying the operation.

To access the inner outcome and progression, you can use the destructuring operator:

val (out, progression) = /* ProgressiveOutcome */

To create progressive outcomes from computations, use the successfulWithProgress and failedWithProgress factories.

Inheritors

Types

Failure

data class Failure<Failure>(val failure: Failure, val progress: Progress = done()) : ProgressiveOutcome<Failure, Nothing> , ProgressiveOutcome.Unsuccessful<Failure> 

The latest known result of the operation was a failure, available as failure.

Incomplete

The operation is ongoing, but we do not know if it will be successful or a failure.

Success

data class Success<Value>(val value: Value, val progress: Progress = done()) : ProgressiveOutcome<Nothing, Value> 

The latest known result of the operation was a success, available as value.

Unsuccessful

sealed interface Unsuccessful<out Failure>

Operations that are not successful; common supertype of Incomplete and Failure.

Properties

failure

failureOrNull

Returns Failure.failure, or null if this outcome is not a failure.

progress

abstract val progress: Progress

The current progression of this outcome.

For more information, see ProgressiveOutcome.

value

valueOrNull

Returns Success.value, or null if this outcome is not successful.

Functions

asOutcome

Converts this progressive outcome into a regular outcome.

Because regular outcomes do not have a concept of progression, the progress information is lost. To access both the outcome and the progression information, consider using destructuration instead:

val (outcome, progression) = /* ProgressiveOutcome */

component1

component2

operator fun ProgressiveOutcome<*, *>.component2(): Progress

Syntax sugar for ProgressiveOutcome.progress.

copy

Replaces the progress information from this progressive outcome.

explode

Converts a ProgressiveOutcome into a Progressive.

In the case where in the input ProgressiveOutcome is Incomplete, null is returned.

See also

map

If this outcome is successful, replaces its value using transform.

If this outcome isn't successful, does nothing.

See also

  • mapFailure: Map the failure state instead of the success state.

mapFailure

If this outcome is failed, replaces its failure using transformFailure.

If this outcome isn't failed, does nothing.

See also

  • map: Map the success state instead of the failure state.

onFailure

inline fun <Failure> ProgressiveOutcome<Failure, *>.onFailure(block: (Failure) -> Unit)

Executes block if this outcome is a failure.

Otherwise, does nothing.

onIncomplete

inline fun ProgressiveOutcome<*, *>.onIncomplete(block: () -> Unit)

Executes block if this outcome is incomplete.

Otherwise, does nothing.

onLoading

inline fun ProgressiveOutcome<*, *>.onLoading(block: (Progress.Loading) -> Unit)

Executes block if this outcome is loading (its ProgressiveOutcome.progress is Progress.Loading).

Note that this isn't synonymous with this outcome being in the Incomplete state: successful or failed outcomes may still be loading. For more information, see ProgressiveOutcome.

Otherwise, does nothing.

onSuccess

inline fun <Value> ProgressiveOutcome<*, Value>.onSuccess(block: (Value) -> Unit)

Executes block if this outcome is successful.

Otherwise, does nothing.

toEither