Skip to content

Instantly share code, notes, and snippets.

@fsarradin
Last active December 11, 2015 06:38
Show Gist options
  • Save fsarradin/4560554 to your computer and use it in GitHub Desktop.
Save fsarradin/4560554 to your computer and use it in GitHub Desktop.
Alice and the banks
object App {
val banks: Map[String, Set[Account]] = Map(
"BGP" -> Set(
Account("CC1", "BGP", "Alice", 5000)
),
"La Postale" -> Set(
Account("CP1", "La Postale", "Alice", 2000)
),
"Societe Geniale" -> Set(),
"Credit Rural" -> Set()
)
def main(args: Array[String]) {
val alice: String = "Alice"
val bankRepository: BankRepository = new BankRepository(banks)
val result = bankRepository.bankNames.map(bank =>
bankRepository.findAccountNumbers(bank, alice).map(numbers =>
numbers.map(number =>
bankRepository.findAccount(bank, number).map(account =>
account.balance))))
println(result)
}
}
case class Account(number: String, bank: String, owner: String, balance: Double)
class BankRepository(banks: Map[String, Set[Account]]) {
def bankNames: Set[String] = (for {
bank <- banks.keys
} yield bank).toSet
def findAccountNumbers(bank: String, owner: String): Option[Set[String]] =
banks.get(bank).map(_
.filter(_.owner == owner)
.map(_.number))
def findAccount(bank: String, number: String): Option[Account] =
banks.get(bank).map(_.filter(_.number == number)).flatMap {
accounts => if (accounts.isEmpty) None
else Some(accounts.head)
}
}
@jto
Copy link

jto commented Jan 23, 2013

Hello

je ferais comme ca

case class Account(number: String, bank: String, owner: String, balance: Double)

class BankRepository(banks: Map[String, Set[Account]]) {

  def bankNames: Set[String] = banks.keys.toSet

  def findAccountNumbers(bank: String, owner: String): Set[String] =
    banks.get(bank).toSet.flatten.filter(_.owner == owner).map(_.number)

  def findAccount(bank: String, number: String): Option[Account] =
    banks.get(bank).toSet.flatten.find(_.number == number)
}

object App {

  val banks: Map[String, Set[Account]] = Map(
    "BGP" -> Set(
      Account("CC1", "BGP", "Alice", 5000)
    ),
    "La Postale" -> Set(
      Account("CP1", "La Postale", "Alice", 2000)
    ),
    "Societe Geniale" -> Set(),
    "Credit Rural" -> Set()
  )

  def main {
    val alice: String = "Alice"
    val bankRepository: BankRepository = new BankRepository(banks)

    val as = for(
      bank <- bankRepository.bankNames;
      n <- bankRepository.findAccountNumbers(bank, alice);
      accounts <- bankRepository.findAccount(bank, n)
    ) yield accounts

    println(as) // Set(Account(CC1,BGP,Alice,5000.0), Account(CP1,La Postale,Alice,2000.0))
  }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment