package com.reactnativehypertracksdk.common internal sealed class WrapperResult { fun flatMapSuccess(onSuccess: (SuccessType) -> WrapperResult): WrapperResult = when (this) { is Success -> { onSuccess.invoke(this.success) } is Failure -> { Failure(this.failure) } } fun mapSuccess(onSuccess: (SuccessType) -> MappedSuccess): WrapperResult = when (this) { is Success -> { Success(onSuccess.invoke(this.success)) } is Failure -> { Failure(this.failure) } } fun getOrThrow(): SuccessType = when (this) { is Success -> this.success is Failure -> throw Exception( "Result unwrapping failed: ${this.failure}", this.failure, ) } companion object { fun tryAsResult(block: () -> SuccessType): WrapperResult = try { Success(block.invoke()) } catch (e: Exception) { Failure(e) } } } internal data class Success( val success: SuccessType, ) : WrapperResult() internal data class Failure( val failure: Throwable, ) : WrapperResult()