    module Network.Wreq.Lens.Machinery
        (
          makeLenses
        , fieldName
        , toCamelCase
        ) where

    import Control.Lens ((&), (.~))
    import Control.Lens.TH hiding (makeLenses)
    import Data.Char (toUpper)
    import Language.Haskell.TH.Syntax (Dec, Name, Q, mkName, nameBase)

    defaultRules :: LensRules
    defaultRules = lensRules

    fieldName :: (String -> String) -> Name -> [Name] -> Name -> [DefName]
    fieldName f _ _ name = [TopName . mkName . f . nameBase $ name]

    makeLenses :: Name -> Q [Dec]
    makeLenses = makeLensesWith (defaultRules & lensField .~ fieldName id)

    toCamelCase :: String -> String
    toCamelCase (x0:x0s)  = x0 : go x0s
      where go ('_':x:xs) = toUpper x : go xs
            go (x:xs)     = x : go xs
            go []         = []
    toCamelCase []        = []