guibou / PyF

Haskell QuasiQuoter for String Formatting
BSD 3-Clause "New" or "Revised" License
66 stars 13 forks source link

Provide my own formatting of types via custom typeclass #91

Open Profpatsch opened 2 years ago

Profpatsch commented 2 years ago

I want to make it possible to have a simple derive clause for a newtype like

newtype Username = Username Text
  deriving newtype FormatQuote

and then automatically have that type implement PyFToString and all relevant mechanisms, so that when I write

let u = Username "myuser"
in [fmt|There was a problem with user {u}!|]

it will use a magical formatting that we define somehow, and the result will be:

There was a problem with user "myuser"

where the quotes get automatically added by the way FormatQuote is implemented.

I don’t know if this is possible at all, but it would be cool to have somehow.

I guess the closest is the following snippet:

class FormatQuote a where
  q :: a -> FormatQuoteT

instance FormatQuote Text where
  q t = FormatQuoteT $ textToString t

newtype FormatQuoteT = FormatQuoteT String

type instance PyF.PyFClassify FormatQuoteT = 'PyF.PyFString

instance PyF.PyFToString FormatQuoteT where
  pyfToString (FormatQuoteT s) =  "\"" <> s <> "\""

which lets me do

let u = Username "myuser" in [fmt|{q u}|]
"\"myuser\""

however, this means I always have to remember to use q and also the q symbol is not available in any of my code.

guibou commented 2 years ago

Hi @Profpatsch, thank you for this issue (and sorry for my silence).

I will have a look. Right now you need to make instances for a few classes / type families, but maybe we can do better.