@@ -30,18 +30,18 @@ class TransactionalBankAccount : BankAccount {
3030 override val balance: Int
3131 get() = account.get().balance
3232
33- fun <T > transaction (block : BankAccount .() -> T ): T {
34- var result: T
33+ fun transaction (block : BankAccount .() -> Boolean ): Boolean {
3534 do {
3635 val currentAccount = account.get()
3736 val newAccount = currentAccount.copy()
38- result = block(newAccount)
37+ if (! block(newAccount))
38+ return false
3939 } while (! account.compareAndSet(currentAccount, newAccount))
40- return result
40+ return true
4141 }
4242
4343 override fun deposit (amount : Int ) {
44- transaction { deposit(amount) }
44+ transaction { deposit(amount); true }
4545 }
4646
4747 override fun withdraw (amount : Int ): Boolean {
@@ -57,6 +57,16 @@ fun TransactionalBankAccount.buyWithCashback(price: Int, cashbackPercentage: Int
5757 } else false
5858}
5959
60+ fun transactionalBankAccountTest0 () {
61+ val account = TransactionalBankAccount ()
62+ account.deposit(1_500 )
63+ account.transaction {
64+ withdraw(1_000 )
65+ withdraw(1_000 )
66+ }
67+ check(account.balance == 1_500 )
68+ }
69+
6070fun transactionalBankAccountTest1 () {
6171 val account = TransactionalBankAccount ()
6272 val t1 = thread {
@@ -110,6 +120,7 @@ fun transactionalBankAccountTest3() {
110120}
111121
112122fun main () {
123+ transactionalBankAccountTest0()
113124 transactionalBankAccountTest1()
114125 transactionalBankAccountTest2()
115126 transactionalBankAccountTest3()
0 commit comments