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 }