Skip to content

Instantly share code, notes, and snippets.

@eugene70
Created June 5, 2020 13:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eugene70/bd805db52863e54f7bc2144d954aebe5 to your computer and use it in GitHub Desktop.
Save eugene70/bd805db52863e54f7bc2144d954aebe5 to your computer and use it in GitHub Desktop.
package ch2
import scala.collection.immutable.Queue
case class User(directFriends: Set[String] = Set.empty)
case class UserWorld(users: Map[String, User]) {
def befriend(user1: String, user2: String): UserWorld = {
val u1 = users(user1)
val u2 = users(user2)
UserWorld(users
.updated(user1, User(u1.directFriends + user2))
.updated(user2, User(u2.directFriends + user1))
)
}
def isDirectFriendOf(user1: String, user2: String): Boolean =
users(user1).directFriends.contains(user2)
def isIndirectFriendOf(user1: String, user2: String): Boolean = {
@annotation.tailrec
def loop(visited: Set[String], queue: Queue[String]): Boolean = queue.headOption match {
case None => false
case Some(user2) => true
case Some(user) => loop(visited + user, queue ++ users(user).directFriends)
}
loop(Set.empty, Queue(user1))
}
}
object UserWorld extends App{
val world = UserWorld(Map(
"Abel" -> User(),
"Bob" -> User(),
"Carl" -> User(),
"Danielle" -> User(),
"Emily" -> User(),
))
val world1 = world
.befriend("Abel", "Bob")
.befriend("Abel", "Carl")
.befriend("Danielle", "Carl")
.befriend("Emily", "Abel")
println(world1.isDirectFriendOf("Bob", "Carl"))
println(world1.isIndirectFriendOf("Bob", "Carl"))
println(world1.isIndirectFriendOf("Bob", "Danielle"))
println(world1.isIndirectFriendOf("Bob", "Emily"))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment