exercism/go/bank-account/account.go

59 lines
1001 B
Go
Raw Normal View History

2016-08-13 23:20:14 +00:00
package account
import "sync"
// Account just represents a user's account
type Account struct {
sync.RWMutex
balance int
closed bool
}
// Open returns a new account
func Open(amt int) *Account {
a := new(Account)
_, ok := a.Deposit(amt)
if ok {
return a
}
return nil
}
// Close returns the payout amount and an 'ok' flag
func (a *Account) Close() (int, bool) {
a.Lock()
ret := a.balance
if a.closed {
a.Unlock()
return 0, false
}
a.closed = true
a.balance = 0
a.Unlock()
return ret, true
}
// Balance returns the current account balance
// and an 'ok' flag
func (a *Account) Balance() (int, bool) {
if a.closed {
return 0, false
}
return a.balance, true
}
// Deposit takes an amount (can be a withdrawal)
// and returns the new balance and an 'ok' flag
func (a *Account) Deposit(amount int) (int, bool) {
var ret int
var ok bool
a.Lock()
if !a.closed && a.balance+amount >= 0 {
a.balance += amount
ret = a.balance
ok = true
}
a.Unlock()
return ret, ok
}