Immutable Data Patterns
Comparing Versions
Check what changed between two immutable values.
compare-versions
Because the original is unchanged, code can compare the old and new values field by field and report what changed with boolean labels.
Comparing Versions
CompareVersions.scala
Replay: real traced execution (multi-file project)
case class Config(retries: Int, verbose: Boolean)
object Main {
def main(args: Array[String]): Unit = {
val retries = 3
val base = Config(2, false)
val updated = base.copy(retries = retries)
val changed = base.retries != updated.retries
val sameVerbose = base.verbose == updated.verbose
println("baseRetries=" + base.retries)
println("updatedRetries=" + updated.retries)
println("changed=" + changed)
println("sameVerbose=" + sameVerbose)
}
}
case class Config(retries: Int, verbose: Boolean)
object Main {
def main(args: Array[String]): Unit = {
val retries = 2
val base = Config(2, false)
val updated = base.copy(retries = retries)
val changed = base.retries != updated.retries
val sameVerbose = base.verbose == updated.verbose
println("baseRetries=" + base.retries)
println("updatedRetries=" + updated.retries)
println("changed=" + changed)
println("sameVerbose=" + sameVerbose)
}
}
case class Config(retries: Int, verbose: Boolean)
object Main {
def main(args: Array[String]): Unit = {
val retries = 5
val base = Config(2, false)
val updated = base.copy(retries = retries)
val changed = base.retries != updated.retries
val sameVerbose = base.verbose == updated.verbose
println("baseRetries=" + base.retries)
println("updatedRetries=" + updated.retries)
println("changed=" + changed)
println("sameVerbose=" + sameVerbose)
}
}
retries ← 3, base ← Config(2,false), updated ← Config(3,false)
3object Main {4 def main(args: Array[String]): Unit = {5 val retries→ 3 = 3 //@retries=2, 56 val base→ Config(2,false) = Config(2, false)7 val updated→ Config(3,false) = baseConfig(2,false).copy(retries→ 3 = retries)8 val changed→ true = baseConfig(2,false).retries != updated.retries39 val sameVerbose→ true = baseConfig(2,false).verbose == updated.verbosefalse1011 println("baseRetries=" + base.retries2)12 println("updatedRetries=" + updated.retries3)13 println("changed=" + changedtrue)14 println("sameVerbose=" + sameVerbosetrue)15 }16}outputbaseRetries=2 updatedRetries=3 changed=true sameVerbose=true
retries ← 2, base ← Config(2,false), updated ← Config(2,false)
3object Main {4 def main(args: Array[String]): Unit = {5 val retries→ 2 = 26 val base→ Config(2,false) = Config(2, false)7 val updated→ Config(2,false) = baseConfig(2,false).copy(retries→ 2 = retries)8 val changed→ false = baseConfig(2,false).retries != updated.retries29 val sameVerbose→ true = baseConfig(2,false).verbose == updated.verbosefalse1011 println("baseRetries=" + base.retries2)12 println("updatedRetries=" + updated.retries2)13 println("changed=" + changedfalse)14 println("sameVerbose=" + sameVerbosetrue)15 }16}outputbaseRetries=2 updatedRetries=2 changed=false sameVerbose=true
retries ← 5, base ← Config(2,false), updated ← Config(5,false)
3object Main {4 def main(args: Array[String]): Unit = {5 val retries→ 5 = 56 val base→ Config(2,false) = Config(2, false)7 val updated→ Config(5,false) = baseConfig(2,false).copy(retries→ 5 = retries)8 val changed→ true = baseConfig(2,false).retries != updated.retries59 val sameVerbose→ true = baseConfig(2,false).verbose == updated.verbosefalse1011 println("baseRetries=" + base.retries2)12 println("updatedRetries=" + updated.retries5)13 println("changed=" + changedtrue)14 println("sameVerbose=" + sameVerbosetrue)15 }16}outputbaseRetries=2 updatedRetries=5 changed=true sameVerbose=true