{-# LANGUAGE TypeSynonymInstances #-}

-- |
-- Copyright: © 2022–2023 Jonathan Knowles
-- License: Apache-2.0
--
-- A nested map with compound keys, implemented in terms of 'MonoidMap'.
--
module Examples.NestedMonoidMap
    (
    -- * Type
      NestedMonoidMap

    -- * Construction
    , fromFlatList
    , fromFlatMap
    , fromNestedList
    , fromNestedMap

    -- * Deconstruction
    , toFlatList
    , toFlatMap
    , toNestedList
    , toNestedMap

    -- * Basic operations
    , get
    , set
    , adjust
    , nullify

    -- * Membership
    , nonNullCount
    , nonNullKey
    , nonNullKeys

    -- * Intersection
    , intersection
    , intersectionWith

    -- * Union
    , union
    , unionWith

    -- * Comparison
    , isSubmapOf
    , isSubmapOfBy
    , disjoint
    , disjointBy
    )
    where

import Prelude

import Data.Map.Strict
    ( Map )
import Data.Monoid
    ( Sum (..) )
import Data.Monoid.GCD
    ( GCDMonoid, LeftGCDMonoid, OverlappingGCDMonoid, RightGCDMonoid )
import Data.Monoid.LCM
    ( LCMMonoid )
import Data.Monoid.Monus
    ( Monus )
import Data.Monoid.Null
    ( MonoidNull, PositiveMonoid )
import Data.MonoidMap
    ( MonoidMap )
import Data.Semigroup.Cancellative
    ( Cancellative
    , Commutative
    , LeftCancellative
    , LeftReductive
    , Reductive
    , RightCancellative
    , RightReductive
    )
import Data.Set
    ( Set )
import GHC.Exts
    ( IsList (..) )

import qualified Data.Foldable as F
import qualified Data.Map.Strict as Map
import qualified Data.MonoidMap as MonoidMap
import qualified Data.Set as Set

--------------------------------------------------------------------------------
-- Type
--------------------------------------------------------------------------------

newtype NestedMonoidMap k1 k2 v =
    NestedMonoidMap (MonoidMap k1 (MonoidMap k2 v))
    deriving stock NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k1 k2 v.
(Eq k1, Eq k2, Eq v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
/= :: NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
$c/= :: forall k1 k2 v.
(Eq k1, Eq k2, Eq v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
== :: NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
$c== :: forall k1 k2 v.
(Eq k1, Eq k2, Eq v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
Eq
    deriving newtype
        ( forall m.
LeftCancellative m
-> RightCancellative m -> Reductive m -> Cancellative m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
Reductive (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
LeftCancellative (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
RightCancellative (NestedMonoidMap k1 k2 v)
Cancellative
        , forall g. Semigroup g -> Commutative g
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v) =>
Semigroup (NestedMonoidMap k1 k2 v)
Commutative
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m.
Monoid m
-> Commutative m
-> Reductive m
-> LeftGCDMonoid m
-> RightGCDMonoid m
-> OverlappingGCDMonoid m
-> (m -> m -> m)
-> GCDMonoid m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
Commutative (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
LeftGCDMonoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
RightGCDMonoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
OverlappingGCDMonoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
Reductive (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
gcd :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$cgcd :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
GCDMonoid
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m. GCDMonoid m -> (m -> m -> m) -> LCMMonoid m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, LCMMonoid v) =>
GCDMonoid (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LCMMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
lcm :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$clcm :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LCMMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
LCMMonoid
        , forall m. LeftReductive m -> LeftCancellative m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
LeftReductive (NestedMonoidMap k1 k2 v)
LeftCancellative
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m.
Monoid m
-> LeftReductive m
-> (m -> m -> m)
-> (m -> m -> (m, m, m))
-> LeftGCDMonoid m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
LeftReductive (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stripCommonPrefix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
$cstripCommonPrefix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
commonPrefix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$ccommonPrefix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
LeftGCDMonoid
        , NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
forall m.
Semigroup m
-> (m -> m -> Bool) -> (m -> m -> Maybe m) -> LeftReductive m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
Semigroup (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
stripPrefix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
$cstripPrefix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
isPrefixOf :: NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
$cisPrefixOf :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LeftReductive v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
LeftReductive
        , NestedMonoidMap k1 k2 v
[NestedMonoidMap k1 k2 v] -> NestedMonoidMap k1 k2 v
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v) =>
Semigroup (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[NestedMonoidMap k1 k2 v] -> NestedMonoidMap k1 k2 v
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
mconcat :: [NestedMonoidMap k1 k2 v] -> NestedMonoidMap k1 k2 v
$cmconcat :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[NestedMonoidMap k1 k2 v] -> NestedMonoidMap k1 k2 v
mappend :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$cmappend :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
mempty :: NestedMonoidMap k1 k2 v
$cmempty :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
Monoid
        , NestedMonoidMap k1 k2 v -> Bool
forall m. Monoid m -> (m -> Bool) -> MonoidNull m
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> Bool
null :: NestedMonoidMap k1 k2 v -> Bool
$cnull :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> Bool
MonoidNull
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m.
Commutative m
-> Monoid m -> OverlappingGCDMonoid m -> (m -> m -> m) -> Monus m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Monus v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Monus v) =>
Commutative (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Monus v) =>
OverlappingGCDMonoid (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Monus v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
<\> :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$c<\> :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Monus v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
Monus
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m.
Monoid m
-> LeftReductive m
-> RightReductive m
-> (m -> m -> m)
-> (m -> m -> m)
-> (m -> m -> m)
-> (m -> m -> (m, m, m))
-> OverlappingGCDMonoid m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
LeftReductive (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
RightReductive (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stripOverlap :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
$cstripOverlap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
overlap :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$coverlap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stripSuffixOverlap :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$cstripSuffixOverlap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stripPrefixOverlap :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$cstripPrefixOverlap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, OverlappingGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
OverlappingGCDMonoid
        , forall m. MonoidNull m -> PositiveMonoid m
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
MonoidNull (NestedMonoidMap k1 k2 v)
PositiveMonoid
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
forall m.
Commutative m
-> LeftReductive m
-> RightReductive m
-> (m -> m -> Maybe m)
-> Reductive m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
Commutative (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
LeftReductive (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
RightReductive (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
</> :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
$c</> :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
Reductive
        , forall m. RightReductive m -> RightCancellative m
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
RightReductive (NestedMonoidMap k1 k2 v)
RightCancellative
        , NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall m.
Monoid m
-> RightReductive m
-> (m -> m -> m)
-> (m -> m -> (m, m, m))
-> RightGCDMonoid m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
Monoid (NestedMonoidMap k1 k2 v)
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
RightReductive (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stripCommonSuffix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
$cstripCommonSuffix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> (NestedMonoidMap k1 k2 v, NestedMonoidMap k1 k2 v,
    NestedMonoidMap k1 k2 v)
commonSuffix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$ccommonSuffix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightGCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
RightGCDMonoid
        , NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
forall m.
Semigroup m
-> (m -> m -> Bool) -> (m -> m -> Maybe m) -> RightReductive m
forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
Semigroup (NestedMonoidMap k1 k2 v)
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
stripSuffix :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
$cstripSuffix :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> Maybe (NestedMonoidMap k1 k2 v)
isSuffixOf :: NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
$cisSuffixOf :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, RightReductive v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
RightReductive
        , NonEmpty (NestedMonoidMap k1 k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall b.
Integral b =>
b -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NonEmpty (NestedMonoidMap k1 k2 v) -> NestedMonoidMap k1 k2 v
forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
forall k1 k2 v b.
(Ord k1, Ord k2, MonoidNull v, Integral b) =>
b -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
stimes :: forall b.
Integral b =>
b -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$cstimes :: forall k1 k2 v b.
(Ord k1, Ord k2, MonoidNull v, Integral b) =>
b -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
sconcat :: NonEmpty (NestedMonoidMap k1 k2 v) -> NestedMonoidMap k1 k2 v
$csconcat :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NonEmpty (NestedMonoidMap k1 k2 v) -> NestedMonoidMap k1 k2 v
<> :: NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
$c<> :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
Semigroup
        , Int -> NestedMonoidMap k1 k2 v -> ShowS
[NestedMonoidMap k1 k2 v] -> ShowS
NestedMonoidMap k1 k2 v -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k1 k2 v.
(Show k1, Show k2, Show v) =>
Int -> NestedMonoidMap k1 k2 v -> ShowS
forall k1 k2 v.
(Show k1, Show k2, Show v) =>
[NestedMonoidMap k1 k2 v] -> ShowS
forall k1 k2 v.
(Show k1, Show k2, Show v) =>
NestedMonoidMap k1 k2 v -> String
showList :: [NestedMonoidMap k1 k2 v] -> ShowS
$cshowList :: forall k1 k2 v.
(Show k1, Show k2, Show v) =>
[NestedMonoidMap k1 k2 v] -> ShowS
show :: NestedMonoidMap k1 k2 v -> String
$cshow :: forall k1 k2 v.
(Show k1, Show k2, Show v) =>
NestedMonoidMap k1 k2 v -> String
showsPrec :: Int -> NestedMonoidMap k1 k2 v -> ShowS
$cshowsPrec :: forall k1 k2 v.
(Show k1, Show k2, Show v) =>
Int -> NestedMonoidMap k1 k2 v -> ShowS
Show
        )

--------------------------------------------------------------------------------
-- Construction
--------------------------------------------------------------------------------

fromFlatList
    :: (Ord k1, Ord k2, MonoidNull v)
    => [((k1, k2), v)]
    -> NestedMonoidMap k1 k2 v
fromFlatList :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[((k1, k2), v)] -> NestedMonoidMap k1 k2 v
fromFlatList = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' forall {k1} {k2} {v}.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> ((k1, k2), v) -> NestedMonoidMap k1 k2 v
acc forall a. Monoid a => a
mempty
  where
    acc :: NestedMonoidMap k1 k2 v -> ((k1, k2), v) -> NestedMonoidMap k1 k2 v
acc NestedMonoidMap k1 k2 v
m ((k1
k1, k2
k2), v
v) = forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
(v -> v)
-> k1 -> k2 -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
adjust (forall a. Semigroup a => a -> a -> a
<> v
v) k1
k1 k2
k2 NestedMonoidMap k1 k2 v
m

fromFlatMap
    :: (Ord k1, Ord k2, MonoidNull v)
    => Map (k1, k2) v
    -> NestedMonoidMap k1 k2 v
fromFlatMap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
Map (k1, k2) v -> NestedMonoidMap k1 k2 v
fromFlatMap = forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[((k1, k2), v)] -> NestedMonoidMap k1 k2 v
fromFlatList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [(k, a)]
Map.toList

fromNestedList
    :: (Ord k1, Ord k2, MonoidNull v)
    => [(k1, [(k2, v)])]
    -> NestedMonoidMap k1 k2 v
fromNestedList :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[(k1, [(k2, v)])] -> NestedMonoidMap k1 k2 v
fromNestedList [(k1, [(k2, v)])]
entries =
    forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
[((k1, k2), v)] -> NestedMonoidMap k1 k2 v
fromFlatList [((k1
k1, k2
k2), v
v) | (k1
k1, [(k2, v)]
n) <- [(k1, [(k2, v)])]
entries, (k2
k2, v
v) <- [(k2, v)]
n]

fromNestedMap
    :: (Ord k2, MonoidNull v)
    => Map k1 (Map k2 v)
    -> NestedMonoidMap k1 k2 v
fromNestedMap :: forall k2 v k1.
(Ord k2, MonoidNull v) =>
Map k1 (Map k2 v) -> NestedMonoidMap k1 k2 v
fromNestedMap = forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall v k. MonoidNull v => Map k v -> MonoidMap k v
MonoidMap.fromMap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall v k. MonoidNull v => Map k v -> MonoidMap k v
MonoidMap.fromMap

--------------------------------------------------------------------------------
-- Deconstruction
--------------------------------------------------------------------------------

toFlatList
    :: (Ord k1, Ord k2, MonoidNull v)
    => NestedMonoidMap k1 k2 v
    -> [((k1, k2), v)]
toFlatList :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> [((k1, k2), v)]
toFlatList NestedMonoidMap k1 k2 v
m = [((k1
k1, k2
k2), v
v) | (k1
k1, [(k2, v)]
n) <- forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> [(k1, [(k2, v)])]
toNestedList NestedMonoidMap k1 k2 v
m, (k2
k2, v
v) <- forall l. IsList l => l -> [Item l]
toList [(k2, v)]
n]

toFlatMap
    :: (Ord k1, Ord k2, MonoidNull v)
    => NestedMonoidMap k1 k2 v
    -> Map (k1, k2) v
toFlatMap :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> Map (k1, k2) v
toFlatMap = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> [((k1, k2), v)]
toFlatList

toNestedList
    :: (Ord k1, Ord k2, MonoidNull v)
    => NestedMonoidMap k1 k2 v
    -> [(k1, [(k2, v)])]
toNestedList :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> [(k1, [(k2, v)])]
toNestedList (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall l. IsList l => l -> [Item l]
toList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall l. IsList l => l -> [Item l]
toList MonoidMap k1 (MonoidMap k2 v)
m

toNestedMap
    :: NestedMonoidMap k1 k2 v
    -> Map k1 (Map k2 v)
toNestedMap :: forall k1 k2 v. NestedMonoidMap k1 k2 v -> Map k1 (Map k2 v)
toNestedMap (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) = forall k v. MonoidMap k v -> Map k v
MonoidMap.toMap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall k v. MonoidMap k v -> Map k v
MonoidMap.toMap MonoidMap k1 (MonoidMap k2 v)
m

--------------------------------------------------------------------------------
-- Basic operations
--------------------------------------------------------------------------------

get :: (Ord k1, Ord k2, MonoidNull v)
    => k1
    -> k2
    -> NestedMonoidMap k1 k2 v
    -> v
get :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
k1 -> k2 -> NestedMonoidMap k1 k2 v -> v
get k1
k1 k2
k2 (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) = forall k v. (Ord k, Monoid v) => k -> MonoidMap k v -> v
MonoidMap.get k2
k2 (forall k v. (Ord k, Monoid v) => k -> MonoidMap k v -> v
MonoidMap.get k1
k1 MonoidMap k1 (MonoidMap k2 v)
m)

set :: (Ord k1, Ord k2, MonoidNull v)
    => k1
    -> k2
    -> v
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
set :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
k1 -> k2 -> v -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
set k1
k1 k2
k2 v
v (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) =
    forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$ forall k v.
(Ord k, MonoidNull v) =>
(v -> v) -> k -> MonoidMap k v -> MonoidMap k v
MonoidMap.adjust (forall k v.
(Ord k, MonoidNull v) =>
k -> v -> MonoidMap k v -> MonoidMap k v
MonoidMap.set k2
k2 v
v) k1
k1 MonoidMap k1 (MonoidMap k2 v)
m

adjust
    :: (Ord k1, Ord k2, MonoidNull v)
    => (v -> v)
    -> k1
    -> k2
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
adjust :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
(v -> v)
-> k1 -> k2 -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
adjust v -> v
f k1
k1 k2
k2 (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) =
    forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$ forall k v.
(Ord k, MonoidNull v) =>
(v -> v) -> k -> MonoidMap k v -> MonoidMap k v
MonoidMap.adjust (forall k v.
(Ord k, MonoidNull v) =>
(v -> v) -> k -> MonoidMap k v -> MonoidMap k v
MonoidMap.adjust v -> v
f k2
k2) k1
k1 MonoidMap k1 (MonoidMap k2 v)
m

nullify
    :: (Ord k1, Ord k2, MonoidNull v)
    => k1
    -> k2
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
nullify :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
k1 -> k2 -> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
nullify k1
k1 k2
k2 (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) =
    forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$ forall k v.
(Ord k, MonoidNull v) =>
(v -> v) -> k -> MonoidMap k v -> MonoidMap k v
MonoidMap.adjust (forall k v. Ord k => k -> MonoidMap k v -> MonoidMap k v
MonoidMap.nullify k2
k2) k1
k1 MonoidMap k1 (MonoidMap k2 v)
m

--------------------------------------------------------------------------------
-- Membership
--------------------------------------------------------------------------------

nonNullCount :: NestedMonoidMap k1 k2 v -> Int
nonNullCount :: forall k1 k2 v. NestedMonoidMap k1 k2 v -> Int
nonNullCount (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) =
    forall a. Sum a -> a
getSum forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
F.foldMap (forall a. a -> Sum a
Sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k v. MonoidMap k v -> Int
MonoidMap.nonNullCount) MonoidMap k1 (MonoidMap k2 v)
m

nonNullKey
    :: (Ord k1, Ord k2, MonoidNull v)
    => k1
    -> k2
    -> NestedMonoidMap k1 k2 v
    -> Bool
nonNullKey :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
k1 -> k2 -> NestedMonoidMap k1 k2 v -> Bool
nonNullKey k1
k1 k2
k2 (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m) =
    forall k v. Ord k => k -> MonoidMap k v -> Bool
MonoidMap.nonNullKey k2
k2 (forall k v. (Ord k, Monoid v) => k -> MonoidMap k v -> v
MonoidMap.get k1
k1 MonoidMap k1 (MonoidMap k2 v)
m)

nonNullKeys
    :: (Ord k1, Ord k2, MonoidNull v)
    => NestedMonoidMap k1 k2 v
    -> Set (k1, k2)
nonNullKeys :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> Set (k1, k2)
nonNullKeys = forall a. Ord a => [a] -> Set a
Set.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
NestedMonoidMap k1 k2 v -> [((k1, k2), v)]
toFlatList

--------------------------------------------------------------------------------
-- Intersection
--------------------------------------------------------------------------------

intersection
    :: (Ord k1, Ord k2, MonoidNull v, GCDMonoid v)
    => NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
intersection :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
intersection (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) = forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$
    forall k v.
(Ord k, MonoidNull v, GCDMonoid v) =>
MonoidMap k v -> MonoidMap k v -> MonoidMap k v
MonoidMap.intersection MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

intersectionWith
    :: (Ord k1, Ord k2, MonoidNull v)
    => (v -> v -> v)
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
intersectionWith :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
(v -> v -> v)
-> NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
intersectionWith v -> v -> v
f (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) = forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$
    forall k v3 v1 v2.
(Ord k, MonoidNull v3) =>
(v1 -> v2 -> v3)
-> MonoidMap k v1 -> MonoidMap k v2 -> MonoidMap k v3
MonoidMap.intersectionWith (forall k v3 v1 v2.
(Ord k, MonoidNull v3) =>
(v1 -> v2 -> v3)
-> MonoidMap k v1 -> MonoidMap k v2 -> MonoidMap k v3
MonoidMap.intersectionWith v -> v -> v
f) MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

--------------------------------------------------------------------------------
-- Union
--------------------------------------------------------------------------------

union
    :: (Ord k1, Ord k2, MonoidNull v, LCMMonoid v)
    => NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
union :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, LCMMonoid v) =>
NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v
union (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) = forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$
    forall k v.
(Ord k, MonoidNull v, LCMMonoid v) =>
MonoidMap k v -> MonoidMap k v -> MonoidMap k v
MonoidMap.union MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

unionWith
    :: (Ord k1, Ord k2, MonoidNull v)
    => (v -> v -> v)
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
unionWith :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v) =>
(v -> v -> v)
-> NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
-> NestedMonoidMap k1 k2 v
unionWith v -> v -> v
f (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) = forall k1 k2 v.
MonoidMap k1 (MonoidMap k2 v) -> NestedMonoidMap k1 k2 v
NestedMonoidMap forall a b. (a -> b) -> a -> b
$
    forall k v1 v2 v3.
(Ord k, Monoid v1, Monoid v2, MonoidNull v3) =>
(v1 -> v2 -> v3)
-> MonoidMap k v1 -> MonoidMap k v2 -> MonoidMap k v3
MonoidMap.unionWith (forall k v1 v2 v3.
(Ord k, Monoid v1, Monoid v2, MonoidNull v3) =>
(v1 -> v2 -> v3)
-> MonoidMap k v1 -> MonoidMap k v2 -> MonoidMap k v3
MonoidMap.unionWith v -> v -> v
f) MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

--------------------------------------------------------------------------------
-- Comparison
--------------------------------------------------------------------------------

isSubmapOf
    :: (Ord k1, Ord k2, MonoidNull v, Reductive v)
    => NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> Bool
isSubmapOf :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
isSubmapOf (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) =
    forall k v.
(Ord k, Monoid v, Reductive v) =>
MonoidMap k v -> MonoidMap k v -> Bool
MonoidMap.isSubmapOf MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

isSubmapOfBy
    :: (Ord k1, Ord k2, MonoidNull v, Reductive v)
    => (v -> v -> Bool)
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> Bool
isSubmapOfBy :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, Reductive v) =>
(v -> v -> Bool)
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
isSubmapOfBy v -> v -> Bool
f (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) =
    forall k v1 v2.
(Ord k, Monoid v1, Monoid v2) =>
(v1 -> v2 -> Bool) -> MonoidMap k v1 -> MonoidMap k v2 -> Bool
MonoidMap.isSubmapOfBy (forall k v1 v2.
(Ord k, Monoid v1, Monoid v2) =>
(v1 -> v2 -> Bool) -> MonoidMap k v1 -> MonoidMap k v2 -> Bool
MonoidMap.isSubmapOfBy v -> v -> Bool
f) MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

disjoint
    :: (Ord k1, Ord k2, MonoidNull v, GCDMonoid v)
    => NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> Bool
disjoint :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
disjoint (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) =
    forall k v.
(Ord k, GCDMonoid v, MonoidNull v) =>
MonoidMap k v -> MonoidMap k v -> Bool
MonoidMap.disjoint MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2

disjointBy
    :: (Ord k1, Ord k2, MonoidNull v, GCDMonoid v)
    => (v -> v -> Bool)
    -> NestedMonoidMap k1 k2 v
    -> NestedMonoidMap k1 k2 v
    -> Bool
disjointBy :: forall k1 k2 v.
(Ord k1, Ord k2, MonoidNull v, GCDMonoid v) =>
(v -> v -> Bool)
-> NestedMonoidMap k1 k2 v -> NestedMonoidMap k1 k2 v -> Bool
disjointBy v -> v -> Bool
f (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m1) (NestedMonoidMap MonoidMap k1 (MonoidMap k2 v)
m2) =
    forall k v1 v2.
(Ord k, Monoid v1, Monoid v2) =>
(v1 -> v2 -> Bool) -> MonoidMap k v1 -> MonoidMap k v2 -> Bool
MonoidMap.disjointBy (forall k v1 v2.
(Ord k, Monoid v1, Monoid v2) =>
(v1 -> v2 -> Bool) -> MonoidMap k v1 -> MonoidMap k v2 -> Bool
MonoidMap.disjointBy v -> v -> Bool
f) MonoidMap k1 (MonoidMap k2 v)
m1 MonoidMap k1 (MonoidMap k2 v)
m2