-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Map with a Semigroup and Monoid instances delegating to Semigroup of the elements
--   
--   Please see the README on GitHub at
--   <a>https://github.com/koterpillar/appendmap#readme</a>
@package appendmap
@version 0.1.5


-- | A wrapper for <a>Map</a> with a <a>Semigroup</a> and <a>Monoid</a>
--   instances that delegate to the individual keys.
module Data.Map.Append.Lazy

-- | Map wrapper with <a>Semigroup</a> and <a>Monoid</a> instances that
--   delegate to the keys. It satisfies the following property:
--   
--   <pre>
--   lookup k (m1 &lt;&gt; m2) === lookup k m1 &lt;&gt; lookup k m2
--     where
--       lookup key = Map.lookup key . unAppendMap
--   </pre>
newtype AppendMap k v
AppendMap :: Map k v -> AppendMap k v
[unAppendMap] :: AppendMap k v -> Map k v
instance (GHC.Show.Show k, GHC.Show.Show v) => GHC.Show.Show (Data.Map.Append.Lazy.AppendMap k v)
instance (GHC.Classes.Eq k, GHC.Classes.Eq v) => GHC.Classes.Eq (Data.Map.Append.Lazy.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Classes.Ord v) => GHC.Classes.Ord (Data.Map.Append.Lazy.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Semigroup (Data.Map.Append.Lazy.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Monoid (Data.Map.Append.Lazy.AppendMap k v)

module Data.Map.Append


-- | A wrapper for <a>Map</a> with a <a>Semigroup</a> and <a>Monoid</a>
--   instances that delegate to the individual keys.
module Data.Map.Append.Strict

-- | Map wrapper with <a>Semigroup</a> and <a>Monoid</a> instances that
--   delegate to the keys. It satisfies the following property:
--   
--   <pre>
--   lookup k (m1 &lt;&gt; m2) === lookup k m1 &lt;&gt; lookup k m2
--     where
--       lookup key = Map.lookup key . unAppendMap
--   </pre>
newtype AppendMap k v
AppendMap :: Map k v -> AppendMap k v
[unAppendMap] :: AppendMap k v -> Map k v
instance (GHC.Show.Show k, GHC.Show.Show v) => GHC.Show.Show (Data.Map.Append.Strict.AppendMap k v)
instance (GHC.Classes.Eq k, GHC.Classes.Eq v) => GHC.Classes.Eq (Data.Map.Append.Strict.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Classes.Ord v) => GHC.Classes.Ord (Data.Map.Append.Strict.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Semigroup (Data.Map.Append.Strict.AppendMap k v)
instance (GHC.Classes.Ord k, GHC.Base.Semigroup v) => GHC.Base.Monoid (Data.Map.Append.Strict.AppendMap k v)


-- | A <a>Semigroup</a>-based counter type.
module Data.Map.Counter

-- | A <a>Semigroup</a>-based counter type.
--   
--   <pre>
--   let counts = mkCounter 1 &lt;&gt; mkCounter 2 &lt;&gt; mkCounter 1 :: Counter Int
--   getCounts counts === Map.fromList [(1, 2), (2, 1)]
--   </pre>
type Counter key = AppendMap key (Sum Int)

-- | Counter that has a single occurrence for a single item.
mkCounter :: Ord key => key -> Counter key

-- | Get counts as a map.
getCounts :: Counter key -> Map key Int
