{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE ViewPatterns #-} module TH where import Data.Char (toUpper) import Language.Haskell.TH.Lib (DecsQ) import Language.Haskell.TH.Syntax import Lens.Micro import Lens.Micro.TH hiding (makeLenses) makeLenses :: Name -> DecsQ makeLenses = makeLensesWith (camelCaseFields & set lensField (\_ _ (nameBase -> field@(x:xs)) -> let className :: String className = "Has" ++ (toUpper x : camel xs) camel :: String -> String camel "" = "" camel ('_':y:ys) = toUpper y : camel ys camel (y:ys) = y : camel ys in [MethodName (mkName className) (mkName field)]))