Last active
June 26, 2020 11:58
-
-
Save tomatophobia/7584cca459aae1315a3ec7e8eb49e2c0 to your computer and use it in GitHub Desktop.
This file contains 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
package Speed | |
case class World(containers: Map[Symbol, Container]) { | |
def getAmount(key: Symbol): Double = { | |
containers(key).group.amountPerContainer | |
} | |
def addWater(key: Symbol, amount: Double): World = { | |
val group = containers(key).group | |
val members = group.members | |
val amountPerContainer = amount / members.size | |
val group1 = group.copy(amountPerContainer = group.amountPerContainer + amountPerContainer) | |
World(members.foldLeft(containers){ (containers, member) => | |
containers.updated(member, Container(group1)) | |
}) | |
} | |
def connetTo(key1: Symbol, key2: Symbol): World = { | |
val group1 = containers(key1).group | |
val group2 = containers(key2).group | |
if (group1 == group2) this | |
else { | |
val size1: Int = group1.members.size | |
val size2: Int = group2.members.size | |
val tot1: Double = group1.amountPerContainer * size1 | |
val tot2: Double = group2.amountPerContainer * size2 | |
val newAmount: Double = (tot1 + tot2) / (size1 + size2) | |
val newGroup: Group = Group(newAmount, group1.members ++ group2.members) | |
World(newGroup.members.foldLeft(containers){ (containers, member) => | |
containers.updated(member, Container(newGroup)) | |
}) | |
} | |
} | |
} | |
case class Container(group: Group) | |
object Container { | |
def apply(name: Symbol): Container = Container(Group(0.0, Set(name))) | |
} | |
case class Group(amountPerContainer: Double, members: Set[Symbol]) | |
object Speed1 extends App { | |
val world = World(Map( | |
'a -> Container('a), | |
'b -> Container('b), | |
'c -> Container('c), | |
'd -> Container('d), | |
)) | |
val world1 = world | |
.addWater('a, 12) | |
.addWater('d, 8) | |
.connetTo('a, 'b) | |
.connetTo('b, 'c) | |
println(world1) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment