packages feed

fb-util-0.1.0.1: Util/Lens.hs

{-
  Copyright (c) Meta Platforms, Inc. and affiliates.
  All rights reserved.

  This source code is licensed under the BSD-style license found in the
  LICENSE file in the root directory of this source tree.
-}

module Util.Lens
  ( lowerCamelCaseLensRules
  , makeLowerCCLenses
  ) where

import Control.Lens
import Data.Char
import Data.List.Split
import Language.Haskell.TH


-- | Rules for makin lower camel case lenses
-- lf_name becomes lfName
lowerCamelCaseLensRules :: LensRules
lowerCamelCaseLensRules = lensRules & lensField .~ lowerCamelCaseNamer
  where
  lowerCamelCase = concat . (_tail %~ map (_head %~ toUpper)) . splitOn "_"
  lowerCamelCaseNamer _ _ n =
    case nameBase n of
      ('_':_) -> []
      field -> [ TopName $ mkName $ lowerCamelCase field ]

-- | Make lower camel case lenses
-- lf_name becomes lfName
makeLowerCCLenses :: Name -> DecsQ
makeLowerCCLenses = makeLensesWith lowerCamelCaseLensRules