Coverage Summary for Class: ResourceEither (com.javiersc.resource.either)

Class Method, % Branch, % Line, % Instruction, %
ResourceEither 80% (8/10) 42.9% (6/14) 77.8% (14/18) 71.8% (56/78)
ResourceEither$Companion 35.7% (5/14) 37.5% (6/16) 31.2% (25/80)
ResourceEither$Failure 100% (1/1) 100% (4/4) 100% (22/22)
ResourceEither$Success 100% (1/1) 100% (3/3) 100% (15/15)
Total 57.7% (15/26) 42.9% (6/14) 65.9% (27/41) 60.5% (118/195)


 @file:Suppress("FunctionName")
 
 package com.javiersc.resource.either
 
 import arrow.core.Either
 import arrow.core.left
 import arrow.core.right
 import kotlin.contracts.contract
 
 public sealed class ResourceEither<out F, out S> {
 
     public abstract val isLoading: Boolean
 
     public data class Failure<out F, out S>(
         val failure: F,
         val data: S? = null,
         override val isLoading: Boolean = false
     ) : ResourceEither<F, S>()
 
     public data class Success<out S>(
         val data: S,
         override val isLoading: Boolean = false,
     ) : ResourceEither<Nothing, S>()
 
     public inline fun <A> fold(
         failure: (Failure<F, S>) -> A,
         success: (Success<S>) -> A,
     ): A =
         when (this) {
             is Failure -> failure(this)
             is Success -> success(this)
         }
 
     public inline fun ifFailure(block: (Failure<F, S>) -> Unit) {
         if (this is Failure) block(this)
     }
 
     public inline fun ifSuccess(block: (Success<S>) -> Unit) {
         if (this is Success) block(this)
     }
 
     public fun isFailure(): Boolean {
         contract { returns(true) implies (this@ResourceEither is Failure<F, S>) }
         return this is Failure<F, S>
     }
 
     public fun isSuccess(): Boolean {
         contract { returns(true) implies (this@ResourceEither is Success<S>) }
         return this is Success<S>
     }
 
     public inline fun <L, R> toEither(
         failure: (Failure<F, S>) -> L,
         success: (Success<S>) -> R,
     ): Either<L, R> =
         fold(
             failure = { failure(it).left() },
             success = { success(it).right() },
         )
 
     @JvmName("getIsLoading")
     public fun isLoading(): Boolean {
         return this.isLoading
     }
 
     public fun successOrNull(): ResourceSuccess<S>? {
         contract { returnsNotNull() implies (this@ResourceEither is ResourceSuccess) }
         return (this as? ResourceSuccess<S>)
     }
 
     public fun successDataOrNull(): S? {
         contract { returnsNotNull() implies (this@ResourceEither is ResourceSuccess) }
         return (this as? ResourceSuccess<S>)?.data
     }
 
     public companion object {
         public fun <F, S> resourceFailure(
             failure: F,
             data: S? = null,
             isLoading: Boolean = false
         ): ResourceEither<F, S> = Failure(failure, data, isLoading)
 
         public fun <F, S> buildResourceFailure(
             failure: F,
             data: S? = null,
             isLoading: Boolean = false
         ): Failure<F, S> = Failure(failure, data, isLoading)
 
         public fun <F, S> resourceFailureLoading(
             failure: F,
             data: S? = null
         ): ResourceEither<F, S> = Failure(failure, data, true)
 
         public fun <F, S> buildResourceFailureLoading(failure: F, data: S? = null): Failure<F, S> =
             Failure(failure, data, true)
 
         public fun <S> resourceSuccess(
             data: S,
             isLoading: Boolean = false
         ): ResourceEither<Nothing, S> = Success(data, isLoading)
 
         public fun <S> buildResourceSuccess(data: S, isLoading: Boolean = false): Success<S> =
             Success(data, isLoading)
 
         public fun <S> resourceSuccessLoading(data: S): ResourceEither<Nothing, S> =
             Success(data, true)
 
         public fun <S> buildResourceSuccessLoading(data: S): Success<S> = Success(data, true)
     }
 }
 
 public typealias ResourceFailure<F, S> = ResourceEither.Failure<F, S>
 
 public typealias ResourceSuccess<S> = ResourceEither.Success<S>