lens-family-th 0.1.0.0 → 0.2.0.0
raw patch · 4 files changed
+91/−30 lines, 4 filesdep ~template-haskellPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: template-haskell
API changes (from Hackage documentation)
+ Lens.Family.TH: mkLensesFor :: [(String, String)] -> Name -> Q [Dec]
+ Lens.Family2.TH: mkLensesFor :: [(String, String)] -> Name -> Q [Dec]
- Lens.Family.TH: mkLensesBy :: (String -> String) -> Name -> Q [Dec]
+ Lens.Family.TH: mkLensesBy :: (String -> Maybe String) -> Name -> Q [Dec]
- Lens.Family.THCore: defaultNameTransform :: String -> String
+ Lens.Family.THCore: defaultNameTransform :: String -> Maybe String
- Lens.Family.THCore: deriveLenses :: (Name -> LensTypeInfo -> ConstructorFieldInfo -> Q [Dec]) -> (String -> String) -> Name -> Q [Dec]
+ Lens.Family.THCore: deriveLenses :: (Name -> LensTypeInfo -> ConstructorFieldInfo -> Q [Dec]) -> (String -> Maybe String) -> Name -> Q [Dec]
- Lens.Family2.TH: mkLensesBy :: (String -> String) -> Name -> Q [Dec]
+ Lens.Family2.TH: mkLensesBy :: (String -> Maybe String) -> Name -> Q [Dec]
Files
- Lens/Family/TH.hs +32/−5
- Lens/Family/THCore.hs +16/−11
- Lens/Family2/TH.hs +32/−5
- lens-family-th.cabal +11/−9
Lens/Family/TH.hs view
@@ -5,16 +5,20 @@ -- Example usage: -- -- --- > {-# LANGUAGE TemplateHaskell -#}+-- > {-# LANGUAGE TemplateHaskell #-} -- > -- > import Lens.Family -- > import Lens.Family.TH -- > -- > data Foo a = Foo { _bar :: Int, _baz :: a }--- > deriving (Show, Read, Eq, ord)+-- > deriving (Show, Read, Eq, Ord) -- > $(mkLenses ''Foo) -- -module Lens.Family.TH (mkLenses, mkLensesBy) where+module Lens.Family.TH (+ mkLenses+ , mkLensesBy+ , mkLensesFor+ ) where import Language.Haskell.TH import Lens.Family.THCore@@ -23,12 +27,35 @@ -- | Derive lenses for the record selectors in -- a single-constructor data declaration, -- or for the record selector in a newtype declaration.+-- Lenses will only be generated for record fields which+-- are prefixed with an underscore.+-- +-- Example usage:+-- +-- $(mkLenses ''Foo) mkLenses :: Name -> Q [Dec] mkLenses = mkLensesBy defaultNameTransform --- | Derive lenses with the provided name transformation function.-mkLensesBy :: (String -> String) -> Name -> Q [Dec]++-- | Derive lenses with the provided name transformation+-- and filtering function. Produce @Just lensName@ to generate a lens+-- of the resultant name, or @Nothing@ to not generate a lens+-- for the input record name.+-- +-- Example usage:+-- +-- > $(mkLensesBy (\n -> Just (n ++ "L")) ''Foo)+mkLensesBy :: (String -> Maybe String) -> Name -> Q [Dec] mkLensesBy = deriveLenses deriveLensSig+++-- | Derive lenses, specifying explicit pairings of @(fieldName, lensName)@.+-- +-- Example usage:+-- +-- > $(mkLensesFor [("_foo", "fooLens"), ("bar", "lbar")] ''Foo)+mkLensesFor :: [(String, String)] -> Name -> Q [Dec]+mkLensesFor fields = mkLensesBy (`lookup` fields) -- TODO
Lens/Family/THCore.hs view
@@ -13,11 +13,12 @@ -- | By default, if the field name begins with an underscore, -- then the underscore will simply be removed (and the new first character--- lowercased if necessary). Otherwise, the suffix "Lens" will be added.-defaultNameTransform :: String -> String-defaultNameTransform ('_':c:rest) = toLower c : rest-defaultNameTransform n = n ++ "Lens"+-- lowercased if necessary).+defaultNameTransform :: String -> Maybe String+defaultNameTransform ('_':c:rest) = Just $ toLower c : rest+defaultNameTransform _ = Nothing + -- | Information about the larger type the lens will operate on. type LensTypeInfo = (Name, [TyVarBndr]) @@ -27,11 +28,12 @@ -- | The true workhorse of lens derivation. This macro is parameterized -- by a macro that derives signatures, as well as a function that--- transforms names.+-- filters and transforms names. Producing Nothing means that+-- a lens should not be generated for the provided name. deriveLenses :: (Name -> LensTypeInfo -> ConstructorFieldInfo -> Q [Dec]) -- ^ the signature deriver- -> (String -> String)+ -> (String -> Maybe String) -- ^ the name transformer -> Name -> Q [Dec] deriveLenses sigDeriver nameTransform datatype = do@@ -75,15 +77,18 @@ -- Derive a lens for the given record selector -- using the given name transformation function. deriveLens :: (Name -> LensTypeInfo -> ConstructorFieldInfo -> Q [Dec])- -> (String -> String)+ -> (String -> Maybe String) -> LensTypeInfo -> ConstructorFieldInfo -> Q [Dec] deriveLens sigDeriver nameTransform ty field = do let (fieldName, _fieldStrict, _fieldType) = field (_tyName, _tyVars) = ty -- just to clarify what's here- lensName = mkName $ nameTransform $ nameBase fieldName- sig <- sigDeriver lensName ty field- body <- deriveLensBody lensName fieldName- return $ sig ++ [body]+ case nameTransform (nameBase fieldName) of+ Nothing -> return []+ Just lensNameStr -> do+ let lensName = mkName lensNameStr+ sig <- sigDeriver lensName ty field+ body <- deriveLensBody lensName fieldName+ return $ sig ++ [body] -- Given a record field name,
Lens/Family2/TH.hs view
@@ -5,16 +5,20 @@ -- Example usage: -- -- --- > {-# LANGUAGE TemplateHaskell, Rank2Types -#}+-- > {-# LANGUAGE TemplateHaskell, Rank2Types #-} -- > -- > import Lens.Family2 -- > import Lens.Family2.TH -- > -- > data Foo a = Foo { _bar :: Int, _baz :: a }--- > deriving (Show, Read, Eq, ord)+-- > deriving (Show, Read, Eq, Ord) -- > $(mkLenses ''Foo) -- -module Lens.Family2.TH (mkLenses, mkLensesBy) where+module Lens.Family2.TH (+ mkLenses+ , mkLensesBy+ , mkLensesFor+ ) where import Language.Haskell.TH import Lens.Family.THCore@@ -23,12 +27,35 @@ -- | Derive lenses for the record selectors in -- a single-constructor data declaration, -- or for the record selector in a newtype declaration.+-- Lenses will only be generated for record fields which+-- are prefixed with an underscore.+-- +-- Example usage:+-- +-- $(mkLenses ''Foo) mkLenses :: Name -> Q [Dec] mkLenses = mkLensesBy defaultNameTransform --- | Derive lenses with the provided name transformation function.-mkLensesBy :: (String -> String) -> Name -> Q [Dec]++-- | Derive lenses with the provided name transformation+-- and filtering function. Produce @Just lensName@ to generate a lens+-- of the resultant name, or @Nothing@ to not generate a lens+-- for the input record name.+-- +-- Example usage:+-- +-- > $(mkLensesBy (\n -> Just (n ++ "L")) ''Foo)+mkLensesBy :: (String -> Maybe String) -> Name -> Q [Dec] mkLensesBy = deriveLenses deriveLensSig+++-- | Derive lenses, specifying explicit pairings of @(fieldName, lensName)@.+-- +-- Example usage:+-- +-- > $(mkLensesFor [("_foo", "fooLens"), ("bar", "lbar")] ''Foo)+mkLensesFor :: [(String, String)] -> Name -> Q [Dec]+mkLensesFor fields = mkLensesBy (`lookup` fields) -- TODO
lens-family-th.cabal view
@@ -1,33 +1,35 @@ name: lens-family-th-version: 0.1.0.0-synopsis: Template Haskell to generate lenses for- lens-family and lens-family-core+version: 0.2.0.0+synopsis: Generate lens-family style lenses description: Due to a cabal/hackage defect, curly braces cannot be adequately displayed here. Please see <http://github.com/DanBurton/lens-family-th#readme>- for a proper description.+ for a proper description of this package. . (See <https://github.com/haskell/cabal/issues/968> for the ticket I created regarding the defect.) --homepage: http://github.com/DanBurton/lens-family-th license: BSD3 license-file: LICENSE author: Dan Burton-maintainer: danburton.email@gmail.com copyright: (c) Dan Burton 2012 +homepage: http://github.com/DanBurton/lens-family-th#readme+bug-reports: http://github.com/DanBurton/lens-family-th/issues+maintainer: danburton.email@gmail.com++ category: Data build-type: Simple cabal-version: >=1.8 library exposed-modules: Lens.Family.TH, Lens.Family2.TH, Lens.Family.THCore- build-depends: base ==4.*, template-haskell ==2.7.*+ build-depends: base ==4.*, template-haskell >= 2.5 && < 2.8 + source-repository head type: git location: git://github.com/DanBurton/lens-family-th.git@@ -35,4 +37,4 @@ source-repository this type: git location: git://github.com/DanBurton/lens-family-th.git- tag: lens-family-th-0.1.0.0+ tag: lens-family-th-0.2.0.0