packages feed

monoid-map 0.1.1.0 → 0.2.0.0

raw patch · 4 files changed

+41/−16 lines, 4 filesdep +commutative-semigroupsdep +patchdep ~reflexPVP ok

version bump matches the API change (PVP)

Dependencies added: commutative-semigroups, patch

Dependency ranges changed: reflex

API changes (from Hackage documentation)

- Data.MonoidMap: instance (GHC.Base.Monoid a, GHC.Classes.Eq a, GHC.Classes.Ord k) => GHC.Base.Semigroup (Data.MonoidMap.MonoidMap k a)
- Data.MonoidMap: instance (GHC.Classes.Eq (Reflex.Query.Class.QueryResult q), GHC.Classes.Ord k, Reflex.Query.Class.Query q) => Reflex.Query.Class.Query (Data.MonoidMap.MonoidMap k q)
- Data.MonoidMap: instance (GHC.Classes.Ord k, GHC.Base.Monoid a, GHC.Classes.Eq a) => GHC.Base.Monoid (Data.MonoidMap.MonoidMap k a)
- Data.MonoidMap: instance (GHC.Classes.Ord k, GHC.Base.Monoid a, GHC.Classes.Eq a, Data.Patch.Group a) => Data.Patch.Group (Data.MonoidMap.MonoidMap k a)
- Data.MonoidMap: instance (GHC.Classes.Ord k, GHC.Base.Monoid a, GHC.Classes.Eq a, Data.Patch.Group a, Data.Patch.Additive a) => Data.Patch.Additive (Data.MonoidMap.MonoidMap k a)
- Data.MonoidMap: instance Data.Traversable.Traversable (Data.MonoidMap.MonoidMap k)
- Data.MonoidMap: instance Data.Witherable.Class.Filterable (Data.Map.Monoidal.MonoidalMap k) => Data.Witherable.Class.Filterable (Data.MonoidMap.MonoidMap k)
- Data.MonoidMap: instance GHC.Base.Functor (Data.MonoidMap.MonoidMap k)
+ Data.MonoidMap: emptyToNothing :: DecidablyEmpty a => a -> Maybe a
+ Data.MonoidMap: instance (Data.Monoid.DecidablyEmpty.DecidablyEmpty (Reflex.Query.Class.QueryResult q), GHC.Classes.Ord k, Reflex.Query.Class.Query q) => Reflex.Query.Class.Query (Data.MonoidMap.MonoidMap k q)
+ Data.MonoidMap: instance (GHC.Base.Monoid a, Data.Monoid.DecidablyEmpty.DecidablyEmpty a, GHC.Classes.Ord k) => GHC.Base.Semigroup (Data.MonoidMap.MonoidMap k a)
+ Data.MonoidMap: instance (GHC.Classes.Ord k, Data.Monoid.DecidablyEmpty.DecidablyEmpty a) => GHC.Base.Monoid (Data.MonoidMap.MonoidMap k a)
+ Data.MonoidMap: instance (GHC.Classes.Ord k, Data.Monoid.DecidablyEmpty.DecidablyEmpty a, Data.Patch.Group a) => Data.Patch.Group (Data.MonoidMap.MonoidMap k a)
+ Data.MonoidMap: instance (GHC.Classes.Ord k, Data.Monoid.DecidablyEmpty.DecidablyEmpty a, Data.Patch.Group a, Data.Semigroup.Commutative.Commutative a) => Data.Semigroup.Commutative.Commutative (Data.MonoidMap.MonoidMap k a)
+ Data.MonoidMap: instance (GHC.Classes.Ord k, Data.Monoid.DecidablyEmpty.DecidablyEmpty v) => Data.Monoid.DecidablyEmpty.DecidablyEmpty (Data.MonoidMap.MonoidMap k v)
+ Data.MonoidMap: instance (TypeError ...) => GHC.Base.Functor (Data.MonoidMap.MonoidMap k)
+ Data.MonoidMap: mapMonoidMap :: DecidablyEmpty b => (a -> b) -> MonoidMap k a -> MonoidMap k b
+ Data.MonoidMap: traverseMonoidMap :: (Ord k, DecidablyEmpty b, Applicative f) => (a -> f b) -> MonoidMap k a -> f (MonoidMap k b)
- Data.MonoidMap: monoidMap :: (Ord k, Eq v, Monoid v) => MonoidalMap k v -> MonoidMap k v
+ Data.MonoidMap: monoidMap :: (Ord k, DecidablyEmpty v) => MonoidalMap k v -> MonoidMap k v

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Revision history for monoid-map +## v0.2.0.0++* Add support for DecidablyEmpty+* Get rid of invalid Functor, Traversable, and Filterable instances; create TypeError for Functor instance+* Use Commutative from commutative-semigroups instead of now-deprecated Additive from patch+ ## v0.1.1.0  * Remove dependency on `appendmap`
README.md view
@@ -1,5 +1,5 @@ # monoid-map-[![Haskell](https://img.shields.io/badge/language-Haskell-orange.svg)](https://haskell.org) [![Hackage](https://img.shields.io/hackage/v/monoid-map.svg)](https://hackage.haskell.org/package/monoid-map) [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/monoid-map/badge)](https://matrix.hackage.haskell.org/#/package/monoid-map) [![Github CI](https://github.com/obsidiansystems/monoid-map/workflows/Haskell%20CI/badge.svg)](https://github.com/obsidiansystems/monoid-map/actions) [![BSD3 License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://github.com/obsidiansystems/monoid-map/blob/master/LICENSE)+[![Haskell](https://img.shields.io/badge/language-Haskell-orange.svg)](https://haskell.org) [![Hackage](https://img.shields.io/hackage/v/monoid-map.svg)](https://hackage.haskell.org/package/monoid-map) [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/monoid-map/badge)](https://matrix.hackage.haskell.org/#/package/monoid-map) [![Github CI](https://github.com/obsidiansystems/monoid-map/workflows/github-action/badge.svg)](https://github.com/obsidiansystems/monoid-map/actions) [![BSD3 License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://github.com/obsidiansystems/monoid-map/blob/master/LICENSE)   Newtype wrapper around 'Data.Map.Monoidal.MonoidalMap' that has a correct 'Group' instance.
monoid-map.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               monoid-map-version:            0.1.1.0+version:            0.2.0.0 synopsis:           A monoidal map with the right group instance description:   Newtype wrapper around 'Data.Map.Monoidal.MonoidalMap' that has a correct@@ -30,9 +30,11 @@    build-depends:     , base                 >=4   && <5+    , commutative-semigroups >= 0.1 && < 0.2     , monoidal-containers  ^>=0.6     , reflex               ^>=0.8     , witherable           >=0.3 && <0.5+    , patch                >=0.0.8.0 && < 0.1    hs-source-dirs:   src   default-language: Haskell2010
src/Data/MonoidMap.hs view
@@ -9,46 +9,63 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE UndecidableInstances #-} -- For (Eq (QueryResult q), Ord k, Query q) => Query (MonoidMap k q)+{-# LANGUAGE UndecidableInstances #-} -- For (DecidablyEmpty (QueryResult q), Ord k, Query q) => Query (MonoidMap k q) {-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE DataKinds #-} module Data.MonoidMap where  import Data.Witherable+import Data.Semigroup.Commutative import Data.Map.Monoidal (MonoidalMap)-import Data.Map.Monoidal as Map+import qualified Data.Map.Monoidal as Map import Data.Semigroup (Semigroup, (<>))-import Reflex (Query, QueryResult, crop, Group(..), Additive)+import Reflex (Query, QueryResult, crop, Group(..))+import Data.Monoid.DecidablyEmpty+import GHC.TypeLits  -- | Newtype wrapper around Data.Map.Monoidal.MonoidalMap newtype MonoidMap k v = MonoidMap { unMonoidMap :: MonoidalMap k v }-  deriving (Show, Eq, Ord, Foldable, Functor, Traversable)+  deriving (Show, Eq, Ord, Foldable) -deriving instance Filterable (MonoidalMap k) => Filterable (MonoidMap k)+instance TypeError (Text "Use mapMonoidMap instead of fmap; MonoidMap is not a Functor because mempty values would need to be deleted, and Functors cannot change the shape of a datastructure") => Functor (MonoidMap k) where+  fmap = error "Impossible" +emptyToNothing :: DecidablyEmpty a => a -> Maybe a+emptyToNothing a = if isEmpty a then Nothing else Just a++mapMonoidMap :: DecidablyEmpty b => (a -> b) -> MonoidMap k a -> MonoidMap k b+mapMonoidMap f (MonoidMap a) = MonoidMap $ mapMaybe (emptyToNothing . f) a++traverseMonoidMap :: (Ord k, DecidablyEmpty b, Applicative f) => (a -> f b) -> MonoidMap k a -> f (MonoidMap k b)+traverseMonoidMap f (MonoidMap a) = MonoidMap <$> wither (fmap emptyToNothing . f) a++instance (Ord k, DecidablyEmpty v) => DecidablyEmpty (MonoidMap k v) where+  isEmpty (MonoidMap m) = Map.null m+ -- | Convert a MonoidalMap into a MonoidMap-monoidMap :: (Ord k, Eq v, Monoid v) => MonoidalMap k v -> MonoidMap k v-monoidMap = MonoidMap . Map.filter (/= mempty)+monoidMap :: (Ord k, DecidablyEmpty v) => MonoidalMap k v -> MonoidMap k v+monoidMap = MonoidMap . Map.filter (not . isEmpty) -instance (Eq (QueryResult q), Ord k, Query q) => Query (MonoidMap k q) where+instance (DecidablyEmpty (QueryResult q), Ord k, Query q) => Query (MonoidMap k q) where   type QueryResult (MonoidMap k q) = MonoidMap k (QueryResult q)   crop (MonoidMap q) (MonoidMap qr) =     -- This assumes that the query result of a null query should be null     monoidMap $ Map.intersectionWith crop q qr -instance (Monoid a, Eq a, Ord k) => Semigroup (MonoidMap k a) where+instance (Monoid a, DecidablyEmpty a, Ord k) => Semigroup (MonoidMap k a) where   MonoidMap a <> MonoidMap b =     let combine _ a' b' =           let c = a' `mappend` b'-          in if c == mempty+          in if isEmpty c                then Nothing                else Just c     in MonoidMap $ Map.mergeWithKey combine id id a b -instance (Ord k, Monoid a, Eq a) => Monoid (MonoidMap k a) where+instance (Ord k, DecidablyEmpty a) => Monoid (MonoidMap k a) where   mempty = MonoidMap Map.empty   mappend = (<>) -instance (Ord k, Monoid a, Eq a, Group a) => Group (MonoidMap k a) where-  negateG = fmap negateG+instance (Ord k, DecidablyEmpty a, Group a) => Group (MonoidMap k a) where+  negateG (MonoidMap a) = MonoidMap $ fmap negateG a -instance (Ord k, Monoid a, Eq a, Group a, Additive a) => Additive (MonoidMap k a)+instance (Ord k, DecidablyEmpty a, Group a, Commutative a) => Commutative (MonoidMap k a)