/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠOle ks and r ĠBe z ush ko Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . ins iders er . android . calculator . domain . math Ċ Ċ import Ġcom . ins iders er . android . calculator . d agger . Default Ċ import Ġcom . ins iders er . android . calculator . domain . UseCase Ċ import Ġcom . ins iders er . android . calculator . model . Expression Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġnet . object h unter . exp 4 j . Expression Builder Ċ import Ġnet . object h unter . exp 4 j . operator . Operator Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠA Ġuse Ġcase Ġthat Ġcan Ġevaluate Ġmathematical Ġexpressions . Ġ** Expressions Ġmust Ġbe Ġnot Ġlocalized **. Ċ Ġ*/ Ċ class ĠEvaluate Expression UseCase Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ Default Ġdefault Dispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠUse Case < Expression , ĠDouble >() Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Dispatcher Ġ= Ġdefault Dispatcher ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute ( param : ĠExpression ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠExpression Builder ( param . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operator ( Factor ial Operator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. evaluate () Ġ+ Ġ 0 . 0 Ġ// ĠThis Ġensures Ġthat Ġwe Ġdon 't Ġget Ġ- 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( result . is Finite ()) Ġ{ Ġ" Got Ġ$ result Ġresult " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠArithmetic Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Expression Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Expression Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠFactor ial Operator Ġ: ĠOperator (" !", Ġ 1 , Ġtrue , ĠPREC ED ENCE _ POWER Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( var arg Ġargs : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs [ 0 ] ĊĠĠĠĠĠĠĠ Ġrequire ( arg . is Integer ()) Ġ{ Ġ" Operand Ġfor Ġfactor ial Ġhas Ġto Ġbe Ġan Ġinteger , Ġwas Ġ$ arg " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( arg Ġ>= Ġ 0 ) Ġ{ Ġ" The Ġoperand Ġof Ġthe Ġfactor ial Ġcannot Ġbe Ġless Ġthan Ġzero , Ġwas Ġ$ arg " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfactor ial Ġ= Ġfactor ial ( arg . to Long ()) ĊĠĠĠĠĠĠĠ Ġrequire ( factor ial . is Finite ()) Ġ{ Ġ" Overflow Ġin Ġfactor ial . ĠPo ss ibly Ġtoo Ġbig Ġnumber : Ġ$ arg " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfactor ial ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThrow n Ġto Ġindicate Ġthat Ġthe Ġexpression Ġis Ġinvalid . Ċ Ġ*/ Ċ class ĠInvalid Expression Exception ( cause : ĠThrowable ) Ġ: ĠIllegalArgumentException ( cause ) Ċ