The code I introduced in #68 is pretty gross. I don't really know how to make it better.
There are two things in particular I want to make better:
Use some kind of map to reduce duplication in Strive.Internal.Lenses. Check it out: https://github.com/tfausak/strive/blob/50e20c41d1703ffec32af5f674badc3856635388/library/Strive/Internal/Lenses.hs#L16-L64.
Use quasi quotes to make template Haskell less verbose. This is crazy: https://github.com/tfausak/strive/blob/50e20c41d1703ffec32af5f674badc3856635388/library/Strive/Internal/TH.hs#L101-L104.
I think the things in Control.Monad will come in handy.
Making multiple lenses at the same time is going to be kind of difficult, since I have to only define each lens class once. I might need to do two passes; one to collect the fields and another to define the unique classes.
Since this will be an internal change, it shouldn't hold up the v1.0.0 release.
I think makeFields will do what I want.
Oh, right. I don't depend on lens. And microlens-th's makeFields doesn't handle multiple classes automatically.