brick-0.67: src/Brick/Types/TH.hs
module Brick.Types.TH
( suffixLenses
, suffixLensesWith
)
where
import qualified Language.Haskell.TH.Syntax as TH
import qualified Language.Haskell.TH.Lib as TH
import Lens.Micro ((&), (.~))
import Lens.Micro.TH (DefName(..), LensRules, makeLensesWith, lensRules, lensField)
-- | A template haskell function to build lenses for a record type. This
-- function differs from the 'Control.Lens.makeLenses' function in that
-- it does not require the record fields to be prefixed with underscores
-- and it adds an "L" suffix to lens names to make it clear that they
-- are lenses.
suffixLenses :: TH.Name -> TH.DecsQ
suffixLenses = suffixLensesWith "L" lensRules
-- | A more general version of 'suffixLenses' that allows customization
-- of the lens-building rules and allows customization of the suffix.
suffixLensesWith :: String -> LensRules -> TH.Name -> TH.DecsQ
suffixLensesWith suffix rs = makeLensesWith $
rs & lensField .~ (\_ _ name -> [TopName $ TH.mkName $ TH.nameBase name ++ suffix])