derivation

Diffx supports auto and semi-auto derivation.

For semi-auto derivation you don’t need any additional import, just define your instances using:

import com.softwaremill.diffx._
case class Product(name: String)
case class Basket(products: List[Product])

implicit val productDiff = Diff.derived[Product]
implicit val basketDiff = Diff.derived[Basket]

To use auto derivation add following import

import com.softwaremill.diffx.generic.auto._

or extend trait

com.softwaremill.diffx.generic.auto.AutoDerivation

Auto derivation might have a huge impact on compilation times, because of that it is recommended to use semi-auto derivation.

Given that you have auto-derivation enabled you can summon diff instances as you would summon any other implicit type-class by using implictly[Diff[T]]. You can also write a shorter version Diff[T] which will be equivalent. However, if you would like to modify somehow (see ignoring and modifying) given instance and put it back into to the implicit scope:

implict val diffForMyClass: Diff[MyClass] = Diff[MyClass].doSomething

you will get a forward reference error.

To overcome that issue there is a Derived wrapper which allows you to summon a wrapped instance.

implict val diffForMyClass: Diff[MyClass] = implicitly[Derived[Diff[MyClass]]].value.doSomething

There is a summon method to make it more convenient. Below code is equivalent to the one above.

implict val diffForMyClass: Diff[MyClass] = Diff.summon[MyClass].doSomething