-
-
Save nnutter/7af3720d52ad7e9e900f to your computer and use it in GitHub Desktop.
Vending machine with long vend() function
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct Item { | |
var price: Int | |
var count: Int | |
} | |
enum VendingMachineError: ErrorType { | |
case InvalidSelection | |
case InsufficientFunds(coinsNeeded: Int) | |
case OutOfStock | |
} | |
class VendingMachine { | |
var inventory = [ | |
"Candy Bar": Item(price: 12, count: 7), | |
"Chips": Item(price: 10, count: 4), | |
"Pretzels": Item(price: 7, count: 11) | |
] | |
var coinsDeposited = 0 | |
func dispense(snack: String) { | |
print("Dispensing \(snack)") | |
} | |
func vend(itemNamed name: String) throws { | |
guard var item = inventory[name] else { | |
throw VendingMachineError.InvalidSelection | |
} | |
guard item.count > 0 else { | |
throw VendingMachineError.OutOfStock | |
} | |
guard item.price <= coinsDeposited else { | |
throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited) | |
} | |
coinsDeposited -= item.price | |
--item.count | |
inventory[name] = item | |
dispense(name) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct Item { | |
var price: Int | |
var count: Int | |
} | |
enum VendingMachineError: ErrorType { | |
case InvalidSelection | |
case InsufficientFunds(coinsNeeded: Int) | |
case OutOfStock | |
} | |
class VendingMachine { | |
var inventory = [ | |
"Candy Bar": Item(price: 12, count: 7), | |
"Chips": Item(price: 10, count: 4), | |
"Pretzels": Item(price: 7, count: 11) | |
] | |
var coinsDeposited = 0 | |
func dispense(snack: String) { | |
print("Dispensing \(snack)") | |
} | |
func vend(itemNamed name: String) throws { | |
let item = try validatedItemNamed(name) | |
reduceDepositedCoinsBy(item.price) | |
removeFromInventory(item, name: name) | |
dispense(name) | |
} | |
private func validatedItemNamed(name: String) throws -> Item { | |
let item = try itemNamed(name) | |
try validate(item) | |
return item | |
} | |
private func reduceDepositedCoinsBy(price: Int) { | |
coinsDeposited -= price | |
} | |
private func removeFromInventory(var item: Item, name: String) { | |
--item.count | |
inventory[name] = item | |
} | |
private func itemNamed(name: String) throws -> Item { | |
if let item = inventory[name] { | |
return item | |
} else { | |
throw VendingMachineError.InvalidSelection | |
} | |
} | |
private func validate(item: Item) throws { | |
try validateCount(item.count) | |
try validatePrice(item.price) | |
} | |
private func validateCount(count: Int) throws { | |
if count == 0 { | |
throw VendingMachineError.OutOfStock | |
} | |
} | |
private func validatePrice(price: Int) throws { | |
if coinsDeposited < price { | |
throw VendingMachineError.InsufficientFunds(coinsNeeded: price - coinsDeposited) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment