package Ġcom . s ib pf . utils . either Ċ Ċ /** Ċ Ġ* ĠType - class Ġwhich Ġvalue Ġcan Ġbe Ġinstance Ġof Ġ[ L ] Ġor Ġ[ R ] Ġclass . Ċ Ġ*/ Ċ sealed Ġclass ĠEither < L , ĠR > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType - class Ġrepresents Ġleft - side Ġof Ġ[ Either ] Ġcase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠValue Ġwhich Ġ[ Left ] Ġcontains . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠLeft < L , ĠR >( val Ġvalue : ĠL ) Ġ: ĠEither < L , ĠR >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType - class Ġrepresents Ġright - side Ġof Ġ[ Either ] Ġcase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠValue Ġwhich Ġ[ Right ] Ġcontains . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠRight < L , ĠR >( val Ġvalue : ĠR ) Ġ: ĠEither < L , ĠR >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRight - based Ġfl ap Map Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġself Ġif Ġit 's Ġ[ Left ] Ġor Ġ[ Either ] Ġreturned Ġby Ġ[ f ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġflat Map ( f : Ġ( R ) Ġ-> ĠEither < L , ĠT >): ĠEither < L , ĠT > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġthis . value . as Left () ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġf ( this . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRight - based Ġmap Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġself Ġif Ġit 's Ġ[ Left ] Ġor Ġ[ Right ] Ġwith Ġvalue Ġreturned Ġby Ġ[ f ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġmap ( f : Ġ( R ) Ġ-> ĠT ): ĠEither < L , ĠT > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġthis . value . as Left () ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġf ( this . value ). as Right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLeft - based Ġmap Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġself Ġif Ġit 's Ġ[ Right ] Ġor Ġ[ Left ] Ġwith Ġvalue Ġreturned Ġby Ġ[ f ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġmap Left ( f : Ġ( L ) Ġ-> ĠT ): ĠEither < T , ĠR > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġf ( this . value ). as Left () ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġthis . value . as Right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBi - direction al Ġmap Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠEither Ġwith Ġmapped Ġsides . ĠIt 'll Ġbe Ġ[ Left ] Ġmapped Ġby Ġ[ left ] Ġfunction Ġif Ġ[ b imap ] Ġwas Ġcalled Ġon Ġ[ Left ] ĊĠĠĠĠ Ġ* Ġinstance . ĠSame Ġrule Ġfor Ġ[ Right ], Ġbut Ġits Ġvalue Ġmaps Ġby Ġ[ right ] Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< A , ĠB > Ġb imap ( left : Ġ( L ) Ġ-> ĠA , Ġright : Ġ( R ) Ġ-> ĠB ): ĠEither < A , ĠB > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġleft ( this . value ). as Left () ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġright ( this . value ). as Right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvalu ates Ġsome Ġvalue Ġwhich Ġdepends Ġon Ġside . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġvalue Ġevaluated Ġby Ġ[ if Left ] Ġfunction Ġif Ġ[ Either ] Ġis Ġ[ Left ] Ġinstance . ĠIn Ġ[ Right ] Ġcase Ġvalue Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġevaluated Ġby Ġ[ if Right ] Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġfold ( if Left : Ġ( L ) Ġ-> ĠT , Ġif Right : Ġ( R ) Ġ-> ĠT ): ĠT Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġif Left ( this . value ) ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġif Right ( this . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRight - based Ġ' get ' Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnull Ġif Ġ[ Either ] Ġis Ġ[ Left ], Ġelse Ġ- Ġ[ Right . value ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget OrNull (): ĠR ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġthis . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRight - based Ġ' exists ' Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġfalse Ġif Ġ[ Either ] Ġis Ġ[ Left ], Ġelse Ġevaluates Ġby Ġ[ predicate ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexists ( predicate : Ġ( R ) Ġ-> ĠBoolean ): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLeft Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġis ĠRight Ġ-> Ġpredicate ( this . value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠShort cut Ġfor Ġcreate Ġ[ Either ] Ġinstance Ġfrom Ġany Ġvalue . Ċ Ġ* ĠWrap s Ġvalue Ġto Ġ[ Either . Left ]. Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Either . Left ] Ġin Ġwhich Ġthe Ġvalue Ġwill Ġbe Ġwrapped . Ċ Ġ*/ Ċ fun Ġ< L , ĠR > ĠL . as Left (): ĠEither < L , ĠR > Ġ= ĠEither . Left ( this ) ĊĊ Ċ /** Ċ Ġ* ĠShort cut Ġfor Ġcreate Ġ[ Either ] Ġinstance Ġfrom Ġany Ġvalue . Ċ Ġ* ĠWrap s Ġvalue Ġto Ġ[ Either . Right ]. Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Either . Right ] Ġin Ġwhich Ġthe Ġvalue Ġwill Ġbe Ġwrapped . Ċ Ġ*/ Ċ fun Ġ< L , ĠR > ĠR . as Right (): ĠEither < L , ĠR > Ġ= ĠEither . Right ( this ) Ċ Ċ /** Ċ Ġ* ĠFold Ġshortcut Ġfor Ġcase Ġwhen Ġ[ Either . Left ] Ġand Ġ[ Either . Right ] Ġwere Ġreduced Ġto Ġthe Ġsame Ġtype . Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Either . Left . value ] Ġor Ġ[ Either . Right . value ] Ċ Ġ*/ Ċ fun Ġ< T > ĠEither < T , ĠT >. merge (): ĠT Ġ= Ġthis . fold ( if Left Ġ= Ġ{ Ġit Ġ}, Ġif Right Ġ= Ġ{ Ġit Ġ}) Ċ