{-# LANGUAGE CPP #-}
module Data.HashSet.Refined
(
KnownHashSet
, HashSet
, InSet(..)
, Flavor(Hashed)
, Element
, revealPredicate
, SomeHashSet(..)
, withHashSet
, SomeHashSetWith(..)
, withHashSetWith
, Some2HashSetWith(..)
, with2HashSetWith
, (:->)
, SupersetProof(..)
, EmptyProof(..)
, empty
, singleton
, SingletonProof(..)
, fromHashSet
, fromTraversable
, FromTraversableProof(..)
, insert
, InsertProof(..)
, delete
, member
, null
, isSubsetOf
, SubsetProof(..)
, disjoint
, DisjointProof(..)
, union
, UnionProof(..)
, difference
, DifferenceProof(..)
, intersection
, IntersectionProof(..)
, filter
, partition
, PartitionProof(..)
, map
, MapProof(..)
, foldMap
, foldr
, foldl
, foldr'
, foldl'
, toList
, asSet
, asIntSet
, castElement
, cast
, castFlavor
) where
import Data.Coerce
import Data.Constraint (Dict(..))
import Data.Container.Refined.Conversion
import Data.Container.Refined.Hashable
import Data.Container.Refined.Proofs
import Data.Container.Refined.Unsafe
import qualified Data.Foldable as Foldable
import qualified Data.HashMap.Lazy as HashMap
import qualified Data.HashSet as HashSet
import Data.Proxy
import Data.Reflection
import Data.Traversable
import Data.Type.Coercion
import Data.Type.Equality ((:~:)(..))
import Data.Typeable (Typeable)
import GHC.Exts (Proxy#, proxy#)
import Prelude hiding (filter, foldl, foldMap, foldr, map, null)
import Refined
import Refined.Unsafe
import Unsafe.Coerce
revealPredicate
:: forall s a. (Typeable a, Hashable a, KnownHashSet s a)
=> Dict (Predicate (InSet 'Hashed s) a)
revealPredicate :: forall s a.
(Typeable a, Hashable a, KnownHashSet s a) =>
Dict (Predicate (InSet 'Hashed s) a)
revealPredicate = forall a r.
Typeable a =>
a -> (forall s. (Typeable s, Reifies s a) => Proxy s -> r) -> r
reifyTypeable (forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s))
\(Proxy s
_ :: Proxy s') ->
forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s') seq :: forall a b. a -> b -> b
`seq`
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
type Element s = Refined (InSet 'Hashed s)
unsafeCastElement :: forall s a. Coercion a (Element s a)
unsafeCastElement :: forall s a. Coercion a (Element s a)
unsafeCastElement = forall {k} x (p :: k). Coercion x (Refined p x)
reallyUnsafeUnderlyingRefined
unsafeElement :: a -> Element s a
unsafeElement :: forall a s. a -> Element s a
unsafeElement = forall a b. Coercion a b -> a -> b
coerceWith forall s a. Coercion a (Element s a)
unsafeCastElement
data SomeHashSet a where
SomeHashSet :: forall s a. KnownHashSet s a => Proxy# s -> SomeHashSet a
withHashSet
:: forall a r. SomeHashSet a
-> (forall s. KnownHashSet s a => Proxy s -> r)
-> r
withHashSet :: forall a r.
SomeHashSet a -> (forall s. KnownHashSet s a => Proxy s -> r) -> r
withHashSet (SomeHashSet (Proxy# s
_ :: Proxy# s)) forall s. KnownHashSet s a => Proxy s -> r
k = forall s. KnownHashSet s a => Proxy s -> r
k forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s
fromHashSet :: forall a. HashSet.HashSet a -> SomeHashSet a
fromHashSet :: forall a. HashSet a -> SomeHashSet a
fromHashSet HashSet a
s = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify HashSet a
s \(Proxy s
_ :: Proxy s) -> forall s a. KnownHashSet s a => Proxy# s -> SomeHashSet a
SomeHashSet @s forall {k} (a :: k). Proxy# a
proxy#
data SomeHashSetWith p a where
SomeHashSetWith
:: forall s a p. KnownHashSet s a => !(p s) -> SomeHashSetWith p a
withHashSetWith
:: forall a r p. SomeHashSetWith p a
-> (forall s. KnownHashSet s a => p s -> r)
-> r
withHashSetWith :: forall a r (p :: * -> *).
SomeHashSetWith p a
-> (forall s. KnownHashSet s a => p s -> r) -> r
withHashSetWith (SomeHashSetWith p s
p) forall s. KnownHashSet s a => p s -> r
k = forall s. KnownHashSet s a => p s -> r
k p s
p
data Some2HashSetWith p a where
Some2HashSetWith
:: forall s t a p. (KnownHashSet s a, KnownHashSet t a)
=> !(p s t) -> Some2HashSetWith p a
with2HashSetWith
:: forall a r p. Some2HashSetWith p a
-> (forall s t. (KnownHashSet s a, KnownHashSet t a) => p s t -> r)
-> r
with2HashSetWith :: forall a r (p :: * -> * -> *).
Some2HashSetWith p a
-> (forall s t. (KnownHashSet s a, KnownHashSet t a) => p s t -> r)
-> r
with2HashSetWith (Some2HashSetWith p s t
p) forall s t. (KnownHashSet s a, KnownHashSet t a) => p s t -> r
k = forall s t. (KnownHashSet s a, KnownHashSet t a) => p s t -> r
k p s t
p
empty :: forall a. SomeHashSetWith (EmptyProof 'Hashed) a
empty :: forall a. SomeHashSetWith (EmptyProof 'Hashed) a
empty = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify forall a. HashSet a
HashSet.empty \(Proxy s
_ :: Proxy r)
-> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r 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
singleton
:: forall a. Hashable a => a -> SomeHashSetWith (SingletonProof 'Hashed a) a
singleton :: forall a.
Hashable a =>
a -> SomeHashSetWith (SingletonProof 'Hashed a) a
singleton a
x = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. Hashable a => a -> HashSet a
HashSet.singleton a
x) \(Proxy s
_ :: Proxy r)
-> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) a r.
Refined (InSet f r) a -> SingletonProof f a r
SingletonProof forall a b. (a -> b) -> a -> b
$ forall a s. a -> Element s a
unsafeElement a
x
fromTraversable
:: forall t a. (Traversable t, Hashable a)
=> t a -> SomeHashSetWith (FromTraversableProof 'Hashed t a) a
fromTraversable :: forall (t :: * -> *) a.
(Traversable t, Hashable a) =>
t a -> SomeHashSetWith (FromTraversableProof 'Hashed t a) a
fromTraversable t a
xs = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify HashSet a
set \(Proxy s
_ :: Proxy r)
-> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) (t :: * -> *) a r.
t (Refined (InSet f r) a) -> FromTraversableProof f t a r
FromTraversableProof
forall a b. (a -> b) -> a -> b
$ forall a b. a -> b
unsafeCoerce @(t (Element _ a)) @(t (Element r a)) t (Element Any a)
proof
where
(HashSet a
set, t (Element Any a)
proof) = forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL
(\HashSet a
s a
x -> let !s' :: HashSet a
s' = forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.insert a
x HashSet a
s in (HashSet a
s', forall a s. a -> Element s a
unsafeElement a
x))
forall a. HashSet a
HashSet.empty
t a
xs
insert
:: forall s a. (Hashable a, KnownHashSet s a)
=> a -> SomeHashSetWith (InsertProof 'Hashed a s) a
insert :: forall s a.
(Hashable a, KnownHashSet s a) =>
a -> SomeHashSetWith (InsertProof 'Hashed a s) a
insert a
x = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.insert a
x 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 @s) \(Proxy s
_ :: Proxy r)
-> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) a s r.
Refined (InSet f r) a
-> (InSet f s :-> InSet f r) -> InsertProof f a s r
InsertProof (forall a s. a -> Element s a
unsafeElement a
x) forall p q. p :-> q
unsafeSubset
delete
:: forall s a. (Hashable a, KnownHashSet s a)
=> a -> SomeHashSetWith (SupersetProof 'Hashed s) a
delete :: forall s a.
(Hashable a, KnownHashSet s a) =>
a -> SomeHashSetWith (SupersetProof 'Hashed s) a
delete a
x = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.delete a
x 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 @s) \(Proxy s
_ :: Proxy r)
-> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @s 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
member :: forall s a. (Hashable a, KnownHashSet s a) => a -> Maybe (Element s a)
member :: forall s a.
(Hashable a, KnownHashSet s a) =>
a -> Maybe (Element s a)
member a
x
| a
x forall a. (Eq a, Hashable a) => a -> HashSet a -> Bool
`HashSet.member` forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a s. a -> Element s a
unsafeElement a
x
| Bool
otherwise = forall a. Maybe a
Nothing
null :: forall s a. KnownHashSet s a => Maybe (EmptyProof 'Hashed s)
null :: forall s a. KnownHashSet s a => Maybe (EmptyProof 'Hashed s)
null
| forall a. HashSet a -> Bool
HashSet.null 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 @s = 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
isSubsetOf
:: forall s t a. (Hashable a, KnownHashSet s a, KnownHashSet t a)
=> Maybe (SubsetProof 'Hashed s t)
isSubsetOf :: forall s t a.
(Hashable a, KnownHashSet s a, KnownHashSet t a) =>
Maybe (SubsetProof 'Hashed s t)
isSubsetOf
#if MIN_VERSION_unordered_containers(0, 2, 12)
| forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s) forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> Bool
`HashSet.isSubsetOf` forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @t)
#else
| all (`HashSet.member` reflect (Proxy @t)) (reflect (Proxy @s))
#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 a. (Hashable a, KnownHashSet s a, KnownHashSet t a)
=> Maybe (DisjointProof 'Hashed s t)
disjoint :: forall s t a.
(Hashable a, KnownHashSet s a, KnownHashSet t a) =>
Maybe (DisjointProof 'Hashed s t)
disjoint
| forall a. HashSet a -> Bool
HashSet.null
forall a b. (a -> b) -> a -> b
$ forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
HashSet.intersection (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) (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. 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
union
:: forall s t a. (Hashable a, KnownHashSet s a, KnownHashSet t a)
=> SomeHashSetWith (UnionProof 'Hashed s t) a
union :: forall s t a.
(Hashable a, KnownHashSet s a, KnownHashSet t a) =>
SomeHashSetWith (UnionProof 'Hashed s t) a
union = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s) forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
`HashSet.union` forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @t))
\(Proxy s
_ :: Proxy r) -> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s t r.
((InSet f s || InSet f t) :-> InSet f r)
-> (forall u.
(InSet f s :-> InSet f u)
-> (InSet f t :-> InSet f u) -> InSet f r :-> InSet f u)
-> UnionProof f s t r
UnionProof forall p q. p :-> q
unsafeSubset forall p' q' p'' q'' p q. (p' :-> q') -> (p'' :-> q'') -> p :-> q
unsafeSubsetWith2
difference
:: forall s t a. (Hashable a, KnownHashSet s a, KnownHashSet t a)
=> SomeHashSetWith (DifferenceProof 'Hashed s t) a
difference :: forall s t a.
(Hashable a, KnownHashSet s a, KnownHashSet t a) =>
SomeHashSetWith (DifferenceProof 'Hashed s t) a
difference = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s) forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
`HashSet.difference` forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @t))
\(Proxy s
_ :: Proxy r) -> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r
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 s
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 s
f InSet 'Hashed u :-> InSet 'Hashed t
g) forall p q. p :-> q
unsafeSubset
intersection
:: forall s t a. (Hashable a, KnownHashSet s a, KnownHashSet t a)
=> SomeHashSetWith (IntersectionProof 'Hashed s t) a
intersection :: forall s t a.
(Hashable a, KnownHashSet s a, KnownHashSet t a) =>
SomeHashSetWith (IntersectionProof 'Hashed s t) a
intersection
= forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @s) forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
`HashSet.intersection` forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect (forall {k} (t :: k). Proxy t
Proxy @t))
\(Proxy s
_ :: Proxy r) -> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r
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
filter
:: forall s a. KnownHashSet s a
=> (Element s a -> Bool) -> SomeHashSetWith (SupersetProof 'Hashed s) a
filter :: forall s a.
KnownHashSet s a =>
(Element s a -> Bool)
-> SomeHashSetWith (SupersetProof 'Hashed s) a
filter Element s a -> Bool
p = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. (a -> Bool) -> HashSet a -> HashSet a
HashSet.filter (Element s a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) 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 @s)
\(Proxy s
_ :: Proxy r) -> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r 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
partition
:: forall s a. KnownHashSet s a
=> (Element s a -> Bool) -> Some2HashSetWith (PartitionProof 'Hashed s a) a
partition :: forall s a.
KnownHashSet s a =>
(Element s a -> Bool)
-> Some2HashSetWith (PartitionProof 'Hashed s a) a
partition Element s a -> Bool
p = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. (a -> Bool) -> HashSet a -> HashSet a
HashSet.filter (Element s a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) 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 @s)
\(Proxy s
_ :: Proxy r)
-> forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify (forall a. (a -> Bool) -> HashSet a -> HashSet a
HashSet.filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element s a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) 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 @s)
\(Proxy s
_ :: Proxy q)
-> forall s t a (p :: * -> * -> *).
(KnownHashSet s a, KnownHashSet t a) =>
p s t -> Some2HashSetWith p a
Some2HashSetWith @s @r 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 \Element s a
x -> if Element s a -> Bool
p Element s a
x
then forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall a s. a -> Element s a
unsafeElement forall a b. (a -> b) -> a -> b
$ forall {k} (p :: k) x. Refined p x -> x
unrefine Element s a
x
else forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall a s. a -> Element s a
unsafeElement forall a b. (a -> b) -> a -> b
$ forall {k} (p :: k) x. Refined p x -> x
unrefine Element s a
x
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 s
f InSet 'Hashed t :-> InSet 'Hashed s
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 s
g
map
:: forall s a b. (Hashable b, KnownHashSet s a)
=> (Element s a -> b) -> SomeHashSetWith (MapProof 'Hashed s a b) b
map :: forall s a b.
(Hashable b, KnownHashSet s a) =>
(Element s a -> b) -> SomeHashSetWith (MapProof 'Hashed s a b) b
map Element s a -> b
f = 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 b (Element s a)
m)
\(Proxy s
_ :: Proxy r) -> forall s a (p :: * -> *).
KnownHashSet s a =>
p s -> SomeHashSetWith p a
SomeHashSetWith @r
forall a b. (a -> b) -> a -> b
$ forall (f :: Flavor) s a b r.
(Refined (InSet f s) a -> Refined (InSet f r) b)
-> (Refined (InSet f r) b -> Refined (InSet f s) a)
-> MapProof f s a b r
MapProof (forall a s. a -> Element s a
unsafeElement forall b c a. (b -> c) -> (a -> b) -> a -> c
. Element s a -> b
f) \Refined (InSet 'Hashed s) b
y -> 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 Refined (InSet 'Hashed s) b
y) HashMap b (Element s a)
m of
Maybe (Element s a)
Nothing -> forall a. HasCallStack => [Char] -> a
error [Char]
"map: bug: Data.HashSet.Refined has been subverted"
Just Element s a
x -> Element s a
x
where
!m :: HashMap b (Element s a)
m = forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList
[ (b
y, forall a s. a -> Element s a
unsafeElement a
x)
| a
x <- forall a. HashSet a -> [a]
HashSet.toList 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 @s
, let !y :: b
y = Element s a -> b
f forall a b. (a -> b) -> a -> b
$ forall a s. a -> Element s a
unsafeElement a
x
]
foldMap :: forall s a m. (KnownHashSet s a, Monoid m) => (Element s a -> m) -> m
foldMap :: forall s a m.
(KnownHashSet s a, Monoid m) =>
(Element s a -> m) -> m
foldMap Element s a -> m
f = forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
Foldable.foldMap (Element s a -> m
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) 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 @s
foldr :: forall s a b. KnownHashSet s a => (Element s a -> b -> b) -> b -> b
foldr :: forall s a b. KnownHashSet s a => (Element s a -> b -> b) -> b -> b
foldr Element s a -> b -> b
f b
z = forall b a. (b -> a -> a) -> a -> HashSet b -> a
HashSet.foldr (Element s a -> b -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) b
z 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 @s
foldl :: forall s a b. KnownHashSet s a => (b -> Element s a -> b) -> b -> b
foldl :: forall s a b. KnownHashSet s a => (b -> Element s a -> b) -> b -> b
foldl b -> Element s a -> b
f b
z = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Foldable.foldl ((forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Element s a -> b
f) b
z 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 @s
foldr' :: forall s a b. KnownHashSet s a => (Element s a -> b -> b) -> b -> b
foldr' :: forall s a b. KnownHashSet s a => (Element s a -> b -> b) -> b -> b
foldr' Element s a -> b -> b
f b
z = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Foldable.foldr' (Element s a -> b -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) b
z 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 @s
foldl' :: forall s a b. KnownHashSet s a => (b -> Element s a -> b) -> b -> b
foldl' :: forall s a b. KnownHashSet s a => (b -> Element s a -> b) -> b -> b
foldl' b -> Element s a -> b
f b
z = forall a b. (a -> b -> a) -> a -> HashSet b -> a
HashSet.foldl' ((forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a s. a -> Element s a
unsafeElement) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Element s a -> b
f) b
z 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 @s
toList :: forall s a. KnownHashSet s a => [Element s a]
toList :: forall s a. KnownHashSet s a => [Element s a]
toList = forall {k} (a :: k) (b :: k) r.
Coercion a b -> (Coercible a b => r) -> r
gcoerceWith (forall s a. Coercion a (Element s a)
unsafeCastElement @s @a) 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. HashSet a -> [a]
HashSet.toList 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 @s
asSet :: forall s a. (Ord a, KnownHashSet s a) => Set s a
asSet :: forall s a. (Ord a, KnownHashSet s a) => Set s a
asSet = forall s a. (Ord a, KnownHashSet s a) => Set s a
hashSet2Set
asIntSet :: forall s. KnownHashSet s Int => IntSet s
asIntSet :: forall s. KnownHashSet s Int => IntSet s
asIntSet = forall s. KnownHashSet s Int => IntSet s
hashSet2IntSet
castElement
:: forall s t a. (forall x. Element s x -> Element t x)
-> (forall x. Element t x -> Element s x)
-> Coercion (Element s a) (Element t a)
castElement :: forall s t a.
(forall x. Element s x -> Element t x)
-> (forall x. Element t x -> Element s x)
-> Coercion (Element s a) (Element t a)
castElement = forall a p q.
(p :-> q) -> (q :-> p) -> Coercion (Refined p a) (Refined q a)
castRefined
cast
:: forall s t a. (forall x. Coercion (Element s x) (Element t x))
-> Coercion (HashSet s a) (HashSet t a)
cast :: forall s t a.
(forall x. Coercion (Element s x) (Element t x))
-> Coercion (HashSet s a) (HashSet t a)
cast Coercion (Element s Any) (Element t Any)
forall x. Coercion (Element s x) (Element t x)
Coercion
#if MIN_VERSION_base(4, 15, 0)
= case forall {k} (a :: k) (b :: k). UnsafeEquality a b
unsafeEqualityProof @s @t of UnsafeEquality s t
UnsafeRefl -> forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion
#else
= repr $ unsafeCoerce Refl
#endif