diff options
Diffstat (limited to 'Types/MetaData.hs')
-rw-r--r-- | Types/MetaData.hs | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/Types/MetaData.hs b/Types/MetaData.hs index cf2811b22..198fe5d7d 100644 --- a/Types/MetaData.hs +++ b/Types/MetaData.hs @@ -36,8 +36,6 @@ module Types.MetaData ( metaDataValues, ModMeta(..), modMeta, - parseModMeta, - parseMetaData, prop_metadata_sane, prop_metadata_serialize ) where @@ -221,9 +219,13 @@ metaDataValues f (MetaData m) = fromMaybe S.empty (M.lookup f m) {- Ways that existing metadata can be modified -} data ModMeta = AddMeta MetaField MetaValue - | DelMeta MetaField MetaValue - | SetMeta MetaField MetaValue -- removes any existing values - | MaybeSetMeta MetaField MetaValue -- when field has no existing value + | DelMeta MetaField (Maybe MetaValue) + -- ^ delete value of a field. With Just, only that specific value + -- is deleted; with Nothing, all current values are deleted. + | SetMeta MetaField MetaValue + -- ^ removes any existing values + | MaybeSetMeta MetaField MetaValue + -- ^ set when field has no existing value deriving (Show) {- Applies a ModMeta, generating the new MetaData. @@ -231,7 +233,10 @@ data ModMeta - values set in the input metadata. It only contains changed values. -} modMeta :: MetaData -> ModMeta -> MetaData modMeta _ (AddMeta f v) = updateMetaData f v emptyMetaData -modMeta _ (DelMeta f oldv) = updateMetaData f (unsetMetaValue oldv) emptyMetaData +modMeta _ (DelMeta f (Just oldv)) = + updateMetaData f (unsetMetaValue oldv) emptyMetaData +modMeta m (DelMeta f Nothing) = MetaData $ M.singleton f $ + S.fromList $ map unsetMetaValue $ S.toList $ currentMetaDataValues f m modMeta m (SetMeta f v) = updateMetaData f v $ foldr (updateMetaData f) emptyMetaData $ map unsetMetaValue $ S.toList $ currentMetaDataValues f m @@ -239,26 +244,6 @@ modMeta m (MaybeSetMeta f v) | S.null (currentMetaDataValues f m) = updateMetaData f v emptyMetaData | otherwise = emptyMetaData -{- Parses field=value, field+=value, field-=value, field?=value -} -parseModMeta :: String -> Either String ModMeta -parseModMeta p = case lastMaybe f of - Just '+' -> AddMeta <$> mkMetaField f' <*> v - Just '-' -> DelMeta <$> mkMetaField f' <*> v - Just '?' -> MaybeSetMeta <$> mkMetaField f' <*> v - _ -> SetMeta <$> mkMetaField f <*> v - where - (f, sv) = separate (== '=') p - f' = beginning f - v = pure (toMetaValue sv) - -{- Parses field=value -} -parseMetaData :: String -> Either String (MetaField, MetaValue) -parseMetaData p = (,) - <$> mkMetaField f - <*> pure (toMetaValue v) - where - (f, v) = separate (== '=') p - {- Avoid putting too many fields in the map; extremely large maps make - the seriaization test slow due to the sheer amount of data. - It's unlikely that more than 100 fields of metadata will be used. -} |