Actualice la clase de caso de JSON incompleto con Argonaut o Circe

Necesito crear una instancia actualizada desde una instancia de clase de caso (con cualquier necesariaDecodeJsons derivado implícitamente), dado un json incompleto (faltan algunos campos). ¿Cómo se puede lograr esto con Argonaut (preferiblemente) o Circe (si es necesario)?

Ejemplo:

case class Person(name:String, age:Int)
val person = Person("mr complete", 42)
val incompletePersonJson = """{"name":"mr updated"}"""
val updatedPerson = updateCaseClassFromIncompleteJson(person, incompletePersonJson)

println(updatedPerson)
//yields Person(mr updated, 42) 

Estoy bastante seguro de que tengo que analizar el json a json AST, luego convertirlo a ShapelessLabelledGeneric, luego use Shapeless update de alguna manera para actualizar la instancia de la clase de caso.

Editar 2

Después de leer la fuente sin forma, descubrí que puedo generar mi propio objeto "predeterminado". Logré crear una solución que requiere que la instancia de la clase de caso esté presente mientras analiza el json. Tenía la esperanza de evitar esto y en su lugar proporcionar la instancia, una vez más tarde. De todos modos aquí está:

import shapeless._
import argonaut._
import ArgonautShapeless._
import shapeless.ops.hlist.Mapper

case class Person(name: String, age: Int)

object MkDefault {

  object toSome extends Poly1 {
    implicit def default[P] = at[P](Some(_))
  }

  def apply[P, L <: HList, D <: HList]
  (p: P)
  (implicit
   g: Generic.Aux[P, L],
   mpr: Mapper.Aux[toSome.type, L, D]
  ): Default.Aux[P, mpr.Out] =
    Default.mkDefault[P, D](mpr(g.to(p)))
}


object Testy extends App {
    implicit val defs0 = MkDefault(Person("new name? NO", 42))
    implicit def pd = DecodeJson.of[Person]
    val i = """{"name":"Old Name Kept"}"""
    val pp = Parse.decodeOption[Person](i).get
    println(pp)
}

Esto producePerson(Old Name Kept,42).

Respuestas a la pregunta(2)

Su respuesta a la pregunta