module Control.Lens.Named
    ( -- * Lens rules
      lensAppend
    , lensModify
    -- * Splices
    , makeLensesModified
    , makeLensesAppend
    ) where

import           Control.Lens
import           Data.Semigroup             (Semigroup (..))
import           Language.Haskell.TH.Syntax

-- | Generate simple lenses.
lensModify :: (String -> String) -> LensRules
lensModify f = lensRules & lensField .~ mappingNamer (pure . f)

-- | Create lenses by changing @fieldName@ to @fieldNameLens@.
lensAppend :: LensRules
lensAppend = lensModify (<> "Lens")

makeLensesModified :: (String -> String) -> Name -> Q [Dec]
makeLensesModified = makeLensesWith . lensModify

-- | Works like 'makeLenses'
makeLensesAppend :: Name -> Q [Dec]
makeLensesAppend = makeLensesWith lensAppend