    module Brick.Types.TH
      ( suffixLenses
      )
    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(..), 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 :: Name -> DecsQ
    suffixLenses = LensRules -> Name -> DecsQ
    makeLensesWith (LensRules -> Name -> DecsQ) -> LensRules -> Name -> DecsQ
    forall a b. (a -> b) -> a -> b
    $
      LensRules
    lensRules LensRules -> (LensRules -> LensRules) -> LensRules
    forall a b. a -> (a -> b) -> b
    & ((Name -> [Name] -> Name -> [DefName])
     -> Identity (Name -> [Name] -> Name -> [DefName]))
    -> LensRules -> Identity LensRules
    Lens' LensRules (Name -> [Name] -> Name -> [DefName])
    lensField (((Name -> [Name] -> Name -> [DefName])
      -> Identity (Name -> [Name] -> Name -> [DefName]))
     -> LensRules -> Identity LensRules)
    -> (Name -> [Name] -> Name -> [DefName]) -> LensRules -> LensRules
    forall s t a b. ASetter s t a b -> b -> s -> t
    .~ (\_ _ name :: Name
    name -> [Name -> DefName
    TopName (Name -> DefName) -> Name -> DefName
    forall a b. (a -> b) -> a -> b
    $ String -> Name
    TH.mkName (String -> Name) -> String -> Name
    forall a b. (a -> b) -> a -> b
    $ Name -> String
    TH.nameBase Name
    name String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ "L"])