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

retries
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)
  }
}
  1. 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
  1. 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
  1. 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