package Ġdev . ne effect . nee . effects . tx Ċ Ċ import Ġio . v avr . control . Either Ċ import Ġio . v avr . control . Option Ċ import Ġdev . ne effect . nee . effects . async . Async Stack Ċ import Ġjava . lang . IllegalStateException Ċ Ċ internal Ġclass ĠDB Like Provider ( ĊĠĠĠĠĠĠĠ Ġval Ġdb : ĠDB Like , ĊĠĠĠĠĠĠĠ Ġval Ġconn : ĠTx Connection < DB Like > Ġ= ĠDB Connection ( db ) ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĊĠĠĠ ĠTx Provider < DB Like , ĠDB Like Provider > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Connection (): ĠTx Connection < DB Like > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ(! db . connected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db . connect ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" cannot Ġconnect ĠDB ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Connection State ( newState : ĠTx Connection < DB Like >) Ġ= ĊĠĠĠĠĠĠĠ ĠDB Like Provider ( db , ĠnewState ) ĊĊ Ċ } ĊĊ Ċ internal Ġopen Ġclass ĠDB Connection ( val Ġdb : ĠDB Like , Ġval Ġlevel : Int Ġ= Ġ 0 ) Ġ: ĠTx Connection < DB Like > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġhas Transaction (): ĠBoolean Ġ Ġ= Ġfalse ĊĊĊĠĠĠ Ġoverride Ġfun Ġbegin (): ĠEither < Tx Error , ĠTx Started < DB Like >> Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( db . begin ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . right ( DB Tx Connection ( db , Ġlevel Ġ Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . left < Tx Error , ĠTx Started < DB Like >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx ErrorType . Cannot Start Transaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontinue Tx (): ĠEither < Tx Error , ĠTx Started < DB Like >> Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( db . continue Transaction ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . right ( DB Tx Connection ( db , Ġlevel )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . left < Tx Error , ĠTx Started < DB Like >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx ErrorType . Cannot Continue Transaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetResource (): ĠDB Like Ġ= Ġdb ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠDB Tx Connection ( db : ĠDB Like , Ġlevel : Int ) Ġ: ĠDB Connection ( db , Ġlevel ), ĠTx Started < DB Like > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhas Transaction (): ĠBoolean Ġ= Ġtrue ĊĊĊĠĠĠ Ġoverride Ġfun Ġcommit (): ĠPair < Option < Tx Error >, ĠTx Connection < DB Like >> Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( db . commit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Option . none < Tx Error >(), ĠDB Connection ( db , Ġlevel Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Option . some < Tx Error >( Tx ErrorType . Cannot Commit Transaction ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrollback (): ĠPair < Option < Tx Error >, ĠTx Connection < DB Like >> Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( db . rollback ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Option . none < Tx Error >(), ĠDB Connection ( db , Ġlevel Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Option . some < Tx Error >( Tx ErrorType . Cannot Rollback Transaction ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ