Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active March 17, 2017 00:02
Show Gist options
  • Save j5ik2o/0cfc73a7c1c10729525de91efd5c70d5 to your computer and use it in GitHub Desktop.
Save j5ik2o/0cfc73a7c1c10729525de91efd5c70d5 to your computer and use it in GitHub Desktop.
case class Administrators(userId: Long, userIds: Seq[Long])
case class Member(userId: Long, byAdministratorId: Option[Long] = None)
case class Memebers(userIds: Seq[Member])
case class Message(id: Long, value: String, senderId: Long)
case class Messages(values: Seq[Message])
case class ChatRoom(id: Long,
administrators: Administrators,
members: Members = Members.empty,
messsages: Messages = Messages.empty) {
def isAddedMessage(id: Long, message: String, bySenderId: Long): ChatRoom =
copy(messages = messages append Message(id, messages, senderId)
def latestMessages: Messages = messages.withLatest
def addAdministrator(userId: Long, by: Long): (ChatRoom, ) = {
require(containsAdministrator(by))
val newAdminisrator = Administrator(userId, Some(by))
val newChatRoom = copy(administrators = administrators append newAdminisrator)
(newChatRoom, newAdminisrator)
}
def removeAdministrator(userId: Long, by: Long): ChatRoom = {
require(containsAdministrator(by))
val newAdminisrator = Administrator(userId, Some(by))
val newChatRoom = copy(administrators = administrators append Administrator(userId, Some(by))
(newChatRoom, newAdminisrator)
}
def isAddedMember(userId: Long, by: Long): (ChatRoom, Member) = {
require(containsMember(by))
val newMember = Member(userId, Some(by))
val newChatRoom = copy(members = members append Member(userId, Some(by)))
(newChatRoom, newMember)
}
def removeMember(userId: Long, by: Long): ChatRoom = {
require(containsInAdministrator(by))
copy(members = members removeBy userId)
}
def isJoinedBy(userId: Long): ChatRoom = {
require(roomType.isPublicType)
copy(members = members append Member(userId))
}
def isLeavedBy(userId: Long): ChatRoom = {
require(containsMembers(userId))
copy(members = members removeBy userId)
}
}
val room = ChatRoom(1L, Administrator(userId1))
.isAddedMember(userId2, by = userId1)
val updatedRoom = room.isAddedMessage(1L, "Hi!", bySenderId = userId2)
val messageOnTimeLine = updatedRoom.latestMessages
val (updatedRoom1, member1) = room isAdded Member(userId1, by = admin1)
val (updatedRoom2, message1) = updatedRoom1 isAdded Message("Hi!", by = member1)
val latestMessages = updatedRoom2.latestMessages
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment