kenbot / goggles

Pleasant, yet principled Scala optics DSL
MIT License
196 stars 7 forks source link

Unclear CTE using `set"..." ~= { ... }` with a generic case class #41

Open oleg-py opened 6 years ago

oleg-py commented 6 years ago

I was trying to use goggles to modify a value inside a case class with a type parameter (type parameters should remain the same).

Simplified, code like this:

import goggles._
case class Boxed[+A](get: A)
set"${Boxed(1)}.get" ~= { _ + 1 }

results in following error:

The types of consecutive sections don't match.
 found   : Playground.this.Boxed[Int]
 required: Playground.this.Boxed[Int] 

 Sections │ Types            │ Optics 
──────────┼──────────────────┼────────
 $        │ Boxed[Int]       │        
 .get     │ Boxed[Int]  ⇒  A │ Setter

while I would expect Boxed(2), it would be nice even if compile-time error was less misleading.

kenbot commented 6 years ago

Good catch, thanks for the report! It works if the case class doesn't have type parameters, so clearly it's choking on the generics.

scala> case class BoxI(get: Int)
defined class BoxI

scala> set"${BoxI(1)}.get" ~= { _ + 1 }
res5: BoxI = BoxI(2)