armanbilge/calico

Should `Modifier` be a typeclass?

armanbilge opened this issue · 0 comments

The reasons I originally chose this design were:

  • anything can be a Modifier (such as a String, HtmlElement[IO], or Signal) without requiring implicit conversions, that are discouraged in Scala 3
  • typeclasses are more the Typelevel way

But there are some trade-offs:

  • they require the shapeless magic to work, so when you get it wrong the compiler errors can be quite intimidating and confusing
  • typeclasses are harder to understand, and take more boilerplate to implement your own instances. see also:
    #203
  • furthermore, they are harder to pass around. for example this is impossible
    def MyComponent(mods: Mod[HtmlElement]*) = 
      div(
        cls := "decoration",
        mods
      )
    It is slightly mitigated by changes in:
    #199
    But still not so convenient.