package Ġcom . l uk as le ch ner . coroutine use case son android . use cases . coroutines . use case 1 0 Ċ Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . l uk as le ch ner . coroutine use case son android . base . Base ViewModel Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . math . BigInteger Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ class ĠCalcul ation In Background ViewModel ( ĊĊĠĠĠ Ġprivate Ġval Ġdefault Dispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Default Ċ Ċ ) Ġ: ĠBase ViewModel < Ui State >() Ġ{ ĊĊĠĠĠ Ġfun Ġperform Calculation ( factor ial Of : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Loading ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠBigInteger Ġ= ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomputation Duration Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġcalculate Factor ial Of ( factor ial Of ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult String Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Conversion Duration Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult String Ġ= Ġconvert ToString ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . Success ( result String , Ġcomputation Duration , Ġstring Conversion Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . Error (" Error Ġwhile Ġcalculating Ġresult ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcalculate Factor ial Of ( number : ĠInt ): ĠBigInteger Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfactor ial Ġ= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactor ial Ġ= Ġfactor ial . multiply ( BigInteger . valueOf ( i . to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactor ial ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġconvert ToString ( number : ĠBigInteger ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( default Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber . toString () ĊĠĠĠĠĠĠĠ Ġ} Ċ }