appendmap 0.1.1 → 0.1.2
raw patch · 6 files changed
+110/−35 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Map.Append: AppendMap :: Map k v -> AppendMap k v
- Data.Map.Append: [unAppendMap] :: AppendMap k v -> Map k v
- Data.Map.Append: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Monoid (Data.Map.Append.AppendMap k v)
- Data.Map.Append: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Semigroup (Data.Map.Append.AppendMap k v)
- Data.Map.Append: newtype AppendMap k v
+ Data.Map.Append.Lazy: AppendMap :: Map k v -> AppendMap k v
+ Data.Map.Append.Lazy: [unAppendMap] :: AppendMap k v -> Map k v
+ Data.Map.Append.Lazy: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Monoid (Data.Map.Append.Lazy.AppendMap k v)
+ Data.Map.Append.Lazy: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Semigroup (Data.Map.Append.Lazy.AppendMap k v)
+ Data.Map.Append.Lazy: newtype AppendMap k v
+ Data.Map.Append.Strict: AppendMap :: Map k v -> AppendMap k v
+ Data.Map.Append.Strict: [unAppendMap] :: AppendMap k v -> Map k v
+ Data.Map.Append.Strict: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Monoid (Data.Map.Append.Strict.AppendMap k v)
+ Data.Map.Append.Strict: instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Semigroup (Data.Map.Append.Strict.AppendMap k v)
+ Data.Map.Append.Strict: newtype AppendMap k v
Files
- ChangeLog.md +4/−0
- appendmap.cabal +4/−2
- src/Data/Map/Append.hs +4/−21
- src/Data/Map/Append/Lazy.hs +22/−0
- src/Data/Map/Append/Strict.hs +22/−0
- test/Spec.hs +54/−12
ChangeLog.md view
@@ -2,6 +2,10 @@ ## Unreleased changes +## 0.1.2++* Wrappers for lazy and strict versions of `Data.Map`.+ ## 0.1.1 * Initial release on Hackage.
appendmap.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: a323dd29d1810894fafc021571b49e8c3ca23a22516736fe70ec955cec2be6e4+-- hash: 958b11931b57f7dbce792ef791245c3d6ae3eef40e24559c9e2520da0c867296 name: appendmap-version: 0.1.1+version: 0.1.2 synopsis: Map with a Semigroup and Monoid instances delegating to Semigroup of the elements description: Please see the README on GitHub at <https://github.com/koterpillar/appendmap#readme> category: Data Structures@@ -29,6 +29,8 @@ library exposed-modules: Data.Map.Append+ Data.Map.Append.Lazy+ Data.Map.Append.Strict other-modules: Paths_appendmap hs-source-dirs:
src/Data/Map/Append.hs view
@@ -1,22 +1,5 @@-module Data.Map.Append where--import Data.Map (Map)-import qualified Data.Map as Map--import Data.Monoid hiding ((<>))-import Data.Semigroup--import qualified Data.List.NonEmpty as NE--newtype AppendMap k v = AppendMap- { unAppendMap :: Map k v- }--instance (Ord k, Semigroup v) => Semigroup (AppendMap k v) where- AppendMap a <> AppendMap b = AppendMap $ Map.unionWith (<>) a b- sconcat = AppendMap . Map.unionsWith (<>) . NE.toList . fmap unAppendMap+module Data.Map.Append+ ( module Data.Map.Append.Lazy+ ) where -instance (Ord k, Semigroup v) => Monoid (AppendMap k v) where- mempty = AppendMap Map.empty- mappend = (<>)- mconcat = AppendMap . Map.unionsWith (<>) . fmap unAppendMap+import Data.Map.Append.Lazy
+ src/Data/Map/Append/Lazy.hs view
@@ -0,0 +1,22 @@+module Data.Map.Append.Lazy where++import Data.Map (Map)+import qualified Data.Map as Map++import Data.Monoid hiding ((<>))+import Data.Semigroup++import qualified Data.List.NonEmpty as NE++newtype AppendMap k v = AppendMap+ { unAppendMap :: Map k v+ }++instance (Ord k, Semigroup v) => Semigroup (AppendMap k v) where+ AppendMap a <> AppendMap b = AppendMap $ Map.unionWith (<>) a b+ sconcat = AppendMap . Map.unionsWith (<>) . NE.toList . fmap unAppendMap++instance (Ord k, Semigroup v) => Monoid (AppendMap k v) where+ mempty = AppendMap Map.empty+ mappend = (<>)+ mconcat = AppendMap . Map.unionsWith (<>) . fmap unAppendMap
+ src/Data/Map/Append/Strict.hs view
@@ -0,0 +1,22 @@+module Data.Map.Append.Strict where++import Data.Map.Strict (Map)+import qualified Data.Map.Strict as Map++import Data.Monoid hiding ((<>))+import Data.Semigroup++import qualified Data.List.NonEmpty as NE++newtype AppendMap k v = AppendMap+ { unAppendMap :: Map k v+ }++instance (Ord k, Semigroup v) => Semigroup (AppendMap k v) where+ AppendMap a <> AppendMap b = AppendMap $ Map.unionWith (<>) a b+ sconcat = AppendMap . Map.unionsWith (<>) . NE.toList . fmap unAppendMap++instance (Ord k, Semigroup v) => Monoid (AppendMap k v) where+ mempty = AppendMap Map.empty+ mappend = (<>)+ mconcat = AppendMap . Map.unionsWith (<>) . fmap unAppendMap
test/Spec.hs view
@@ -1,18 +1,60 @@-import qualified Data.Map as Map-import Data.Map.Append+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RecordWildCards #-} +import qualified Data.Map.Append.Lazy as Lazy+import qualified Data.Map.Lazy as Lazy++import qualified Data.Map.Append.Strict as Strict+import qualified Data.Map.Strict as Strict+ import Data.Semigroup import Test.Hspec +data AppendMap appendmap map = AppendMap+ { mapFromList :: [(Int, String)] -> map Int String+ , mapEmpty :: map Int String+ , appendMap :: forall k v. map k v -> appendmap k v+ , unAppendMap :: forall k v. appendmap k v -> map k v+ }++lazy :: AppendMap Lazy.AppendMap Lazy.Map+lazy =+ AppendMap+ { mapFromList = Lazy.fromList+ , mapEmpty = Lazy.empty+ , appendMap = Lazy.AppendMap+ , unAppendMap = Lazy.unAppendMap+ }++strict :: AppendMap Strict.AppendMap Strict.Map+strict =+ AppendMap+ { mapFromList = Strict.fromList+ , mapEmpty = Strict.empty+ , appendMap = Strict.AppendMap+ , unAppendMap = Strict.unAppendMap+ }++appendMapSpec ::+ ( Show (map Int String)+ , Eq (map Int String)+ , Monoid (map Int String)+ , Monoid (appendmap Int String)+ )+ => AppendMap appendmap map+ -> Spec+appendMapSpec AppendMap {..} = do+ it "has empty element" $+ unAppendMap mempty `shouldBe` mapEmpty+ it "combines elements" $ do+ let one = appendMap $ mapFromList [(1, "hello"), (2, "goodbye")]+ let two = appendMap $ mapFromList [(1, "world"), (3, "again")]+ unAppendMap (one <> two) `shouldBe`+ mapFromList [(1, "helloworld"), (2, "goodbye"), (3, "again")]+ main :: IO ()-main =- hspec $- describe "AppendMap" $ do- it "has empty element" $- unAppendMap (mempty :: AppendMap Int String) `shouldBe` Map.empty- it "combines elements" $ do- let one = AppendMap $ Map.fromList [(1, "hello"), (2, "goodbye")]- let two = AppendMap $ Map.fromList [(1, "world"), (3, "again")]- unAppendMap (one <> two) `shouldBe`- Map.fromList [(1, "helloworld"), (2, "goodbye"), (3, "again")]+main = hspec $ do+ describe "Data.Map.Append.Lazy" $ appendMapSpec lazy+ describe "Data.Map.Append.Strict" $ appendMapSpec strict