--------------------------------------------------------------------------------
-- |
-- Module      :  HGeometry.Map.NonEmpty.Monoidal
-- Copyright   :  (C) Frank Staals
-- License     :  see the LICENSE file
-- Maintainer  :  Frank Staals
--
-- A NonEmpty Monoidal Map, i.e. combining the monoidal maps combines the elements with
-- their semigroup operation.
--
--------------------------------------------------------------------------------
module HGeometry.Map.NonEmpty.Monoidal
  ( MonoidalNEMap(..)
  , singleton
  , fromSet
  , unions1WithKey
  , mapWithKeyMerge1
  , mapAccumWithKey

  , insert, insertReplace

  , assocs, toAscList, keysSet


  , (!?), (!)
  ) where

import Data.Foldable1.WithIndex
import Control.Lens
import Data.List.NonEmpty (NonEmpty(..))
import Data.Foldable1
import Data.Map.NonEmpty (NEMap)
import Data.Set.NonEmpty (NESet)
import Data.Map.NonEmpty qualified as NEMap
import Data.Coerce

--------------------------------------------------------------------------------

-- | A NonEmpty Map in which we combine conflicting elements by using their semigroup
-- operation rather than picking the left value (as is done in the default Data.Map)
newtype MonoidalNEMap k v = MonoidalNEMap { forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap :: NEMap k v }
  deriving stock (Int -> MonoidalNEMap k v -> ShowS
[MonoidalNEMap k v] -> ShowS
MonoidalNEMap k v -> String
(Int -> MonoidalNEMap k v -> ShowS)
-> (MonoidalNEMap k v -> String)
-> ([MonoidalNEMap k v] -> ShowS)
-> Show (MonoidalNEMap k v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k v. (Show k, Show v) => Int -> MonoidalNEMap k v -> ShowS
forall k v. (Show k, Show v) => [MonoidalNEMap k v] -> ShowS
forall k v. (Show k, Show v) => MonoidalNEMap k v -> String
$cshowsPrec :: forall k v. (Show k, Show v) => Int -> MonoidalNEMap k v -> ShowS
showsPrec :: Int -> MonoidalNEMap k v -> ShowS
$cshow :: forall k v. (Show k, Show v) => MonoidalNEMap k v -> String
show :: MonoidalNEMap k v -> String
$cshowList :: forall k v. (Show k, Show v) => [MonoidalNEMap k v] -> ShowS
showList :: [MonoidalNEMap k v] -> ShowS
Show)
  deriving newtype ((forall a b. (a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b)
-> (forall a b. a -> MonoidalNEMap k b -> MonoidalNEMap k a)
-> Functor (MonoidalNEMap k)
forall a b. a -> MonoidalNEMap k b -> MonoidalNEMap k a
forall a b. (a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b
forall k a b. a -> MonoidalNEMap k b -> MonoidalNEMap k a
forall k a b. (a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall k a b. (a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b
fmap :: forall a b. (a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b
$c<$ :: forall k a b. a -> MonoidalNEMap k b -> MonoidalNEMap k a
<$ :: forall a b. a -> MonoidalNEMap k b -> MonoidalNEMap k a
Functor,(forall m. Monoid m => MonoidalNEMap k m -> m)
-> (forall m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m)
-> (forall m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m)
-> (forall a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b)
-> (forall a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b)
-> (forall b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b)
-> (forall b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b)
-> (forall a. (a -> a -> a) -> MonoidalNEMap k a -> a)
-> (forall a. (a -> a -> a) -> MonoidalNEMap k a -> a)
-> (forall a. MonoidalNEMap k a -> [a])
-> (forall a. MonoidalNEMap k a -> Bool)
-> (forall a. MonoidalNEMap k a -> Int)
-> (forall a. Eq a => a -> MonoidalNEMap k a -> Bool)
-> (forall a. Ord a => MonoidalNEMap k a -> a)
-> (forall a. Ord a => MonoidalNEMap k a -> a)
-> (forall a. Num a => MonoidalNEMap k a -> a)
-> (forall a. Num a => MonoidalNEMap k a -> a)
-> Foldable (MonoidalNEMap k)
forall a. Eq a => a -> MonoidalNEMap k a -> Bool
forall a. Num a => MonoidalNEMap k a -> a
forall a. Ord a => MonoidalNEMap k a -> a
forall m. Monoid m => MonoidalNEMap k m -> m
forall a. MonoidalNEMap k a -> Bool
forall a. MonoidalNEMap k a -> Int
forall a. MonoidalNEMap k a -> [a]
forall a. (a -> a -> a) -> MonoidalNEMap k a -> a
forall k a. Eq a => a -> MonoidalNEMap k a -> Bool
forall k a. Num a => MonoidalNEMap k a -> a
forall k a. Ord a => MonoidalNEMap k a -> a
forall k m. Monoid m => MonoidalNEMap k m -> m
forall m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
forall k a. MonoidalNEMap k a -> Bool
forall k a. MonoidalNEMap k a -> Int
forall k a. MonoidalNEMap k a -> [a]
forall b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
forall a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
forall k a. (a -> a -> a) -> MonoidalNEMap k a -> a
forall k m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
forall k b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
forall k a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall k m. Monoid m => MonoidalNEMap k m -> m
fold :: forall m. Monoid m => MonoidalNEMap k m -> m
$cfoldMap :: forall k m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
$cfoldMap' :: forall k m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> MonoidalNEMap k a -> m
$cfoldr :: forall k a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
foldr :: forall a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
$cfoldr' :: forall k a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> MonoidalNEMap k a -> b
$cfoldl :: forall k b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
foldl :: forall b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
$cfoldl' :: forall k b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> MonoidalNEMap k a -> b
$cfoldr1 :: forall k a. (a -> a -> a) -> MonoidalNEMap k a -> a
foldr1 :: forall a. (a -> a -> a) -> MonoidalNEMap k a -> a
$cfoldl1 :: forall k a. (a -> a -> a) -> MonoidalNEMap k a -> a
foldl1 :: forall a. (a -> a -> a) -> MonoidalNEMap k a -> a
$ctoList :: forall k a. MonoidalNEMap k a -> [a]
toList :: forall a. MonoidalNEMap k a -> [a]
$cnull :: forall k a. MonoidalNEMap k a -> Bool
null :: forall a. MonoidalNEMap k a -> Bool
$clength :: forall k a. MonoidalNEMap k a -> Int
length :: forall a. MonoidalNEMap k a -> Int
$celem :: forall k a. Eq a => a -> MonoidalNEMap k a -> Bool
elem :: forall a. Eq a => a -> MonoidalNEMap k a -> Bool
$cmaximum :: forall k a. Ord a => MonoidalNEMap k a -> a
maximum :: forall a. Ord a => MonoidalNEMap k a -> a
$cminimum :: forall k a. Ord a => MonoidalNEMap k a -> a
minimum :: forall a. Ord a => MonoidalNEMap k a -> a
$csum :: forall k a. Num a => MonoidalNEMap k a -> a
sum :: forall a. Num a => MonoidalNEMap k a -> a
$cproduct :: forall k a. Num a => MonoidalNEMap k a -> a
product :: forall a. Num a => MonoidalNEMap k a -> a
Foldable,Foldable (MonoidalNEMap k)
Foldable (MonoidalNEMap k) =>
(forall m. Semigroup m => MonoidalNEMap k m -> m)
-> (forall m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m)
-> (forall m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m)
-> (forall a. MonoidalNEMap k a -> NonEmpty a)
-> (forall a. Ord a => MonoidalNEMap k a -> a)
-> (forall a. Ord a => MonoidalNEMap k a -> a)
-> (forall a. MonoidalNEMap k a -> a)
-> (forall a. MonoidalNEMap k a -> a)
-> (forall a b.
    (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b)
-> (forall a b.
    (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b)
-> (forall a b.
    (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b)
-> (forall a b.
    (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b)
-> Foldable1 (MonoidalNEMap k)
forall k. Foldable (MonoidalNEMap k)
forall a. Ord a => MonoidalNEMap k a -> a
forall m. Semigroup m => MonoidalNEMap k m -> m
forall a. MonoidalNEMap k a -> a
forall a. MonoidalNEMap k a -> NonEmpty a
forall k a. Ord a => MonoidalNEMap k a -> a
forall k m. Semigroup m => MonoidalNEMap k m -> m
forall m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
forall k a. MonoidalNEMap k a -> a
forall k a. MonoidalNEMap k a -> NonEmpty a
forall a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
forall a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
forall k m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
forall k a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
forall k a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
forall (t :: * -> *).
Foldable t =>
(forall m. Semigroup m => t m -> m)
-> (forall m a. Semigroup m => (a -> m) -> t a -> m)
-> (forall m a. Semigroup m => (a -> m) -> t a -> m)
-> (forall a. t a -> NonEmpty a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. t a -> a)
-> (forall a. t a -> a)
-> (forall a b. (a -> b) -> (a -> b -> b) -> t a -> b)
-> (forall a b. (a -> b) -> (b -> a -> b) -> t a -> b)
-> (forall a b. (a -> b) -> (b -> a -> b) -> t a -> b)
-> (forall a b. (a -> b) -> (a -> b -> b) -> t a -> b)
-> Foldable1 t
$cfold1 :: forall k m. Semigroup m => MonoidalNEMap k m -> m
fold1 :: forall m. Semigroup m => MonoidalNEMap k m -> m
$cfoldMap1 :: forall k m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
foldMap1 :: forall m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
$cfoldMap1' :: forall k m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
foldMap1' :: forall m a. Semigroup m => (a -> m) -> MonoidalNEMap k a -> m
$ctoNonEmpty :: forall k a. MonoidalNEMap k a -> NonEmpty a
toNonEmpty :: forall a. MonoidalNEMap k a -> NonEmpty a
$cmaximum :: forall k a. Ord a => MonoidalNEMap k a -> a
maximum :: forall a. Ord a => MonoidalNEMap k a -> a
$cminimum :: forall k a. Ord a => MonoidalNEMap k a -> a
minimum :: forall a. Ord a => MonoidalNEMap k a -> a
$chead :: forall k a. MonoidalNEMap k a -> a
head :: forall a. MonoidalNEMap k a -> a
$clast :: forall k a. MonoidalNEMap k a -> a
last :: forall a. MonoidalNEMap k a -> a
$cfoldrMap1 :: forall k a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
foldrMap1 :: forall a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
$cfoldlMap1' :: forall k a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
foldlMap1' :: forall a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
$cfoldlMap1 :: forall k a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
foldlMap1 :: forall a b. (a -> b) -> (b -> a -> b) -> MonoidalNEMap k a -> b
$cfoldrMap1' :: forall k a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
foldrMap1' :: forall a b. (a -> b) -> (a -> b -> b) -> MonoidalNEMap k a -> b
Foldable1)

instance (Ord k, Semigroup v) => Semigroup (MonoidalNEMap k v) where
  (MonoidalNEMap NEMap k v
ma) <> :: MonoidalNEMap k v -> MonoidalNEMap k v -> MonoidalNEMap k v
<> (MonoidalNEMap NEMap k v
mb) = NEMap k v -> MonoidalNEMap k v
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (NEMap k v -> MonoidalNEMap k v) -> NEMap k v -> MonoidalNEMap k v
forall a b. (a -> b) -> a -> b
$ (v -> v -> v) -> NEMap k v -> NEMap k v -> NEMap k v
forall k a.
Ord k =>
(a -> a -> a) -> NEMap k a -> NEMap k a -> NEMap k a
NEMap.unionWith v -> v -> v
forall a. Semigroup a => a -> a -> a
(<>) NEMap k v
ma NEMap k v
mb

-- type instance Index   (MonoidalNEMap k v) = k
-- type instance IxValue (MonoidalNEMap k v) = v

-- instance Ord k => Ixed (MonoidalNEMap k v)

-- instance Ord k => At (MonoidalNEMap k v) where
--   at k f = NEMap.alterF f k
--   {-# INLINE at #-}

instance Traversable (MonoidalNEMap k) where
  traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> MonoidalNEMap k a -> f (MonoidalNEMap k b)
traverse a -> f b
f = (NEMap k b -> MonoidalNEMap k b)
-> f (NEMap k b) -> f (MonoidalNEMap k b)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NEMap k b -> MonoidalNEMap k b
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (f (NEMap k b) -> f (MonoidalNEMap k b))
-> (MonoidalNEMap k a -> f (NEMap k b))
-> MonoidalNEMap k a
-> f (MonoidalNEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> f b) -> NEMap k a -> f (NEMap k b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> NEMap k a -> f (NEMap k b)
traverse a -> f b
f (NEMap k a -> f (NEMap k b))
-> (MonoidalNEMap k a -> NEMap k a)
-> MonoidalNEMap k a
-> f (NEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k a -> NEMap k a
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap

instance Traversable1 (MonoidalNEMap k) where
  traverse1 :: forall (f :: * -> *) a b.
Apply f =>
(a -> f b) -> MonoidalNEMap k a -> f (MonoidalNEMap k b)
traverse1 a -> f b
f = (NEMap k b -> MonoidalNEMap k b)
-> f (NEMap k b) -> f (MonoidalNEMap k b)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NEMap k b -> MonoidalNEMap k b
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (f (NEMap k b) -> f (MonoidalNEMap k b))
-> (MonoidalNEMap k a -> f (NEMap k b))
-> MonoidalNEMap k a
-> f (MonoidalNEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> f b) -> NEMap k a -> f (NEMap k b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable1 t, Apply f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Apply f =>
(a -> f b) -> NEMap k a -> f (NEMap k b)
traverse1 a -> f b
f (NEMap k a -> f (NEMap k b))
-> (MonoidalNEMap k a -> NEMap k a)
-> MonoidalNEMap k a
-> f (NEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k a -> NEMap k a
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap

instance FunctorWithIndex k (MonoidalNEMap k) where
  imap :: forall a b. (k -> a -> b) -> MonoidalNEMap k a -> MonoidalNEMap k b
imap k -> a -> b
f = NEMap k b -> MonoidalNEMap k b
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (NEMap k b -> MonoidalNEMap k b)
-> (MonoidalNEMap k a -> NEMap k b)
-> MonoidalNEMap k a
-> MonoidalNEMap k b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (k -> a -> b) -> NEMap k a -> NEMap k b
forall k a b. (k -> a -> b) -> NEMap k a -> NEMap k b
NEMap.mapWithKey k -> a -> b
f (NEMap k a -> NEMap k b)
-> (MonoidalNEMap k a -> NEMap k a)
-> MonoidalNEMap k a
-> NEMap k b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k a -> NEMap k a
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap

instance FoldableWithIndex k (MonoidalNEMap k) where
  ifoldMap :: forall m a. Monoid m => (k -> a -> m) -> MonoidalNEMap k a -> m
ifoldMap = (k -> a -> m) -> MonoidalNEMap k a -> m
forall m a. Semigroup m => (k -> a -> m) -> MonoidalNEMap k a -> m
forall i (f :: * -> *) m a.
(Foldable1WithIndex i f, Semigroup m) =>
(i -> a -> m) -> f a -> m
ifoldMap1

instance TraversableWithIndex k (MonoidalNEMap k) where
  itraverse :: forall (f :: * -> *) a b.
Applicative f =>
(k -> a -> f b) -> MonoidalNEMap k a -> f (MonoidalNEMap k b)
itraverse k -> a -> f b
f = (NEMap k b -> MonoidalNEMap k b)
-> f (NEMap k b) -> f (MonoidalNEMap k b)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NEMap k b -> MonoidalNEMap k b
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (f (NEMap k b) -> f (MonoidalNEMap k b))
-> (MonoidalNEMap k a -> f (NEMap k b))
-> MonoidalNEMap k a
-> f (MonoidalNEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (k -> a -> f b) -> NEMap k a -> f (NEMap k b)
forall (t :: * -> *) k a b.
Applicative t =>
(k -> a -> t b) -> NEMap k a -> t (NEMap k b)
NEMap.traverseWithKey k -> a -> f b
f (NEMap k a -> f (NEMap k b))
-> (MonoidalNEMap k a -> NEMap k a)
-> MonoidalNEMap k a
-> f (NEMap k b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k a -> NEMap k a
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap

instance Foldable1WithIndex k (MonoidalNEMap k) where
  ifoldMap1 :: forall m a. Semigroup m => (k -> a -> m) -> MonoidalNEMap k a -> m
ifoldMap1 k -> a -> m
f = (k -> a -> m) -> NEMap k a -> m
forall m k a. Semigroup m => (k -> a -> m) -> NEMap k a -> m
NEMap.foldMapWithKey k -> a -> m
f (NEMap k a -> m)
-> (MonoidalNEMap k a -> NEMap k a) -> MonoidalNEMap k a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k a -> NEMap k a
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap

--------------------------------------------------------------------------------

-- | Create a singleton MonoidalNE Map
singleton     :: k -> v -> MonoidalNEMap k v
singleton :: forall k v. k -> v -> MonoidalNEMap k v
singleton k
k v
v = NEMap k v -> MonoidalNEMap k v
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (NEMap k v -> MonoidalNEMap k v) -> NEMap k v -> MonoidalNEMap k v
forall a b. (a -> b) -> a -> b
$ k -> v -> NEMap k v
forall k a. k -> a -> NEMap k a
NEMap.singleton k
k v
v
{-# INLINE singleton #-}

-- | Creates a non-empty Map from a nonempty Set
-- \(O(n)\)
fromSet   :: (k -> v) -> NESet k -> MonoidalNEMap k v
fromSet :: forall k v. (k -> v) -> NESet k -> MonoidalNEMap k v
fromSet k -> v
f = (NESet k -> NEMap k v) -> NESet k -> MonoidalNEMap k v
forall a b. Coercible a b => a -> b
coerce ((k -> v) -> NESet k -> NEMap k v
forall k a. (k -> a) -> NESet k -> NEMap k a
NEMap.fromSet k -> v
f)
{-# INLINE fromSet #-}

-- | Merge a bunch of non-empty maps with the given mergin function
unions1WithKey   :: (Foldable1 f, Ord k) => (k -> a-> a ->a) -> f (NEMap k a) -> NEMap k a
unions1WithKey :: forall (f :: * -> *) k a.
(Foldable1 f, Ord k) =>
(k -> a -> a -> a) -> f (NEMap k a) -> NEMap k a
unions1WithKey k -> a -> a -> a
f = (NEMap k a -> NEMap k a -> NEMap k a) -> f (NEMap k a) -> NEMap k a
forall (t :: * -> *) a. Foldable1 t => (a -> a -> a) -> t a -> a
foldl1' ((k -> a -> a -> a) -> NEMap k a -> NEMap k a -> NEMap k a
forall k a.
Ord k =>
(k -> a -> a -> a) -> NEMap k a -> NEMap k a -> NEMap k a
NEMap.unionWithKey k -> a -> a -> a
f)
{-# INLINE unions1WithKey #-}

-- | Merge the maps. When they share a key, combine their values using a semigroup.
mapWithKeyMerge1   :: (Ord k', Semigroup v')
                   => (k -> v -> NEMap k' v') -> NEMap k v -> NEMap k' v'
mapWithKeyMerge1 :: forall k' v' k v.
(Ord k', Semigroup v') =>
(k -> v -> NEMap k' v') -> NEMap k v -> NEMap k' v'
mapWithKeyMerge1 k -> v -> NEMap k' v'
f = MonoidalNEMap k' v' -> NEMap k' v'
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap (MonoidalNEMap k' v' -> NEMap k' v')
-> (NEMap k v -> MonoidalNEMap k' v') -> NEMap k v -> NEMap k' v'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (k -> v -> MonoidalNEMap k' v') -> NEMap k v -> MonoidalNEMap k' v'
forall m k a. Semigroup m => (k -> a -> m) -> NEMap k a -> m
NEMap.foldMapWithKey (\k
k v
v -> NEMap k' v' -> MonoidalNEMap k' v'
forall k v. NEMap k v -> MonoidalNEMap k v
MonoidalNEMap (NEMap k' v' -> MonoidalNEMap k' v')
-> NEMap k' v' -> MonoidalNEMap k' v'
forall a b. (a -> b) -> a -> b
$ k -> v -> NEMap k' v'
f k
k v
v)
{-# INLINE mapWithKeyMerge1 #-}

-- | Map with some accumulator function
mapAccumWithKey :: forall k a b c.
                   (a -> k -> b -> (a, c)) -> a -> MonoidalNEMap k b -> (a, MonoidalNEMap k c)
mapAccumWithKey :: forall k a b c.
(a -> k -> b -> (a, c))
-> a -> MonoidalNEMap k b -> (a, MonoidalNEMap k c)
mapAccumWithKey =
  ((a -> k -> b -> (a, c)) -> a -> NEMap k b -> (a, NEMap k c))
-> (a -> k -> b -> (a, c))
-> a
-> MonoidalNEMap k b
-> (a, MonoidalNEMap k c)
forall a b. Coercible a b => a -> b
coerce ((a -> k -> b -> (a, c)) -> a -> NEMap k b -> (a, NEMap k c)
forall a k b c.
(a -> k -> b -> (a, c)) -> a -> NEMap k b -> (a, NEMap k c)
NEMap.mapAccumWithKey :: (a -> k -> b -> (a, c)) -> a -> NEMap k b -> (a, NEMap k c))
{-# INLINE mapAccumWithKey #-}

--------------------------------------------------------------------------------

-- | Return all key/value pairs in the map in ascending key order.
--
-- \(O(n)\)
assocs :: MonoidalNEMap k v -> NonEmpty (k, v)
assocs :: forall k v. MonoidalNEMap k v -> NonEmpty (k, v)
assocs = NEMap k v -> NonEmpty (k, v)
forall k a. NEMap k a -> NonEmpty (k, a)
NEMap.assocs (NEMap k v -> NonEmpty (k, v))
-> (MonoidalNEMap k v -> NEMap k v)
-> MonoidalNEMap k v
-> NonEmpty (k, v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k v -> NEMap k v
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap
{-# INLINE assocs #-}

-- | Return all key/value pairs in the map in ascending key order.
--
-- \(O(n)\)
toAscList :: MonoidalNEMap k v -> NonEmpty (k, v)
toAscList :: forall k v. MonoidalNEMap k v -> NonEmpty (k, v)
toAscList = NEMap k v -> NonEmpty (k, v)
forall k a. NEMap k a -> NonEmpty (k, a)
NEMap.toAscList (NEMap k v -> NonEmpty (k, v))
-> (MonoidalNEMap k v -> NEMap k v)
-> MonoidalNEMap k v
-> NonEmpty (k, v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k v -> NEMap k v
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap
{-# INLINE toAscList  #-}

-- | Return all keys in ascending order
--
-- \(O(n)\)
keysSet :: MonoidalNEMap k v -> NESet k
keysSet :: forall k v. MonoidalNEMap k v -> NESet k
keysSet = NEMap k v -> NESet k
forall k a. NEMap k a -> NESet k
NEMap.keysSet (NEMap k v -> NESet k)
-> (MonoidalNEMap k v -> NEMap k v) -> MonoidalNEMap k v -> NESet k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalNEMap k v -> NEMap k v
forall k v. MonoidalNEMap k v -> NEMap k v
getNEMap
{-# INLINE keysSet #-}

--------------------------------------------------------------------------------

-- | Insert an new key,value pair into the Map
--
-- \(O(\log n)\)
insert     :: (Ord k, Semigroup v) => k -> v -> MonoidalNEMap k v -> MonoidalNEMap k v
insert :: forall k v.
(Ord k, Semigroup v) =>
k -> v -> MonoidalNEMap k v -> MonoidalNEMap k v
insert k
k v
v = (NEMap k v -> NEMap k v) -> MonoidalNEMap k v -> MonoidalNEMap k v
forall a b. Coercible a b => a -> b
coerce ((NEMap k v -> NEMap k v)
 -> MonoidalNEMap k v -> MonoidalNEMap k v)
-> (NEMap k v -> NEMap k v)
-> MonoidalNEMap k v
-> MonoidalNEMap k v
forall a b. (a -> b) -> a -> b
$ (v -> v -> v) -> k -> v -> NEMap k v -> NEMap k v
forall k a.
Ord k =>
(a -> a -> a) -> k -> a -> NEMap k a -> NEMap k a
NEMap.insertWith v -> v -> v
forall a. Semigroup a => a -> a -> a
(<>) k
k v
v
{-# INLINE insert #-}

-- | Insert an new key,value pair into the Map
-- \(O(\log n)\)
insertReplace     :: Ord k => k -> v -> MonoidalNEMap k v -> MonoidalNEMap k v
insertReplace :: forall k v.
Ord k =>
k -> v -> MonoidalNEMap k v -> MonoidalNEMap k v
insertReplace k
k v
v = (NEMap k v -> NEMap k v) -> MonoidalNEMap k v -> MonoidalNEMap k v
forall a b. Coercible a b => a -> b
coerce ((NEMap k v -> NEMap k v)
 -> MonoidalNEMap k v -> MonoidalNEMap k v)
-> (NEMap k v -> NEMap k v)
-> MonoidalNEMap k v
-> MonoidalNEMap k v
forall a b. (a -> b) -> a -> b
$ k -> v -> NEMap k v -> NEMap k v
forall k a. Ord k => k -> a -> NEMap k a -> NEMap k a
NEMap.insert k
k v
v
{-# INLINE insertReplace #-}


infixl 9 !?
infixl 9 !

-- | Lookup in the Map
-- \(O(\log n)\)
(!?)   :: Ord k => MonoidalNEMap k v -> k -> Maybe v
!? :: forall k v. Ord k => MonoidalNEMap k v -> k -> Maybe v
(!?) MonoidalNEMap k v
m = NEMap k v -> k -> Maybe v
forall k a. Ord k => NEMap k a -> k -> Maybe a
(NEMap.!?) (MonoidalNEMap k v -> NEMap k v
forall a b. Coercible a b => a -> b
coerce MonoidalNEMap k v
m)
{-# INLINE (!?) #-}

-- | unsafe lookup in the Map
-- \(O(\log n)\)
(!)   :: Ord k => MonoidalNEMap k v -> k -> v
! :: forall k v. Ord k => MonoidalNEMap k v -> k -> v
(!) MonoidalNEMap k v
m = NEMap k v -> k -> v
forall k a. Ord k => NEMap k a -> k -> a
(NEMap.!) (MonoidalNEMap k v -> NEMap k v
forall a b. Coercible a b => a -> b
coerce MonoidalNEMap k v
m)
{-# INLINE (!) #-}