{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.HashMap.Common.Refined where
import Control.Monad.Reader
import Control.DeepSeq
import Data.Coerce
import Data.Constraint (Dict(..))
import Data.Container.Refined.Hashable
import Data.Container.Refined.Proofs
import Data.Container.Refined.Unsafe
import Data.Distributive
import Data.Foldable.WithIndex
import Data.Functor.Rep
import Data.Functor.WithIndex
import qualified Data.Hashable as Hashable
import qualified Data.HashMap.Lazy as HashMap
import qualified Data.HashMap.Strict as HashMapStrict
import qualified Data.HashSet as HashSet
import Data.Proxy
import Data.Reflection
import Data.Traversable.WithIndex
import Data.Type.Coercion
import Data.Type.Equality ((:~:)(..))
import Refined
import Refined.Unsafe
import Unsafe.Coerce
#if MIN_VERSION_unordered_containers(0, 2, 12)
#else
import Data.Monoid (All(..))
#endif
newtype HashMap s k a = HashMap (HashMap.HashMap k a)
deriving newtype (HashMap s k a -> HashMap s k a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall s k a.
(Eq k, Eq a) =>
HashMap s k a -> HashMap s k a -> Bool
/= :: HashMap s k a -> HashMap s k a -> Bool
$c/= :: forall s k a.
(Eq k, Eq a) =>
HashMap s k a -> HashMap s k a -> Bool
== :: HashMap s k a -> HashMap s k a -> Bool
$c== :: forall s k a.
(Eq k, Eq a) =>
HashMap s k a -> HashMap s k a -> Bool
Eq, HashMap s k a -> HashMap s k a -> Bool
HashMap s k a -> HashMap s k a -> Ordering
HashMap s k a -> HashMap s k a -> HashMap s k a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {s} {k} {a}. (Ord k, Ord a) => Eq (HashMap s k a)
forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Bool
forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Ordering
forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> HashMap s k a
min :: HashMap s k a -> HashMap s k a -> HashMap s k a
$cmin :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> HashMap s k a
max :: HashMap s k a -> HashMap s k a -> HashMap s k a
$cmax :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> HashMap s k a
>= :: HashMap s k a -> HashMap s k a -> Bool
$c>= :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Bool
> :: HashMap s k a -> HashMap s k a -> Bool
$c> :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Bool
<= :: HashMap s k a -> HashMap s k a -> Bool
$c<= :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Bool
< :: HashMap s k a -> HashMap s k a -> Bool
$c< :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Bool
compare :: HashMap s k a -> HashMap s k a -> Ordering
$ccompare :: forall s k a.
(Ord k, Ord a) =>
HashMap s k a -> HashMap s k a -> Ordering
Ord, Int -> HashMap s k a -> ShowS
[HashMap s k a] -> ShowS
HashMap s k a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall s k a. (Show k, Show a) => Int -> HashMap s k a -> ShowS
forall s k a. (Show k, Show a) => [HashMap s k a] -> ShowS
forall s k a. (Show k, Show a) => HashMap s k a -> String
showList :: [HashMap s k a] -> ShowS
$cshowList :: forall s k a. (Show k, Show a) => [HashMap s k a] -> ShowS
show :: HashMap s k a -> String
$cshow :: forall s k a. (Show k, Show a) => HashMap s k a -> String
showsPrec :: Int -> HashMap s k a -> ShowS
$cshowsPrec :: forall s k a. (Show k, Show a) => Int -> HashMap s k a -> ShowS
Show, forall a b. a -> HashMap s k b -> HashMap s k a
forall a b. (a -> b) -> HashMap s k a -> HashMap s k b
forall s k a b. a -> HashMap s k b -> HashMap s k a
forall s k a b. (a -> b) -> HashMap s k a -> HashMap s k b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> HashMap s k b -> HashMap s k a
$c<$ :: forall s k a b. a -> HashMap s k b -> HashMap s k a
fmap :: forall a b. (a -> b) -> HashMap s k a -> HashMap s k b
$cfmap :: forall s k a b. (a -> b) -> HashMap s k a -> HashMap s k b
Functor, forall a. Eq a => a -> HashMap s k a -> Bool
forall a. Num a => HashMap s k a -> a
forall a. Ord a => HashMap s k a -> a
forall m. Monoid m => HashMap s k m -> m
forall a. HashMap s k a -> Bool
forall a. HashMap s k a -> Int
forall a. HashMap s k a -> [a]
forall a. (a -> a -> a) -> HashMap s k a -> a
forall m a. Monoid m => (a -> m) -> HashMap s k a -> m
forall b a. (b -> a -> b) -> b -> HashMap s k a -> b
forall a b. (a -> b -> b) -> b -> HashMap s k a -> b
forall s k a. Eq a => a -> HashMap s k a -> Bool
forall s k a. Num a => HashMap s k a -> a
forall s k a. Ord a => HashMap s k a -> a
forall s k m. Monoid m => HashMap s k m -> m
forall s k a. HashMap s k a -> Bool
forall s k a. HashMap s k a -> Int
forall s k a. HashMap s k a -> [a]
forall s k a. (a -> a -> a) -> HashMap s k a -> a
forall s k m a. Monoid m => (a -> m) -> HashMap s k a -> m
forall s k b a. (b -> a -> b) -> b -> HashMap s k a -> b
forall s k a b. (a -> b -> b) -> b -> HashMap s 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
product :: forall a. Num a => HashMap s k a -> a
$cproduct :: forall s k a. Num a => HashMap s k a -> a
sum :: forall a. Num a => HashMap s k a -> a
$csum :: forall s k a. Num a => HashMap s k a -> a
minimum :: forall a. Ord a => HashMap s k a -> a
$cminimum :: forall s k a. Ord a => HashMap s k a -> a
maximum :: forall a. Ord a => HashMap s k a -> a
$cmaximum :: forall s k a. Ord a => HashMap s k a -> a
elem :: forall a. Eq a => a -> HashMap s k a -> Bool
$celem :: forall s k a. Eq a => a -> HashMap s k a -> Bool
length :: forall a. HashMap s k a -> Int
$clength :: forall s k a. HashMap s k a -> Int
null :: forall a. HashMap s k a -> Bool
$cnull :: forall s k a. HashMap s k a -> Bool
toList :: forall a. HashMap s k a -> [a]
$ctoList :: forall s k a. HashMap s k a -> [a]
foldl1 :: forall a. (a -> a -> a) -> HashMap s k a -> a
$cfoldl1 :: forall s k a. (a -> a -> a) -> HashMap s k a -> a
foldr1 :: forall a. (a -> a -> a) -> HashMap s k a -> a
$cfoldr1 :: forall s k a. (a -> a -> a) -> HashMap s k a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> HashMap s k a -> b
$cfoldl' :: forall s k b a. (b -> a -> b) -> b -> HashMap s k a -> b
foldl :: forall b a. (b -> a -> b) -> b -> HashMap s k a -> b
$cfoldl :: forall s k b a. (b -> a -> b) -> b -> HashMap s k a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> HashMap s k a -> b
$cfoldr' :: forall s k a b. (a -> b -> b) -> b -> HashMap s k a -> b
foldr :: forall a b. (a -> b -> b) -> b -> HashMap s k a -> b
$cfoldr :: forall s k a b. (a -> b -> b) -> b -> HashMap s k a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> HashMap s k a -> m
$cfoldMap' :: forall s k m a. Monoid m => (a -> m) -> HashMap s k a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> HashMap s k a -> m
$cfoldMap :: forall s k m a. Monoid m => (a -> m) -> HashMap s k a -> m
fold :: forall m. Monoid m => HashMap s k m -> m
$cfold :: forall s k m. Monoid m => HashMap s k m -> m
Foldable, Int -> HashMap s k a -> Int
HashMap s k a -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
forall {s} {k} {a}. (Hashable k, Hashable a) => Eq (HashMap s k a)
forall s k a.
(Hashable k, Hashable a) =>
Int -> HashMap s k a -> Int
forall s k a. (Hashable k, Hashable a) => HashMap s k a -> Int
hash :: HashMap s k a -> Int
$chash :: forall s k a. (Hashable k, Hashable a) => HashMap s k a -> Int
hashWithSalt :: Int -> HashMap s k a -> Int
$chashWithSalt :: forall s k a.
(Hashable k, Hashable a) =>
Int -> HashMap s k a -> Int
Hashable.Hashable, HashMap s k a -> ()
forall a. (a -> ()) -> NFData a
forall s k a. (NFData k, NFData a) => HashMap s k a -> ()
rnf :: HashMap s k a -> ()
$crnf :: forall s k a. (NFData k, NFData a) => HashMap s k a -> ()
NFData)
deriving stock (forall s k. Functor (HashMap s k)
forall s k. Foldable (HashMap s k)
forall s k (m :: * -> *) a.
Monad m =>
HashMap s k (m a) -> m (HashMap s k a)
forall s k (f :: * -> *) a.
Applicative f =>
HashMap s k (f a) -> f (HashMap s k a)
forall s k (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HashMap s k a -> m (HashMap s k b)
forall s k (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HashMap s k a -> f (HashMap s k b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HashMap s k a -> f (HashMap s k b)
sequence :: forall (m :: * -> *) a.
Monad m =>
HashMap s k (m a) -> m (HashMap s k a)
$csequence :: forall s k (m :: * -> *) a.
Monad m =>
HashMap s k (m a) -> m (HashMap s k a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HashMap s k a -> m (HashMap s k b)
$cmapM :: forall s k (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HashMap s k a -> m (HashMap s k b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
HashMap s k (f a) -> f (HashMap s k a)
$csequenceA :: forall s k (f :: * -> *) a.
Applicative f =>
HashMap s k (f a) -> f (HashMap s k a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HashMap s k a -> f (HashMap s k b)
$ctraverse :: forall s k (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HashMap s k a -> f (HashMap s k b)
Traversable)
type role HashMap nominal nominal representational
toMap :: forall s k a. HashMap s k a -> HashMap.HashMap k a
toMap :: forall s k a. HashMap s k a -> HashMap k a
toMap (HashMap HashMap k a
m) = HashMap k a
m
type Key s = Refined (InSet 'Hashed s)
unsafeCastKey :: forall s k. Coercion k (Key s k)
unsafeCastKey :: forall s k. Coercion k (Key s k)
unsafeCastKey = forall {k} x (p :: k). Coercion x (Refined p x)
reallyUnsafeUnderlyingRefined
unsafeKey :: k -> Key s k
unsafeKey :: forall k s. k -> Key s k
unsafeKey = forall a b. Coercion a b -> a -> b
coerceWith forall s k. Coercion k (Key s k)
unsafeCastKey
data SomeHashMap k a where
SomeHashMap :: forall s k a. !(HashMap s k a) -> SomeHashMap k a
withHashMap
:: forall k a r. SomeHashMap k a -> (forall s. HashMap s k a -> r) -> r
withHashMap :: forall k a r.
SomeHashMap k a -> (forall s. HashMap s k a -> r) -> r
withHashMap (SomeHashMap HashMap s k a
m) forall s. HashMap s k a -> r
k = forall s. HashMap s k a -> r
k HashMap s k a
m
fromHashMap :: forall k a. HashMap.HashMap k a -> SomeHashMap k a
fromHashMap :: forall k a. HashMap k a -> SomeHashMap k a
fromHashMap HashMap k a
m = forall s k a. HashMap s k a -> SomeHashMap k a
SomeHashMap (forall s k a. HashMap k a -> HashMap s k a
HashMap HashMap k a
m)
data SomeHashMapWith p k a where
SomeHashMapWith
:: forall s k a p. !(HashMap s k a) -> !(p s) -> SomeHashMapWith p k a
withHashMapWith
:: forall k a r p. SomeHashMapWith p k a
-> (forall s. HashMap s k a -> p s -> r)
-> r
withHashMapWith :: forall k a r (p :: * -> *).
SomeHashMapWith p k a -> (forall s. HashMap s k a -> p s -> r) -> r
withHashMapWith (SomeHashMapWith HashMap s k a
m p s
p) forall s. HashMap s k a -> p s -> r
k = forall s. HashMap s k a -> p s -> r
k HashMap s k a
m p s
p
data Some2HashMapWith p k a b where
Some2HashMapWith
:: forall s t k a b p. !(HashMap s k a)
-> !(HashMap t k b)
-> !(p s t)
-> Some2HashMapWith p k a b
with2HashMapWith
:: forall k a b r p. Some2HashMapWith p k a b
-> (forall s t. HashMap s k a -> HashMap t k b -> p s t -> r)
-> r
with2HashMapWith :: forall k a b r (p :: * -> * -> *).
Some2HashMapWith p k a b
-> (forall s t. HashMap s k a -> HashMap t k b -> p s t -> r) -> r
with2HashMapWith (Some2HashMapWith HashMap s k a
m1 HashMap t k b
m2 p s t
p) forall s t. HashMap s k a -> HashMap t k b -> p s t -> r
k = forall s t. HashMap s k a -> HashMap t k b -> p s t -> r
k HashMap s k a
m1 HashMap t k b
m2 p s t
p
empty :: forall k a. SomeHashMapWith (EmptyProof 'Hashed) k a
empty :: forall k a. SomeHashMapWith (EmptyProof 'Hashed) k a
empty = forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith (forall s k a. HashMap k a -> HashMap s k a
HashMap forall k v. HashMap k v
HashMap.empty) forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) r.
(forall s. InSet f r :-> InSet f s) -> EmptyProof f r
EmptyProof forall p q. p :-> q
unsafeSubset
fromSet :: forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet :: forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet Key s k -> a
f = forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v1 v2. (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
HashMap.mapWithKey (\k
k ()
_ -> Key s k -> a
f forall a b. (a -> b) -> a -> b
$ forall k s. k -> Key s k
unsafeKey k
k)
forall a b. (a -> b) -> a -> b
$ forall a. HashSet a -> HashMap a ()
HashSet.toMap (forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s)
delete
:: forall s k a. Hashable k
=> k -> HashMap s k a -> SomeHashMapWith (SupersetProof 'Hashed s) k a
delete :: forall s k a.
Hashable k =>
k -> HashMap s k a -> SomeHashMapWith (SupersetProof 'Hashed s) k a
delete k
k (HashMap HashMap k a
m) = forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith (forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (Eq k, Hashable k) => k -> HashMap k v -> HashMap k v
HashMap.delete k
k HashMap k a
m)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s r.
(InSet f r :-> InSet f s) -> SupersetProof f s r
SupersetProof forall p q. p :-> q
unsafeSubset
lookup :: forall s k a. Hashable k => k -> HashMap s k a -> Maybe (Key s k, a)
lookup :: forall s k a.
Hashable k =>
k -> HashMap s k a -> Maybe (Key s k, a)
lookup k
k (HashMap HashMap k a
m) = (forall k s. k -> Key s k
unsafeKey k
k,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup k
k HashMap k a
m
(!) :: forall s k a. Hashable k => HashMap s k a -> Key s k -> a
! :: forall s k a. Hashable k => HashMap s k a -> Key s k -> a
(!) (HashMap HashMap k a
m) Key s k
k = case forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup (forall {k} (p :: k) x. Refined p x -> x
unrefine Key s k
k) HashMap k a
m of
Maybe a
Nothing -> forall a. HasCallStack => String -> a
error String
"(!): bug: Data.HashMap.Refined has been subverted"
Just a
x -> a
x
member :: forall s k a. Hashable k => k -> HashMap s k a -> Maybe (Key s k)
member :: forall s k a. Hashable k => k -> HashMap s k a -> Maybe (Key s k)
member k
k (HashMap HashMap k a
m)
| k
k forall k a. (Eq k, Hashable k) => k -> HashMap k a -> Bool
`HashMap.member` HashMap k a
m = forall a. a -> Maybe a
Just (forall k s. k -> Key s k
unsafeKey k
k)
| Bool
otherwise = forall a. Maybe a
Nothing
null :: forall s k a. HashMap s k a -> Maybe (EmptyProof 'Hashed s)
null :: forall s k a. HashMap s k a -> Maybe (EmptyProof 'Hashed s)
null (HashMap HashMap k a
m)
| forall k v. HashMap k v -> Bool
HashMap.null HashMap k a
m = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) r.
(forall s. InSet f r :-> InSet f s) -> EmptyProof f r
EmptyProof forall p q. p :-> q
unsafeSubset
| Bool
otherwise = forall a. Maybe a
Nothing
isSubmapOfBy
:: forall s t k a b. Hashable k
=> (a -> b -> Bool)
-> HashMap s k a
-> HashMap t k b
-> Maybe (SubsetProof 'Hashed s t)
isSubmapOfBy :: forall s t k a b.
Hashable k =>
(a -> b -> Bool)
-> HashMap s k a
-> HashMap t k b
-> Maybe (SubsetProof 'Hashed s t)
isSubmapOfBy a -> b -> Bool
f (HashMap HashMap k a
m1) (HashMap HashMap k b
m2)
#if MIN_VERSION_unordered_containers(0, 2, 12)
| forall k v1 v2.
(Eq k, Hashable k) =>
(v1 -> v2 -> Bool) -> HashMap k v1 -> HashMap k v2 -> Bool
HashMap.isSubmapOfBy a -> b -> Bool
f HashMap k a
m1 HashMap k b
m2
#else
| All True <- flip HashMap.foldMapWithKey m1
\k v1 -> case HashMap.lookup k m2 of
Just v2 | f v1 v2 -> mempty
_ -> All False
#endif
= forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s r.
(InSet f s :-> InSet f r) -> SubsetProof f s r
SubsetProof forall p q. p :-> q
unsafeSubset
| Bool
otherwise = forall a. Maybe a
Nothing
disjoint
:: forall s t k a b. Hashable k
=> HashMap s k a -> HashMap t k b -> Maybe (DisjointProof 'Hashed s t)
disjoint :: forall s t k a b.
Hashable k =>
HashMap s k a -> HashMap t k b -> Maybe (DisjointProof 'Hashed s t)
disjoint (HashMap HashMap k a
m1) (HashMap HashMap k b
m2)
| forall k v. HashMap k v -> Bool
HashMap.null forall a b. (a -> b) -> a -> b
$ forall k v1 v2 v3.
(Eq k, Hashable k) =>
(v1 -> v2 -> v3) -> HashMap k v1 -> HashMap k v2 -> HashMap k v3
HashMapStrict.intersectionWith (\a
_ b
_ -> ()) HashMap k a
m1 HashMap k b
m2
= forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s r.
(forall t.
(InSet f t :-> InSet f s)
-> (InSet f t :-> InSet f r) -> forall u. InSet f t :-> InSet f u)
-> DisjointProof f s r
DisjointProof \InSet 'Hashed t :-> InSet 'Hashed s
f InSet 'Hashed t :-> InSet 'Hashed t
g -> forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2 InSet 'Hashed t :-> InSet 'Hashed s
f InSet 'Hashed t :-> InSet 'Hashed t
g
| Bool
otherwise = forall a. Maybe a
Nothing
zipWithKey
:: forall s k a b c. Hashable k
=> (Key s k -> a -> b -> c) -> HashMap s k a -> HashMap s k b -> HashMap s k c
zipWithKey :: forall s k a b c.
Hashable k =>
(Key s k -> a -> b -> c)
-> HashMap s k a -> HashMap s k b -> HashMap s k c
zipWithKey Key s k -> a -> b -> c
f (HashMap HashMap k a
m1) (HashMap HashMap k b
m2) = forall s k a. HashMap k a -> HashMap s k a
HashMap
forall a b. (a -> b) -> a -> b
$ forall k v1 v2 v3.
(Eq k, Hashable k) =>
(k -> v1 -> v2 -> v3)
-> HashMap k v1 -> HashMap k v2 -> HashMap k v3
HashMap.intersectionWithKey (Key s k -> a -> b -> c
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k s. k -> Key s k
unsafeKey) HashMap k a
m1 HashMap k b
m2
difference
:: forall s t k a b. Hashable k
=> HashMap s k a
-> HashMap t k b
-> SomeHashMapWith (DifferenceProof 'Hashed s t) k a
difference :: forall s t k a b.
Hashable k =>
HashMap s k a
-> HashMap t k b
-> SomeHashMapWith (DifferenceProof 'Hashed s t) k a
difference (HashMap HashMap k a
m1) (HashMap HashMap k b
m2)
= forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith (forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v w.
(Eq k, Hashable k) =>
HashMap k v -> HashMap k w -> HashMap k v
HashMap.difference HashMap k a
m1 HashMap k b
m2)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s t r.
(InSet f r :-> InSet f s)
-> (forall u.
(InSet f u :-> InSet f r)
-> (InSet f u :-> InSet f t) -> forall v. InSet f u :-> InSet f v)
-> (InSet f s :-> (InSet f t || InSet f r))
-> DifferenceProof f s t r
DifferenceProof forall p q. p :-> q
unsafeSubset (\InSet 'Hashed u :-> InSet 'Hashed Any
f InSet 'Hashed u :-> InSet 'Hashed t
g -> forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2 InSet 'Hashed u :-> InSet 'Hashed Any
f InSet 'Hashed u :-> InSet 'Hashed t
g) forall p q. p :-> q
unsafeSubset
mapWithKey
:: forall s k a b. (Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
mapWithKey :: forall s k a b.
(Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
mapWithKey = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall k v1 v2. (k -> v1 -> v2) -> HashMap k v1 -> HashMap k v2
HashMap.mapWithKey @k @a @b
traverseWithKey
:: forall s f k a b. Applicative f
=> (Key s k -> a -> f b) -> HashMap s k a -> f (HashMap s k b)
traverseWithKey :: forall s (f :: * -> *) k a b.
Applicative f =>
(Key s k -> a -> f b) -> HashMap s k a -> f (HashMap s k b)
traverseWithKey Key s k -> a -> f b
f (HashMap HashMap k a
m)
= forall s k a. HashMap k a -> HashMap s k a
HashMap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) k v1 v2.
Applicative f =>
(k -> v1 -> f v2) -> HashMap k v1 -> f (HashMap k v2)
HashMap.traverseWithKey (Key s k -> a -> f b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k s. k -> Key s k
unsafeKey) HashMap k a
m
foldMapWithKey
:: forall s k a m. Monoid m => (Key s k -> a -> m) -> HashMap s k a -> m
foldMapWithKey :: forall s k a m.
Monoid m =>
(Key s k -> a -> m) -> HashMap s k a -> m
foldMapWithKey = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall m k v. Monoid m => (k -> v -> m) -> HashMap k v -> m
HashMap.foldMapWithKey @m @k @a
foldrWithKey
:: forall s k a b. (Key s k -> a -> b -> b) -> b -> HashMap s k a -> b
foldrWithKey :: forall s k a b. (Key s k -> a -> b -> b) -> b -> HashMap s k a -> b
foldrWithKey = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall k v a. (k -> v -> a -> a) -> a -> HashMap k v -> a
HashMap.foldrWithKey @k @a @b
foldlWithKey
:: forall s k a b. (b -> Key s k -> a -> b) -> b -> HashMap s k a -> b
foldlWithKey :: forall s k a b. (b -> Key s k -> a -> b) -> b -> HashMap s k a -> b
foldlWithKey = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall a k v. (a -> k -> v -> a) -> a -> HashMap k v -> a
HashMap.foldlWithKey @b @k @a
foldrWithKey'
:: forall s k a b. (Key s k -> a -> b -> b) -> b -> HashMap s k a -> b
foldrWithKey' :: forall s k a b. (Key s k -> a -> b -> b) -> b -> HashMap s k a -> b
foldrWithKey' = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall k v a. (k -> v -> a -> a) -> a -> HashMap k v -> a
HashMap.foldrWithKey' @k @a @b
foldlWithKey'
:: forall s k a b. (b -> Key s k -> a -> b) -> b -> HashMap s k a -> b
foldlWithKey' :: forall s k a b. (b -> Key s k -> a -> b) -> b -> HashMap s k a -> b
foldlWithKey' = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce
forall a b. (a -> b) -> a -> b
$ forall a k v. (a -> k -> v -> a) -> a -> HashMap k v -> a
HashMap.foldlWithKey' @b @k @a
keysSet :: forall s k a. HashMap s k a -> HashSet s k
keysSet :: forall s k a. HashMap s k a -> HashSet s k
keysSet (HashMap HashMap k a
m) = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall k a. HashMap k a -> HashSet k
HashMap.keysSet HashMap k a
m)
\(Proxy s
_ :: Proxy s') -> case forall a b. a -> b
unsafeCoerce forall {k} (a :: k). a :~: a
Refl :: s :~: s' of
s :~: s
Refl -> forall (a :: Constraint). a => Dict a
Dict
toList :: forall s k a. HashMap s k a -> [(Key s k, a)]
toList :: forall s k a. HashMap s k a -> [(Key s k, a)]
toList = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s k. Coercion k (Key s k)
unsafeCastKey @s @k) forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce forall a b. (a -> b) -> a -> b
$ forall k v. HashMap k v -> [(k, v)]
HashMap.toList @k @a
filterWithKey
:: forall s k a. (Key s k -> a -> Bool)
-> HashMap s k a
-> SomeHashMapWith (SupersetProof 'Hashed s) k a
filterWithKey :: forall s k a.
(Key s k -> a -> Bool)
-> HashMap s k a -> SomeHashMapWith (SupersetProof 'Hashed s) k a
filterWithKey Key s k -> a -> Bool
p (HashMap HashMap k a
m)
= forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith (forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (k -> v -> Bool) -> HashMap k v -> HashMap k v
HashMap.filterWithKey (Key s k -> a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k s. k -> Key s k
unsafeKey) HashMap k a
m)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s r.
(InSet f r :-> InSet f s) -> SupersetProof f s r
SupersetProof forall p q. p :-> q
unsafeSubset
restrictKeys
:: forall s t k a. (Hashable k, KnownHashSet t k)
=> HashMap s k a -> SomeHashMapWith (IntersectionProof 'Hashed s t) k a
restrictKeys :: forall s t k a.
(Hashable k, KnownHashSet t k) =>
HashMap s k a
-> SomeHashMapWith (IntersectionProof 'Hashed s t) k a
restrictKeys (HashMap HashMap k a
m) = forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith
(forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v1 v2 v3.
(Eq k, Hashable k) =>
(v1 -> v2 -> v3) -> HashMap k v1 -> HashMap k v2 -> HashMap k v3
HashMap.intersectionWith forall a b. a -> b -> a
const HashMap k a
m
forall a b. (a -> b) -> a -> b
$ forall a. HashSet a -> HashMap a ()
HashSet.toMap forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @t)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s t r.
(InSet f r :-> (InSet f s && InSet f t))
-> (forall u.
(InSet f u :-> InSet f s)
-> (InSet f u :-> InSet f t) -> InSet f u :-> InSet f r)
-> IntersectionProof f s t r
IntersectionProof forall p q. p :-> q
unsafeSubset forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2
withoutKeys
:: forall s t k a. (Hashable k, KnownHashSet t k)
=> HashMap s k a -> SomeHashMapWith (DifferenceProof 'Hashed s t) k a
withoutKeys :: forall s t k a.
(Hashable k, KnownHashSet t k) =>
HashMap s k a -> SomeHashMapWith (DifferenceProof 'Hashed s t) k a
withoutKeys (HashMap HashMap k a
m) = forall s k a (p :: * -> *).
HashMap s k a -> p s -> SomeHashMapWith p k a
SomeHashMapWith
(forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v w.
(Eq k, Hashable k) =>
HashMap k v -> HashMap k w -> HashMap k v
HashMap.difference HashMap k a
m forall a b. (a -> b) -> a -> b
$ forall a. HashSet a -> HashMap a ()
HashSet.toMap forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @t)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s t r.
(InSet f r :-> InSet f s)
-> (forall u.
(InSet f u :-> InSet f r)
-> (InSet f u :-> InSet f t) -> forall v. InSet f u :-> InSet f v)
-> (InSet f s :-> (InSet f t || InSet f r))
-> DifferenceProof f s t r
DifferenceProof forall p q. p :-> q
unsafeSubset (\InSet 'Hashed u :-> InSet 'Hashed Any
f InSet 'Hashed u :-> InSet 'Hashed t
g -> forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2 InSet 'Hashed u :-> InSet 'Hashed Any
f InSet 'Hashed u :-> InSet 'Hashed t
g) forall p q. p :-> q
unsafeSubset
partitionWithKey
:: forall s k a. Hashable k
=> (Key s k -> a -> Bool)
-> HashMap s k a
-> Some2HashMapWith (PartitionProof 'Hashed s k) k a a
partitionWithKey :: forall s k a.
Hashable k =>
(Key s k -> a -> Bool)
-> HashMap s k a
-> Some2HashMapWith (PartitionProof 'Hashed s k) k a a
partitionWithKey Key s k -> a -> Bool
p (HashMap HashMap k a
m) = forall s t k a b (p :: * -> * -> *).
HashMap s k a -> HashMap t k b -> p s t -> Some2HashMapWith p k a b
Some2HashMapWith
(forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (k -> v -> Bool) -> HashMap k v -> HashMap k v
HashMap.filterWithKey (Key s k -> a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k s. k -> Key s k
unsafeKey) HashMap k a
m)
(forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (k -> v -> Bool) -> HashMap k v -> HashMap k v
HashMap.filterWithKey ((Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key s k -> a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k s. k -> Key s k
unsafeKey) HashMap k a
m)
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s a r q.
(Refined (InSet f s) a
-> Either (Refined (InSet f r) a) (Refined (InSet f q) a))
-> ((InSet f r || InSet f q) :-> InSet f s)
-> (forall t.
(InSet f r :-> InSet f t)
-> (InSet f q :-> InSet f t) -> InSet f s :-> InSet f t)
-> (forall t.
(InSet f t :-> InSet f r)
-> (InSet f t :-> InSet f q) -> forall u. InSet f t :-> InSet f u)
-> PartitionProof f s a r q
PartitionProof
do \Key s k
k -> case forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup (forall {k} (p :: k) x. Refined p x -> x
unrefine Key s k
k) HashMap k a
m of
Maybe a
Nothing -> forall a. HasCallStack => String -> a
error
String
"partitionWithKey: bug: Data.HashMap.Refined has been subverted"
Just a
x -> if Key s k -> a -> Bool
p Key s k
k a
x
then forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall k s. k -> Key s k
unsafeKey forall a b. (a -> b) -> a -> b
$ forall {k} (p :: k) x. Refined p x -> x
unrefine Key s k
k
else forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall k s. k -> Key s k
unsafeKey forall a b. (a -> b) -> a -> b
$ forall {k} (p :: k) x. Refined p x -> x
unrefine Key s k
k
forall p q. p :-> q
unsafeSubset forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2 \InSet 'Hashed t :-> InSet 'Hashed Any
f InSet 'Hashed t :-> InSet 'Hashed Any
g -> forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2 InSet 'Hashed t :-> InSet 'Hashed Any
f InSet 'Hashed t :-> InSet 'Hashed Any
g
castKey
:: forall s t k. (forall x. Key s x -> Key t x)
-> (forall x. Key t x -> Key s x)
-> Coercion (Key s k) (Key t k)
castKey :: forall s t k.
(forall x. Key s x -> Key t x)
-> (forall x. Key t x -> Key s x) -> Coercion (Key s k) (Key t k)
castKey = forall a p q.
(p :-> q) -> (q :-> p) -> Coercion (Refined p a) (Refined q a)
castRefined
cast
:: forall s t k. (forall x. Coercion (Key s x) (Key t x))
-> Coercion (HashMap s k) (HashMap t k)
cast :: forall s t k.
(forall x. Coercion (Key s x) (Key t x))
-> Coercion (HashMap s k) (HashMap t k)
cast Coercion (Key s Any) (Key t Any)
forall x. Coercion (Key s x) (Key t x)
Coercion = forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion
instance FunctorWithIndex (Key s k) (HashMap s k) where
imap :: forall a b. (Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
imap = forall s k a b.
(Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
mapWithKey
instance FoldableWithIndex (Key s k) (HashMap s k) where
ifoldMap :: forall m a. Monoid m => (Key s k -> a -> m) -> HashMap s k a -> m
ifoldMap = forall s k a m.
Monoid m =>
(Key s k -> a -> m) -> HashMap s k a -> m
foldMapWithKey
instance TraversableWithIndex (Key s k) (HashMap s k) where
itraverse :: forall (f :: * -> *) a b.
Applicative f =>
(Key s k -> a -> f b) -> HashMap s k a -> f (HashMap s k b)
itraverse = forall s (f :: * -> *) k a b.
Applicative f =>
(Key s k -> a -> f b) -> HashMap s k a -> f (HashMap s k b)
traverseWithKey
instance (Hashable k, KnownHashSet s k) => Applicative (HashMap s k) where
pure :: forall a. a -> HashMap s k a
pure a
x = forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet \Key s k
_ -> a
x
<*> :: forall a b. HashMap s k (a -> b) -> HashMap s k a -> HashMap s k b
(<*>) = forall s k a b c.
Hashable k =>
(Key s k -> a -> b -> c)
-> HashMap s k a -> HashMap s k b -> HashMap s k c
zipWithKey (forall a b. a -> b -> a
const forall a. a -> a
id)
bind
:: forall s k a b. Hashable k
=> HashMap s k a -> (a -> HashMap s k b) -> HashMap s k b
bind :: forall s k a b.
Hashable k =>
HashMap s k a -> (a -> HashMap s k b) -> HashMap s k b
bind HashMap s k a
m a -> HashMap s k b
f = forall s k a b.
(Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
mapWithKey (\Key s k
k a
x -> a -> HashMap s k b
f a
x forall s k a. Hashable k => HashMap s k a -> Key s k -> a
! Key s k
k) HashMap s k a
m
instance (Hashable k, KnownHashSet s k) => Monad (HashMap s k) where
>>= :: forall a b. HashMap s k a -> (a -> HashMap s k b) -> HashMap s k b
(>>=) = forall s k a b.
Hashable k =>
HashMap s k a -> (a -> HashMap s k b) -> HashMap s k b
bind
instance (Hashable k, KnownHashSet s k)
=> MonadReader (Key s k) (HashMap s k) where
ask :: HashMap s k (Key s k)
ask = forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet forall a. a -> a
id
local :: forall a. (Key s k -> Key s k) -> HashMap s k a -> HashMap s k a
local Key s k -> Key s k
f HashMap s k a
m = forall s k a b.
(Key s k -> a -> b) -> HashMap s k a -> HashMap s k b
mapWithKey (\Key s k
k a
_ -> HashMap s k a
m forall s k a. Hashable k => HashMap s k a -> Key s k -> a
! Key s k -> Key s k
f Key s k
k) HashMap s k a
m
instance (Hashable k, Semigroup a) => Semigroup (HashMap s k a) where
<> :: HashMap s k a -> HashMap s k a -> HashMap s k a
(<>) = forall s k a b c.
Hashable k =>
(Key s k -> a -> b -> c)
-> HashMap s k a -> HashMap s k b -> HashMap s k c
zipWithKey (forall a b. a -> b -> a
const forall a. Semigroup a => a -> a -> a
(<>))
instance (Hashable k, KnownHashSet s k, Monoid a)
=> Monoid (HashMap s k a) where
mempty :: HashMap s k a
mempty = forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet \Key s k
_ -> forall a. Monoid a => a
mempty
instance (Hashable k, KnownHashSet s k) => Distributive (HashMap s k) where
collect :: forall (f :: * -> *) a b.
Functor f =>
(a -> HashMap s k b) -> f a -> HashMap s k (f b)
collect = forall (f :: * -> *) (w :: * -> *) a b.
(Representable f, Functor w) =>
(a -> f b) -> w a -> f (w b)
collectRep
distribute :: forall (f :: * -> *) a.
Functor f =>
f (HashMap s k a) -> HashMap s k (f a)
distribute = forall (f :: * -> *) (w :: * -> *) a.
(Representable f, Functor w) =>
w (f a) -> f (w a)
distributeRep
instance (Hashable k, KnownHashSet s k) => Representable (HashMap s k) where
type Rep (HashMap s k) = Key s k
index :: forall a. HashMap s k a -> Rep (HashMap s k) -> a
index = forall s k a. Hashable k => HashMap s k a -> Key s k -> a
(!)
tabulate :: forall a. (Rep (HashMap s k) -> a) -> HashMap s k a
tabulate = forall s k a. KnownHashSet s k => (Key s k -> a) -> HashMap s k a
fromSet