package Ġcom . github . we ery 2 8 . transactions Ċ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Single Ċ Ċ class ĠTransaction Step Impl < T >( ĊĠĠĠ Ġprivate Ġval Ġresult : ĠSingle < T >, ĊĠĠĠ Ġprivate Ġval Ġtransaction Context : ĠTransaction Context Ċ ) Ġ: ĠTransaction Step < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcommit (): ĠSingle < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction Context . getConnection (). rx Commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresult Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġtransaction Context . getConnection (). close () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< E > Ġthen ( action : Ġ( T , ĠTransaction Context ) Ġ-> ĠExecution < E >): ĠTransaction Step < E > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTransaction Step Impl ( result . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( it , Ġtransaction Context ). result () ĊĠĠĠĠĠĠĠ Ġ}, Ġtransaction Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġthen Commit ( action : Ġ( T ) Ġ-> ĠT ): ĠSingle < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rx Commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( transaction Context . getConnection (). rx Close ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Single . just ( action ( it ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġroll Back If ( action : Ġ( T ) Ġ-> ĠBoolean ): ĠComp letable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . flatMap Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rx Rollback (). and Then ( transaction Context . getConnection (). rx Close ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection (). rx Commit (). and Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection (). rx Close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġroll Back OnError (): ĠSingle < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . onError Resume Next Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rx Rollback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( transaction Context . getConnection (). rx Close ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Single . error < T >( t )) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Context . getConnection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rx Commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( transaction Context . getConnection (). rx Close ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Single . just ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresult (): ĠSingle < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }