hasbolt-extras 0.0.0.24 → 0.0.0.25
raw patch · 3 files changed
+33/−14 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Database.Bolt.Extras.Template: makeNodeLikeWith :: Name -> (String -> String) -> Q [Dec]
+ Database.Bolt.Extras.Template: makeURelationLikeWith :: Name -> (String -> String) -> Q [Dec]
- Database.Bolt.Extras.Graph: relations :: forall n_abg5 a_abg6 b_abg7 b_al9U. Lens (Graph n_abg5 a_abg6 b_abg7) (Graph n_abg5 a_abg6 b_al9U) (Map (n_abg5, n_abg5) b_abg7) (Map (n_abg5, n_abg5) b_al9U)
+ Database.Bolt.Extras.Graph: relations :: forall n_abgy a_abgz b_abgA b_alaP. Lens (Graph n_abgy a_abgz b_abgA) (Graph n_abgy a_abgz b_alaP) (Map (n_abgy, n_abgy) b_abgA) (Map (n_abgy, n_abgy) b_alaP)
- Database.Bolt.Extras.Graph: vertices :: forall n_abg5 a_abg6 b_abg7 a_al9V. Lens (Graph n_abg5 a_abg6 b_abg7) (Graph n_abg5 a_al9V b_abg7) (Map n_abg5 a_abg6) (Map n_abg5 a_al9V)
+ Database.Bolt.Extras.Graph: vertices :: forall n_abgy a_abgz b_abgA a_alaQ. Lens (Graph n_abgy a_abgz b_abgA) (Graph n_abgy a_alaQ b_abgA) (Map n_abgy a_abgz) (Map n_abgy a_alaQ)
Files
- CHANGELOG.md +4/−0
- hasbolt-extras.cabal +1/−1
- src/Database/Bolt/Extras/Template/Internal/Converters.hs +28/−13
CHANGELOG.md view
@@ -6,6 +6,10 @@ ## [Unreleased] +## [0.0.0.25] - 2019-12-07+### Added+- `makeNodeLikeWith` and `makeURelationLikeWith` functions.+ ## [0.0.0.24] - 2019-11-08 ### Added - Support for `Maybe` fields in typed selectors;
hasbolt-extras.cabal view
@@ -1,5 +1,5 @@ name: hasbolt-extras-version: 0.0.0.24+version: 0.0.0.25 synopsis: Extras for hasbolt library description: Extras for hasbolt library homepage: https://github.com/biocad/hasbolt-extras#readme
src/Database/Bolt/Extras/Template/Internal/Converters.hs view
@@ -4,7 +4,9 @@ module Database.Bolt.Extras.Template.Internal.Converters ( makeNodeLike+ , makeNodeLikeWith , makeURelationLike+ , makeURelationLikeWith ) where import Control.Lens (view, _1)@@ -75,16 +77,28 @@ -- > Bar {baz = 42.0, quux = "Loren ipsum", quuz = 7} -- makeNodeLike :: Name -> Q [Dec]-makeNodeLike = makeBiClassInstance nodeLikeClass+makeNodeLike name = makeBiClassInstance nodeLikeClass name id +-- | The same as 'makeNodeLike', but applies a function to all field names before storing them+-- in Neo4j, like @aeson@ does.+--+-- This can be used with @fieldLabelModifier@ from 'Data.Aeson.Types.Options' in @aeson@:+--+-- > makeNodeLikeWith ''Foo $ fieldLabelModifier $ aesonPrefix camelCase+--+makeNodeLikeWith :: Name -> (String -> String) -> Q [Dec]+makeNodeLikeWith = makeBiClassInstance nodeLikeClass -- | Make an instance of 'URelationLike' class. -- Transformations are the same as in 'NodeLike' instance declaration with the only one difference: -- 'URelationship' holds only one label (or type), but 'Node' holds list of labels. -- makeURelationLike :: Name -> Q [Dec]-makeURelationLike = makeBiClassInstance uRelationLikeClass+makeURelationLike name = makeBiClassInstance uRelationLikeClass name id +-- | As 'makeNodeLikeWith'.+makeURelationLikeWith :: Name -> (String -> String) -> Q [Dec]+makeURelationLikeWith = makeBiClassInstance uRelationLikeClass -- | Declare an instance of `bijective` class using TemplateHaskell. -- It works as follows:@@ -115,8 +129,8 @@ -- > , nodeProps = fromList [("specie", T "text value"), ("vgen", F %float_value), ("fr", F %float_value), ("sim", F %float_value), ("germline", T "text value")] -- > } ---makeBiClassInstance :: BiClassInfo -> Name -> Q [Dec]-makeBiClassInstance BiClassInfo {..} typeCon = do+makeBiClassInstance :: BiClassInfo -> Name -> (String -> String) -> Q [Dec]+makeBiClassInstance BiClassInfo {..} typeCon fieldLabelModifier = do -- reify function gives Info about Name such as constructor name and its fields. See: https://hackage.haskell.org/package/template-haskell-2.12.0.0/docs/Language-Haskell-TH.html#t:Info TyConI declaration <- reify typeCon @@ -136,8 +150,8 @@ fresh <- newName "x" -- constructs `bijective` class functions (phi and phiInv – toClause and fromClause correspondingly here).- toClause <- makeToClause label dataName fresh dataFields- fromClause <- makeFromClause label consName fresh dataFields+ toClause <- makeToClause label dataName fresh dataFields fieldLabelModifier+ fromClause <- makeFromClause label consName fresh dataFields fieldLabelModifier -- function declarations themselves. let bodyDecl = [FunD classToFun [toClause], FunD classFromFun [fromClause]]@@ -166,9 +180,10 @@ -- | Describes the body of conversion to target type function. ---makeToClause :: String -> Name -> Name -> [Name] -> Q Clause-makeToClause label dataCons varName dataFields | null dataFields = pure $ Clause [WildP] (NormalB result) []- | otherwise = pure $ Clause [VarP varName] (NormalB result) []+makeToClause :: String -> Name -> Name -> [Name] -> (String -> String) -> Q Clause+makeToClause label dataCons varName dataFields fieldLabelModifier+ | null dataFields = pure $ Clause [WildP] (NormalB result) []+ | otherwise = pure $ Clause [VarP varName] (NormalB result) [] where -- apply field record to a data. getValue :: Name -> Exp@@ -189,7 +204,7 @@ -- `key` is field record name. -- `value` is the data that corresponding field holds. pairs :: [Exp]- pairs = zipWith (\fld val -> TupE [strToTextE fld, val]) fieldNames valuesExp+ pairs = zipWith (\fld val -> TupE [strToTextE $ fieldLabelModifier fld, val]) fieldNames valuesExp -- Map representation: -- mapE = fromList pairs@@ -215,8 +230,8 @@ -- | Describes the body of conversion from target type function. ---makeFromClause :: String -> Name -> Name -> [Name] -> Q Clause-makeFromClause label conName varName dataFields = do+makeFromClause :: String -> Name -> Name -> [Name] -> (String -> String) -> Q Clause+makeFromClause label conName varName dataFields fieldLabelModifier = do -- Obtain all data field types. -- 'reify' returns 'Q Info', and we are interested in its 'VarI' constructur which provides information about variable: name and type.@@ -228,7 +243,7 @@ -- fieldNames :: [Text] -- field records of the target type.- let fieldNames = fmap (pack . nameBase) dataFields+ let fieldNames = fmap (pack . fieldLabelModifier . nameBase) dataFields -- maybeLabels :: [(Text, Bool)] -- field records of the target type and 'isMaybe' check results.