@ file : Suppress (" Data Class Private Constructor ") Ċ Ċ package Ġentities Ċ Ċ import Ġassert 4 k .* Ċ import Ġentities . Valid able . Companion . validate Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġutil . test . Cor outines Test Ċ import Ġkotlin . test .* Ċ Ċ internal Ġclass ĠEither Cor outines Test Ġ: ĠCor outines Test Ġ{ ĊĊĠĠĠ Ġprivate Ġinterface ĠPositive Number Error Ġ: ĠValidationError ĊĠĠĠ Ġprivate Ġobject ĠNegative Number Ġ: ĠPositive Number Error ĊĠĠĠ Ġprivate Ġobject ĠSecond Error Ġ: ĠPositive Number Error ĊĠĠĠ Ġprivate Ġobject ĠThird Error Ġ: ĠPositive Number Error ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠPositive Number Ġprivate Ġconstructor ( val Ġnumber : ĠInt ): ĊĠĠĠĠĠĠĠ ĠValid able < Positive Number Error > Ġby ĠValidator ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition ally ( number Ġ> Ġ 0 , Ġ{ ĠNegative Number Ġ}, Ġ{ ĠPositive Number ( number ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( number : ĠInt ) Ġ= ĠPositive Number ( number ). validate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠInt ) Ġ= ĠPositive Number ( number Ġ* Ġother ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsecond ( first : ĠPositive Number , Ġmultiplier : ĠInt ): ĠEither < Second Error , ĠPositive Number > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( multiplier Ġ>= Ġ 0 ) Ġ( first Ġ* Ġmultiplier ). right () ĊĠĠĠĠĠĠĠ Ġelse ĠSecond Error . left () ĊĊĠĠĠ Ġprivate Ġfun Ġthird ( second : ĠPositive Number , Ġmultiplier : ĠInt ): ĠEither < Third Error , ĠPositive Number > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( multiplier Ġ>= Ġ 0 ) Ġ( second Ġ* Ġmultiplier ). right () ĊĠĠĠĠĠĠĠ Ġelse ĠThird Error . left () ĊĊĠĠĠ Ġ// Ġregion Ġfix Flow ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fix Flow Ġreturn Ġthe Ġcorrect ĠRight `() Ġ= Ġcor outines Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠEither . fix Flow < Error , ĠPositive Number , ĠError > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( one ) Ġ= ĠPositive Number ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( two ) Ġ= Ġsecond ( one , Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( third ( two , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Ġthat Ġresult . first (). right OrThrow (). number Ġequals Ġ 1 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fix Flow Ġreturn Ġthe Ġcorrect ĠError Ġif Ġfirst Ġfails `() Ġ= Ġcor outines Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠEither . fix Flow < Error , ĠPositive Number , ĠError > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( one ) Ġ= ĠPositive Number (- 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( two ) Ġ= Ġsecond ( one , Ġ- 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( third ( two , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Ġthat Ġresult . first (). left OrNull () Ġequals ĠNegative Number ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fix Flow Ġreturn Ġthe Ġcorrect ĠError Ġif Ġsecond Ġfails `() Ġ= Ġcor outines Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠEither . fix Flow < Error , ĠPositive Number , ĠError > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( one ) Ġ= ĠPositive Number ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( two ) Ġ= Ġsecond ( one , Ġ- 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( third ( two , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Ġthat Ġresult . first (). left OrNull () Ġequals ĠSecond Error ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fix Flow Ġreturn Ġthe Ġcorrect ĠError Ġif Ġthird Ġfails `() Ġ= Ġcor outines Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠEither . fix Flow < Error , ĠPositive Number , ĠError > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( one ) Ġ= ĠPositive Number ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( two ) Ġ= Ġsecond ( one , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( third ( two , Ġ- 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Ġthat Ġresult . first (). left OrNull () Ġequals ĠThird Error ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` fix Flow Ġreturn Ġexplicit Ġerror `() Ġ= Ġcor outines Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠEither . fix Flow < Error , ĠPositive Number , ĠError > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( one ) Ġ= ĠPositive Number ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( two ) Ġ= Ġsecond ( one , Ġ- 2 ) Ġor ĠNegative Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( third ( two , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Ġthat Ġresult . first (). left OrNull () Ġequals ĠNegative Number ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region Ċ } Ċ