package Ġpl . kar ol 2 0 2 . sock . error handler Ċ Ċ import Ġpl . kar ol 2 0 2 . pl umber .* Ċ import Ġpl . kar ol 2 0 2 . sock . Public Api Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ Ċ @ Public Api Ċ abstract Ġclass ĠException Catch er Ġinternal Ġconstructor ( protected Ġval Ġexceptions : ĠList < Exception Entry <* >>) Ċ { Ċ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ @ Public Api Ċĉ ĉ fun Ġuni Pipeline Builder (): ĠUni Pipeline Builder Ġ= ĠUni Pipeline Builder () ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġbi Pipeline Builder (): ĠBi Pipeline Builder Ġ= ĠBi Pipeline Builder () Ċ ĉ } ĊĊ ĉ data Ġclass ĠException Entry < E Ġ: ĠException > Ġinternal Ġconstructor ( val Ġklass : ĠK Class < E >, Ċĉ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler : Ġ( E ) Ġ-> ĠUnit ) ĊĊ ĉ @ Public Api Ċ ĉ abstract Ġclass ĠBuilder Ġprotected Ġconstructor () Ċ ĉ { Ċĉ ĉ protected Ġval Ġexceptions Ġ= Ġmutable ListOf < Exception Entry <* >>() ĊĊĉ ĉ @ Published Api Ċĉ ĉ internal Ġfun Ġ< E : ĠException > Ġadd Handler ( klass : ĠK Class < E >, Ġhandler : Ġ( E ) Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ exceptions . add ( Exception Entry ( klass , Ġhandler )) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Public Api Ċ ĉ class ĠUni Pipeline Builder Ġinternal Ġconstructor () Ġ: ĠBuilder () Ċ ĉ { Ċĉ ĉ @ Public Api Ċĉ ĉ inline Ġfun Ġ< re ified ĠE : ĠException > Ġadd Handler ( no inline Ġhandler : Ġ( E ) Ġ-> ĠUnit ) Ġ: ĠUni Pipeline Builder Ċĉ ĉ { Ċĉĉ ĉ add Handler ( E :: class , Ġhandler ) Ċĉĉ ĉ return Ġthis Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġ< I , ĠO > Ġcreate Layer ( pipeline : ĠUni Pipeline < I , ĠO >) Ġ= ĠUni Pipeline Exception Catch er ( pipeline , Ġexceptions ) ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< I , ĠO > Ġcreate Pipeline ( pipeline : ĠOpen Uni Pipeline < I , ĠO >): ĠOpen Uni Pipeline < I , ĠO > Ġ= Ċĉĉĉ ĉ create Layer ( pipeline ). to Open Uni Pipeline () ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< O > Ġcreate Pipeline ( pipeline : ĠLeft Closed Uni Pipeline < O , Ġ* >): ĠLeft Closed Uni Pipeline < O , ĠUnit > Ġ= Ċĉĉĉ ĉ Placeholder Uni Layer Ġ+ Ġcreate Layer ( pipeline ). to Open Uni Pipeline () ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< I > Ġcreate Pipeline ( pipeline : ĠRight Closed Uni Pipeline < I , Ġ* >): ĠRight Closed Uni Pipeline < I , Ġ*> Ġ= Ċĉĉĉ ĉ create Layer ( pipeline ). to Open Uni Pipeline () Ġ+ ĠPlace holder Uni Layer ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġcreate Pipeline ( pipeline : ĠClosed Uni Pipeline ): ĠClosed Uni Pipeline Ġ= Ċĉĉĉ ĉ Placeholder Uni Layer Ġ+ Ġcreate Layer ( pipeline ). to Open Uni Pipeline () Ġ+ ĠPlace holder Uni Layer Ċ ĉ } ĊĊ ĉ @ Public Api Ċ ĉ class ĠBi Pipeline Builder Ġinternal Ġconstructor () Ġ: ĠBuilder () Ċ ĉ { Ċĉ ĉ @ Public Api Ċĉ ĉ inline Ġfun Ġ< re ified ĠE : ĠException > Ġadd Handler ( no inline Ġhandler : Ġ( E ) Ġ-> ĠUnit ) Ġ: ĠBi Pipeline Builder Ċĉ ĉ { Ċĉĉ ĉ add Handler ( E :: class , Ġhandler ) Ċĉĉ ĉ return Ġthis Ċĉ ĉ } ĊĊĉ ĉ private Ġfun Ġ< I , ĠO > Ġcreate Layer ( pipeline : ĠBi Pipeline < I , ĠO >) Ġ= ĠBi Pipeline Exception Catch er ( pipeline , Ġexceptions ) ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< I , ĠO > Ġcreate Pipeline ( pipeline : ĠOpen Bi Pipeline < I , ĠO >): ĠOpen Bi Pipeline < I , ĠO > Ġ= Ċĉĉĉ ĉ create Layer ( pipeline ). to Open Bi Pipeline () ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< O > Ġcreate Pipeline ( pipeline : ĠLeft Closed Bi Pipeline < O , Ġ* >): ĠLeft Closed Bi Pipeline < O , ĠUnit > Ġ= Ċĉĉĉ ĉ Placeholder Bi Layer Ġ+ Ġcreate Layer ( pipeline ). to Open Bi Pipeline () ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġ< I > Ġcreate Pipeline ( pipeline : ĠRight Closed Bi Pipeline < I , Ġ* >): ĠRight Closed Bi Pipeline < I , Ġ*> Ġ= Ċĉĉĉ ĉ create Layer ( pipeline ). to Open Bi Pipeline () Ġ+ ĠPlace holder Bi Layer ĊĊĉ ĉ @ Public Api Ċĉ ĉ fun Ġcreate Pipeline ( pipeline : ĠClosed Bi Pipeline ): ĠClosed Bi Pipeline Ġ= Ċĉĉĉ ĉ Placeholder Bi Layer Ġ+ Ġcreate Layer ( pipeline ). to Open Bi Pipeline () Ġ+ ĠPlace holder Bi Layer Ċ ĉ } ĊĊ ĉ private Ġobject ĠPlace holder Uni Layer Ġ: ĠCreator Layer < Unit >, ĠConsumer Layer < Unit > Ċ ĉ { Ċĉ ĉ override Ġfun Ġtransform ( input : ĠUnit ) Ġ{ Ġ} Ċ ĉ } ĊĊ ĉ private Ġobject ĠPlace holder Bi Layer Ġ: ĠTerminal Bi Layer < Unit > Ċ ĉ { Ċĉ ĉ override Ġfun Ġtransform ( input : ĠUnit ) Ġ{ Ġ} ĊĊĉ ĉ override Ġfun Ġtransform Back ( input : ĠUnit ) Ġ{ Ġ} Ċ ĉ } ĊĊ ĉ protected Ġinline Ġfun Ġ< re ified ĠE Ġ: ĠException > Ġhandle Exception ( exception : ĠE ) Ċ ĉ { Ċĉ ĉ val Ġentry Ġ= Ġexceptions . first OrNull Ġ{ ĠE :: class . is Subclass Of ( it . klass ) Ġ} Ġas ĠException Entry < E >? Ċĉ ĉ entry ?. handler ?. invoke ( exception ) Ġ?: Ġthrow Ġexception Ċ ĉ } Ċ } Ċ Ċ internal Ġclass ĠUni Pipeline Exception Catch er < I , ĠO > Ġinternal Ġconstructor ( private Ġval Ġpipeline : ĠUni Pipeline < I , ĠO >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ Ġexceptions : ĠList < Exception Entry <* >>) Ġ: Ċĉ ĉ Exception Catch er ( exceptions ), ĠTrans itive Layer With Flow Control < I , ĠO > Ċ { Ċ ĉ @ Public Api Ċ ĉ override Ġfun Ġtransform With Flow Control ( input : ĠI ): ĠOutput < O > Ġ= Ġtry Ċ ĉ { Ċĉ ĉ pipeline . transform ( input ) Ċ ĉ } Ċ ĉ catch ( e : ĠException ) Ċ ĉ { Ċĉ ĉ handle Exception ( e ) Ċĉ ĉ Output . No Value () Ċ ĉ } Ċ } Ċ Ċ internal Ġclass ĠBi Pipeline Exception Catch er < I , ĠO > Ġinternal Ġconstructor ( private Ġval Ġpipeline : ĠBi Pipeline < I , ĠO >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions : ĠList < Exception Entry <* >>) Ġ: Ċĉ ĉ Exception Catch er ( exceptions ), ĠTrans itive Bi Layer With Flow Control < I , ĠO > Ċ { Ċ ĉ @ Public Api Ċ ĉ override Ġfun Ġtransform With Flow Control ( input : ĠI ): ĠOutput < O > Ġ= Ġtry Ċ ĉ { Ċĉ ĉ pipeline . transform ( input ) Ċ ĉ } Ċ ĉ catch ( e : ĠException ) Ċ ĉ { Ċĉ ĉ handle Exception ( e ) Ċĉ ĉ Output . No Value () Ċ ĉ } ĊĊ ĉ @ Public Api Ċ ĉ override Ġfun Ġtransform Back With Flow Control ( input : ĠO ): ĠOutput < I > Ġ= Ġtry Ċ ĉ { Ċĉ ĉ pipeline . transform Back ( input ) Ċ ĉ } Ċ ĉ catch ( e : ĠException ) Ċ ĉ { Ċĉ ĉ handle Exception ( e ) Ċĉ ĉ Output . No Value () Ċ ĉ } Ċ } Ċ