{-# LANGUAGE CPP #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE PatternGuards #-}
#if !defined(TESTING) && defined(__GLASGOW_HASKELL__)
{-# LANGUAGE Trustworthy #-}
#endif
#ifdef __GLASGOW_HASKELL__
{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
#endif
{-# OPTIONS_HADDOCK not-home #-}
#include "containers.h"
module Data.Set.Internal (
Set(..)
, Size
, (\\)
, null
, size
, member
, notMember
, lookupLT
, lookupGT
, lookupLE
, lookupGE
, isSubsetOf
, isProperSubsetOf
, disjoint
, empty
, singleton
, insert
, delete
, alterF
, powerSet
, union
, unions
, difference
, intersection
, intersections
, cartesianProduct
, disjointUnion
, Intersection(..)
, filter
, takeWhileAntitone
, dropWhileAntitone
, spanAntitone
, partition
, split
, splitMember
, splitRoot
, lookupIndex
, findIndex
, elemAt
, deleteAt
, take
, drop
, splitAt
, map
, mapMonotonic
, foldr
, foldl
, foldr'
, foldl'
, fold
, lookupMin
, lookupMax
, findMin
, findMax
, deleteMin
, deleteMax
, deleteFindMin
, deleteFindMax
, maxView
, minView
, elems
, toList
, fromList
, toAscList
, toDescList
, fromAscList
, fromDistinctAscList
, fromDescList
, fromDistinctDescList
, showTree
, showTreeWith
, valid
, bin
, balanced
, link
, merge
) where
import Utils.Containers.Internal.Prelude hiding
(filter,foldl,foldl',foldr,null,map,take,drop,splitAt)
import Prelude ()
import Control.Applicative (Const(..))
import qualified Data.List as List
import Data.Bits (shiftL, shiftR)
import Data.Semigroup (Semigroup(stimes))
import Data.List.NonEmpty (NonEmpty(..))
#if !(MIN_VERSION_base(4,11,0))
import Data.Semigroup (Semigroup((<>)))
#endif
import Data.Semigroup (stimesIdempotentMonoid, stimesIdempotent)
import Data.Functor.Classes
import Data.Functor.Identity (Identity)
import qualified Data.Foldable as Foldable
import Control.DeepSeq (NFData(rnf))
import Utils.Containers.Internal.StrictPair
import Utils.Containers.Internal.PtrEquality
#if __GLASGOW_HASKELL__
import GHC.Exts ( build, lazy )
import qualified GHC.Exts as GHCExts
import Text.Read ( readPrec, Read (..), Lexeme (..), parens, prec
, lexP, readListPrecDefault )
import Data.Data
import Language.Haskell.TH.Syntax (Lift)
import Language.Haskell.TH ()
#endif
infixl 9 \\
(\\) :: Ord a => Set a -> Set a -> Set a
Set a
m1 \\ :: forall a. Ord a => Set a -> Set a -> Set a
\\ Set a
m2 = forall a. Ord a => Set a -> Set a -> Set a
difference Set a
m1 Set a
m2
#if __GLASGOW_HASKELL__
{-# INLINABLE (\\) #-}
#endif
data Set a = Bin {-# UNPACK #-} !Size !a !(Set a) !(Set a)
| Tip
type Size = Int
#ifdef __GLASGOW_HASKELL__
type role Set nominal
#endif
deriving instance Lift a => Lift (Set a)
instance Ord a => Monoid (Set a) where
mempty :: Set a
mempty = forall a. Set a
empty
mconcat :: [Set a] -> Set a
mconcat = forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
unions
mappend :: Set a -> Set a -> Set a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
instance Ord a => Semigroup (Set a) where
<> :: Set a -> Set a -> Set a
(<>) = forall a. Ord a => Set a -> Set a -> Set a
union
stimes :: forall b. Integral b => b -> Set a -> Set a
stimes = forall b a. (Integral b, Monoid a) => b -> a -> a
stimesIdempotentMonoid
instance Foldable.Foldable Set where
fold :: forall m. Monoid m => Set m -> m
fold = forall m. Monoid m => Set m -> m
go
where go :: Set a -> a
go Set a
Tip = forall a. Monoid a => a
mempty
go (Bin Size
1 a
k Set a
_ Set a
_) = a
k
go (Bin Size
_ a
k Set a
l Set a
r) = Set a -> a
go Set a
l forall a. Monoid a => a -> a -> a
`mappend` (a
k forall a. Monoid a => a -> a -> a
`mappend` Set a -> a
go Set a
r)
{-# INLINABLE fold #-}
foldr :: forall a b. (a -> b -> b) -> b -> Set a -> b
foldr = forall a b. (a -> b -> b) -> b -> Set a -> b
foldr
{-# INLINE foldr #-}
foldl :: forall b a. (b -> a -> b) -> b -> Set a -> b
foldl = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl
{-# INLINE foldl #-}
foldMap :: forall m a. Monoid m => (a -> m) -> Set a -> m
foldMap a -> m
f Set a
t = Set a -> m
go Set a
t
where go :: Set a -> m
go Set a
Tip = forall a. Monoid a => a
mempty
go (Bin Size
1 a
k Set a
_ Set a
_) = a -> m
f a
k
go (Bin Size
_ a
k Set a
l Set a
r) = Set a -> m
go Set a
l forall a. Monoid a => a -> a -> a
`mappend` (a -> m
f a
k forall a. Monoid a => a -> a -> a
`mappend` Set a -> m
go Set a
r)
{-# INLINE foldMap #-}
foldl' :: forall b a. (b -> a -> b) -> b -> Set a -> b
foldl' = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl'
{-# INLINE foldl' #-}
foldr' :: forall a b. (a -> b -> b) -> b -> Set a -> b
foldr' = forall a b. (a -> b -> b) -> b -> Set a -> b
foldr'
{-# INLINE foldr' #-}
length :: forall a. Set a -> Size
length = forall a. Set a -> Size
size
{-# INLINE length #-}
null :: forall a. Set a -> Bool
null = forall a. Set a -> Bool
null
{-# INLINE null #-}
toList :: forall a. Set a -> [a]
toList = forall a. Set a -> [a]
toList
{-# INLINE toList #-}
elem :: forall a. Eq a => a -> Set a -> Bool
elem = forall a. Eq a => a -> Set a -> Bool
go
where go :: t -> Set t -> Bool
go !t
_ Set t
Tip = Bool
False
go t
x (Bin Size
_ t
y Set t
l Set t
r) = t
x forall a. Eq a => a -> a -> Bool
== t
y Bool -> Bool -> Bool
|| t -> Set t -> Bool
go t
x Set t
l Bool -> Bool -> Bool
|| t -> Set t -> Bool
go t
x Set t
r
{-# INLINABLE elem #-}
minimum :: forall a. Ord a => Set a -> a
minimum = forall a. Set a -> a
findMin
{-# INLINE minimum #-}
maximum :: forall a. Ord a => Set a -> a
maximum = forall a. Set a -> a
findMax
{-# INLINE maximum #-}
sum :: forall a. Num a => Set a -> a
sum = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl' forall a. Num a => a -> a -> a
(+) a
0
{-# INLINABLE sum #-}
product :: forall a. Num a => Set a -> a
product = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl' forall a. Num a => a -> a -> a
(*) a
1
{-# INLINABLE product #-}
#if __GLASGOW_HASKELL__
instance (Data a, Ord a) => Data (Set a) where
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Set a -> c (Set a)
gfoldl forall d b. Data d => c (d -> b) -> d -> c b
f forall g. g -> c g
z Set a
set = forall g. g -> c g
z forall a. Ord a => [a] -> Set a
fromList forall d b. Data d => c (d -> b) -> d -> c b
`f` (forall a. Set a -> [a]
toList Set a
set)
toConstr :: Set a -> Constr
toConstr Set a
_ = Constr
fromListConstr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Set a)
gunfold forall b r. Data b => c (b -> r) -> c r
k forall r. r -> c r
z Constr
c = case Constr -> Size
constrIndex Constr
c of
Size
1 -> forall b r. Data b => c (b -> r) -> c r
k (forall r. r -> c r
z forall a. Ord a => [a] -> Set a
fromList)
Size
_ -> forall a. HasCallStack => [Char] -> a
error [Char]
"gunfold"
dataTypeOf :: Set a -> DataType
dataTypeOf Set a
_ = DataType
setDataType
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Set a))
dataCast1 forall d. Data d => c (t d)
f = forall {k1} {k2} (c :: k1 -> *) (t :: k2 -> k1) (t' :: k2 -> k1)
(a :: k2).
(Typeable t, Typeable t') =>
c (t a) -> Maybe (c (t' a))
gcast1 forall d. Data d => c (t d)
f
fromListConstr :: Constr
fromListConstr :: Constr
fromListConstr = DataType -> [Char] -> [[Char]] -> Fixity -> Constr
mkConstr DataType
setDataType [Char]
"fromList" [] Fixity
Prefix
setDataType :: DataType
setDataType :: DataType
setDataType = [Char] -> [Constr] -> DataType
mkDataType [Char]
"Data.Set.Internal.Set" [Constr
fromListConstr]
#endif
null :: Set a -> Bool
null :: forall a. Set a -> Bool
null Set a
Tip = Bool
True
null (Bin {}) = Bool
False
{-# INLINE null #-}
size :: Set a -> Int
size :: forall a. Set a -> Size
size Set a
Tip = Size
0
size (Bin Size
sz a
_ Set a
_ Set a
_) = Size
sz
{-# INLINE size #-}
member :: Ord a => a -> Set a -> Bool
member :: forall a. Ord a => a -> Set a -> Bool
member = forall a. Ord a => a -> Set a -> Bool
go
where
go :: t -> Set t -> Bool
go !t
_ Set t
Tip = Bool
False
go t
x (Bin Size
_ t
y Set t
l Set t
r) = case forall a. Ord a => a -> a -> Ordering
compare t
x t
y of
Ordering
LT -> t -> Set t -> Bool
go t
x Set t
l
Ordering
GT -> t -> Set t -> Bool
go t
x Set t
r
Ordering
EQ -> Bool
True
#if __GLASGOW_HASKELL__
{-# INLINABLE member #-}
#else
{-# INLINE member #-}
#endif
notMember :: Ord a => a -> Set a -> Bool
notMember :: forall a. Ord a => a -> Set a -> Bool
notMember a
a Set a
t = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> Set a -> Bool
member a
a Set a
t
#if __GLASGOW_HASKELL__
{-# INLINABLE notMember #-}
#else
{-# INLINE notMember #-}
#endif
lookupLT :: Ord a => a -> Set a -> Maybe a
lookupLT :: forall a. Ord a => a -> Set a -> Maybe a
lookupLT = forall a. Ord a => a -> Set a -> Maybe a
goNothing
where
goNothing :: a -> Set a -> Maybe a
goNothing !a
_ Set a
Tip = forall a. Maybe a
Nothing
goNothing a
x (Bin Size
_ a
y Set a
l Set a
r) | a
x forall a. Ord a => a -> a -> Bool
<= a
y = a -> Set a -> Maybe a
goNothing a
x Set a
l
| Bool
otherwise = forall {t}. Ord t => t -> t -> Set t -> Maybe t
goJust a
x a
y Set a
r
goJust :: t -> t -> Set t -> Maybe t
goJust !t
_ t
best Set t
Tip = forall a. a -> Maybe a
Just t
best
goJust t
x t
best (Bin Size
_ t
y Set t
l Set t
r) | t
x forall a. Ord a => a -> a -> Bool
<= t
y = t -> t -> Set t -> Maybe t
goJust t
x t
best Set t
l
| Bool
otherwise = t -> t -> Set t -> Maybe t
goJust t
x t
y Set t
r
#if __GLASGOW_HASKELL__
{-# INLINABLE lookupLT #-}
#else
{-# INLINE lookupLT #-}
#endif
lookupGT :: Ord a => a -> Set a -> Maybe a
lookupGT :: forall a. Ord a => a -> Set a -> Maybe a
lookupGT = forall a. Ord a => a -> Set a -> Maybe a
goNothing
where
goNothing :: t -> Set t -> Maybe t
goNothing !t
_ Set t
Tip = forall a. Maybe a
Nothing
goNothing t
x (Bin Size
_ t
y Set t
l Set t
r) | t
x forall a. Ord a => a -> a -> Bool
< t
y = forall {t}. Ord t => t -> t -> Set t -> Maybe t
goJust t
x t
y Set t
l
| Bool
otherwise = t -> Set t -> Maybe t
goNothing t
x Set t
r
goJust :: t -> t -> Set t -> Maybe t
goJust !t
_ t
best Set t
Tip = forall a. a -> Maybe a
Just t
best
goJust t
x t
best (Bin Size
_ t
y Set t
l Set t
r) | t
x forall a. Ord a => a -> a -> Bool
< t
y = t -> t -> Set t -> Maybe t
goJust t
x t
y Set t
l
| Bool
otherwise = t -> t -> Set t -> Maybe t
goJust t
x t
best Set t
r
#if __GLASGOW_HASKELL__
{-# INLINABLE lookupGT #-}
#else
{-# INLINE lookupGT #-}
#endif
lookupLE :: Ord a => a -> Set a -> Maybe a
lookupLE :: forall a. Ord a => a -> Set a -> Maybe a
lookupLE = forall a. Ord a => a -> Set a -> Maybe a
goNothing
where
goNothing :: a -> Set a -> Maybe a
goNothing !a
_ Set a
Tip = forall a. Maybe a
Nothing
goNothing a
x (Bin Size
_ a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of Ordering
LT -> a -> Set a -> Maybe a
goNothing a
x Set a
l
Ordering
EQ -> forall a. a -> Maybe a
Just a
y
Ordering
GT -> forall {t}. Ord t => t -> t -> Set t -> Maybe t
goJust a
x a
y Set a
r
goJust :: t -> t -> Set t -> Maybe t
goJust !t
_ t
best Set t
Tip = forall a. a -> Maybe a
Just t
best
goJust t
x t
best (Bin Size
_ t
y Set t
l Set t
r) = case forall a. Ord a => a -> a -> Ordering
compare t
x t
y of Ordering
LT -> t -> t -> Set t -> Maybe t
goJust t
x t
best Set t
l
Ordering
EQ -> forall a. a -> Maybe a
Just t
y
Ordering
GT -> t -> t -> Set t -> Maybe t
goJust t
x t
y Set t
r
#if __GLASGOW_HASKELL__
{-# INLINABLE lookupLE #-}
#else
{-# INLINE lookupLE #-}
#endif
lookupGE :: Ord a => a -> Set a -> Maybe a
lookupGE :: forall a. Ord a => a -> Set a -> Maybe a
lookupGE = forall a. Ord a => a -> Set a -> Maybe a
goNothing
where
goNothing :: t -> Set t -> Maybe t
goNothing !t
_ Set t
Tip = forall a. Maybe a
Nothing
goNothing t
x (Bin Size
_ t
y Set t
l Set t
r) = case forall a. Ord a => a -> a -> Ordering
compare t
x t
y of Ordering
LT -> forall {t}. Ord t => t -> t -> Set t -> Maybe t
goJust t
x t
y Set t
l
Ordering
EQ -> forall a. a -> Maybe a
Just t
y
Ordering
GT -> t -> Set t -> Maybe t
goNothing t
x Set t
r
goJust :: a -> a -> Set a -> Maybe a
goJust !a
_ a
best Set a
Tip = forall a. a -> Maybe a
Just a
best
goJust a
x a
best (Bin Size
_ a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of Ordering
LT -> a -> a -> Set a -> Maybe a
goJust a
x a
y Set a
l
Ordering
EQ -> forall a. a -> Maybe a
Just a
y
Ordering
GT -> a -> a -> Set a -> Maybe a
goJust a
x a
best Set a
r
#if __GLASGOW_HASKELL__
{-# INLINABLE lookupGE #-}
#else
{-# INLINE lookupGE #-}
#endif
empty :: Set a
empty :: forall a. Set a
empty = forall a. Set a
Tip
{-# INLINE empty #-}
singleton :: a -> Set a
singleton :: forall a. a -> Set a
singleton a
x = forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip
{-# INLINE singleton #-}
insert :: Ord a => a -> Set a -> Set a
insert :: forall a. Ord a => a -> Set a -> Set a
insert a
x0 = forall a. Ord a => a -> a -> Set a -> Set a
go a
x0 a
x0
where
go :: Ord a => a -> a -> Set a -> Set a
go :: forall a. Ord a => a -> a -> Set a -> Set a
go a
orig !a
_ Set a
Tip = forall a. a -> Set a
singleton (forall a. a -> a
lazy a
orig)
go a
orig !a
x t :: Set a
t@(Bin Size
sz a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT | Set a
l' forall a. a -> a -> Bool
`ptrEq` Set a
l -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceL a
y Set a
l' Set a
r
where !l' :: Set a
l' = forall a. Ord a => a -> a -> Set a -> Set a
go a
orig a
x Set a
l
Ordering
GT | Set a
r' forall a. a -> a -> Bool
`ptrEq` Set a
r -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
l Set a
r'
where !r' :: Set a
r' = forall a. Ord a => a -> a -> Set a -> Set a
go a
orig a
x Set a
r
Ordering
EQ | forall a. a -> a
lazy a
orig seq :: forall a b. a -> b -> b
`seq` (a
orig forall a. a -> a -> Bool
`ptrEq` a
y) -> Set a
t
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
sz (forall a. a -> a
lazy a
orig) Set a
l Set a
r
#if __GLASGOW_HASKELL__
{-# INLINABLE insert #-}
#else
{-# INLINE insert #-}
#endif
#ifndef __GLASGOW_HASKELL__
lazy :: a -> a
lazy a = a
#endif
insertR :: Ord a => a -> Set a -> Set a
insertR :: forall a. Ord a => a -> Set a -> Set a
insertR a
x0 = forall a. Ord a => a -> a -> Set a -> Set a
go a
x0 a
x0
where
go :: Ord a => a -> a -> Set a -> Set a
go :: forall a. Ord a => a -> a -> Set a -> Set a
go a
orig !a
_ Set a
Tip = forall a. a -> Set a
singleton (forall a. a -> a
lazy a
orig)
go a
orig !a
x t :: Set a
t@(Bin Size
_ a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT | Set a
l' forall a. a -> a -> Bool
`ptrEq` Set a
l -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceL a
y Set a
l' Set a
r
where !l' :: Set a
l' = forall a. Ord a => a -> a -> Set a -> Set a
go a
orig a
x Set a
l
Ordering
GT | Set a
r' forall a. a -> a -> Bool
`ptrEq` Set a
r -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
l Set a
r'
where !r' :: Set a
r' = forall a. Ord a => a -> a -> Set a -> Set a
go a
orig a
x Set a
r
Ordering
EQ -> Set a
t
#if __GLASGOW_HASKELL__
{-# INLINABLE insertR #-}
#else
{-# INLINE insertR #-}
#endif
delete :: Ord a => a -> Set a -> Set a
delete :: forall a. Ord a => a -> Set a -> Set a
delete = forall a. Ord a => a -> Set a -> Set a
go
where
go :: Ord a => a -> Set a -> Set a
go :: forall a. Ord a => a -> Set a -> Set a
go !a
_ Set a
Tip = forall a. Set a
Tip
go a
x t :: Set a
t@(Bin Size
_ a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT | Set a
l' forall a. a -> a -> Bool
`ptrEq` Set a
l -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
l' Set a
r
where !l' :: Set a
l' = forall a. Ord a => a -> Set a -> Set a
go a
x Set a
l
Ordering
GT | Set a
r' forall a. a -> a -> Bool
`ptrEq` Set a
r -> Set a
t
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
balanceL a
y Set a
l Set a
r'
where !r' :: Set a
r' = forall a. Ord a => a -> Set a -> Set a
go a
x Set a
r
Ordering
EQ -> forall a. Set a -> Set a -> Set a
glue Set a
l Set a
r
#if __GLASGOW_HASKELL__
{-# INLINABLE delete #-}
#else
{-# INLINE delete #-}
#endif
alterF :: (Ord a, Functor f) => (Bool -> f Bool) -> a -> Set a -> f (Set a)
alterF :: forall a (f :: * -> *).
(Ord a, Functor f) =>
(Bool -> f Bool) -> a -> Set a -> f (Set a)
alterF Bool -> f Bool
f a
k Set a
s = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool -> Set a
choose (Bool -> f Bool
f Bool
member_)
where
(Bool
member_, Set a
inserted, Set a
deleted) = case forall a. Ord a => a -> Set a -> AlteredSet a
alteredSet a
k Set a
s of
Deleted Set a
d -> (Bool
True , Set a
s, Set a
d)
Inserted Set a
i -> (Bool
False, Set a
i, Set a
s)
choose :: Bool -> Set a
choose Bool
True = Set a
inserted
choose Bool
False = Set a
deleted
#ifndef __GLASGOW_HASKELL__
{-# INLINE alterF #-}
#else
{-# INLINABLE [2] alterF #-}
{-# RULES
"alterF/Const" forall k (f :: Bool -> Const a Bool) . alterF f k = \s -> Const . getConst . f $ member k s
#-}
#endif
{-# SPECIALIZE alterF :: Ord a => (Bool -> Identity Bool) -> a -> Set a -> Identity (Set a) #-}
data AlteredSet a
= Deleted !(Set a)
| Inserted !(Set a)
alteredSet :: Ord a => a -> Set a -> AlteredSet a
alteredSet :: forall a. Ord a => a -> Set a -> AlteredSet a
alteredSet a
x0 Set a
s0 = forall a. Ord a => a -> Set a -> AlteredSet a
go a
x0 Set a
s0
where
go :: Ord a => a -> Set a -> AlteredSet a
go :: forall a. Ord a => a -> Set a -> AlteredSet a
go a
x Set a
Tip = forall a. Set a -> AlteredSet a
Inserted (forall a. a -> Set a
singleton a
x)
go a
x (Bin Size
_ a
y Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT -> case forall a. Ord a => a -> Set a -> AlteredSet a
go a
x Set a
l of
Deleted Set a
d -> forall a. Set a -> AlteredSet a
Deleted (forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
d Set a
r)
Inserted Set a
i -> forall a. Set a -> AlteredSet a
Inserted (forall a. a -> Set a -> Set a -> Set a
balanceL a
y Set a
i Set a
r)
Ordering
GT -> case forall a. Ord a => a -> Set a -> AlteredSet a
go a
x Set a
r of
Deleted Set a
d -> forall a. Set a -> AlteredSet a
Deleted (forall a. a -> Set a -> Set a -> Set a
balanceL a
y Set a
l Set a
d)
Inserted Set a
i -> forall a. Set a -> AlteredSet a
Inserted (forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
l Set a
i)
Ordering
EQ -> forall a. Set a -> AlteredSet a
Deleted (forall a. Set a -> Set a -> Set a
glue Set a
l Set a
r)
#if __GLASGOW_HASKELL__
{-# INLINABLE alteredSet #-}
#else
{-# INLINE alteredSet #-}
#endif
isProperSubsetOf :: Ord a => Set a -> Set a -> Bool
isProperSubsetOf :: forall a. Ord a => Set a -> Set a -> Bool
isProperSubsetOf Set a
s1 Set a
s2
= forall a. Set a -> Size
size Set a
s1 forall a. Ord a => a -> a -> Bool
< forall a. Set a -> Size
size Set a
s2 Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Set a -> Bool
isSubsetOfX Set a
s1 Set a
s2
#if __GLASGOW_HASKELL__
{-# INLINABLE isProperSubsetOf #-}
#endif
isSubsetOf :: Ord a => Set a -> Set a -> Bool
isSubsetOf :: forall a. Ord a => Set a -> Set a -> Bool
isSubsetOf Set a
t1 Set a
t2
= forall a. Set a -> Size
size Set a
t1 forall a. Ord a => a -> a -> Bool
<= forall a. Set a -> Size
size Set a
t2 Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Set a -> Bool
isSubsetOfX Set a
t1 Set a
t2
#if __GLASGOW_HASKELL__
{-# INLINABLE isSubsetOf #-}
#endif
isSubsetOfX :: Ord a => Set a -> Set a -> Bool
isSubsetOfX :: forall a. Ord a => Set a -> Set a -> Bool
isSubsetOfX Set a
Tip Set a
_ = Bool
True
isSubsetOfX Set a
_ Set a
Tip = Bool
False
isSubsetOfX (Bin Size
1 a
x Set a
_ Set a
_) Set a
t = forall a. Ord a => a -> Set a -> Bool
member a
x Set a
t
isSubsetOfX (Bin Size
_ a
x Set a
l Set a
r) Set a
t
= Bool
found Bool -> Bool -> Bool
&&
forall a. Set a -> Size
size Set a
l forall a. Ord a => a -> a -> Bool
<= forall a. Set a -> Size
size Set a
lt Bool -> Bool -> Bool
&& forall a. Set a -> Size
size Set a
r forall a. Ord a => a -> a -> Bool
<= forall a. Set a -> Size
size Set a
gt Bool -> Bool -> Bool
&&
forall a. Ord a => Set a -> Set a -> Bool
isSubsetOfX Set a
l Set a
lt Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Set a -> Bool
isSubsetOfX Set a
r Set a
gt
where
(Set a
lt,Bool
found,Set a
gt) = forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
x Set a
t
#if __GLASGOW_HASKELL__
{-# INLINABLE isSubsetOfX #-}
#endif
disjoint :: Ord a => Set a -> Set a -> Bool
disjoint :: forall a. Ord a => Set a -> Set a -> Bool
disjoint Set a
Tip Set a
_ = Bool
True
disjoint Set a
_ Set a
Tip = Bool
True
disjoint (Bin Size
1 a
x Set a
_ Set a
_) Set a
t = a
x forall a. Ord a => a -> Set a -> Bool
`notMember` Set a
t
disjoint (Bin Size
_ a
x Set a
l Set a
r) Set a
t
= Bool -> Bool
not Bool
found Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Set a -> Bool
disjoint Set a
l Set a
lt Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Set a -> Bool
disjoint Set a
r Set a
gt
where
(Set a
lt,Bool
found,Set a
gt) = forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
x Set a
t
lookupMinSure :: a -> Set a -> a
lookupMinSure :: forall a. a -> Set a -> a
lookupMinSure a
x Set a
Tip = a
x
lookupMinSure a
_ (Bin Size
_ a
x Set a
l Set a
_) = forall a. a -> Set a -> a
lookupMinSure a
x Set a
l
lookupMin :: Set a -> Maybe a
lookupMin :: forall a. Set a -> Maybe a
lookupMin Set a
Tip = forall a. Maybe a
Nothing
lookupMin (Bin Size
_ a
x Set a
l Set a
_) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$! forall a. a -> Set a -> a
lookupMinSure a
x Set a
l
findMin :: Set a -> a
findMin :: forall a. Set a -> a
findMin Set a
t
| Just a
r <- forall a. Set a -> Maybe a
lookupMin Set a
t = a
r
| Bool
otherwise = forall a. HasCallStack => [Char] -> a
error [Char]
"Set.findMin: empty set has no minimal element"
lookupMaxSure :: a -> Set a -> a
lookupMaxSure :: forall a. a -> Set a -> a
lookupMaxSure a
x Set a
Tip = a
x
lookupMaxSure a
_ (Bin Size
_ a
x Set a
_ Set a
r) = forall a. a -> Set a -> a
lookupMaxSure a
x Set a
r
lookupMax :: Set a -> Maybe a
lookupMax :: forall a. Set a -> Maybe a
lookupMax Set a
Tip = forall a. Maybe a
Nothing
lookupMax (Bin Size
_ a
x Set a
_ Set a
r) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$! forall a. a -> Set a -> a
lookupMaxSure a
x Set a
r
findMax :: Set a -> a
findMax :: forall a. Set a -> a
findMax Set a
t
| Just a
r <- forall a. Set a -> Maybe a
lookupMax Set a
t = a
r
| Bool
otherwise = forall a. HasCallStack => [Char] -> a
error [Char]
"Set.findMax: empty set has no maximal element"
deleteMin :: Set a -> Set a
deleteMin :: forall a. Set a -> Set a
deleteMin (Bin Size
_ a
_ Set a
Tip Set a
r) = Set a
r
deleteMin (Bin Size
_ a
x Set a
l Set a
r) = forall a. a -> Set a -> Set a -> Set a
balanceR a
x (forall a. Set a -> Set a
deleteMin Set a
l) Set a
r
deleteMin Set a
Tip = forall a. Set a
Tip
deleteMax :: Set a -> Set a
deleteMax :: forall a. Set a -> Set a
deleteMax (Bin Size
_ a
_ Set a
l Set a
Tip) = Set a
l
deleteMax (Bin Size
_ a
x Set a
l Set a
r) = forall a. a -> Set a -> Set a -> Set a
balanceL a
x Set a
l (forall a. Set a -> Set a
deleteMax Set a
r)
deleteMax Set a
Tip = forall a. Set a
Tip
unions :: (Foldable f, Ord a) => f (Set a) -> Set a
unions :: forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
unions = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Foldable.foldl' forall a. Ord a => Set a -> Set a -> Set a
union forall a. Set a
empty
#if __GLASGOW_HASKELL__
{-# INLINABLE unions #-}
#endif
union :: Ord a => Set a -> Set a -> Set a
union :: forall a. Ord a => Set a -> Set a -> Set a
union Set a
t1 Set a
Tip = Set a
t1
union Set a
t1 (Bin Size
1 a
x Set a
_ Set a
_) = forall a. Ord a => a -> Set a -> Set a
insertR a
x Set a
t1
union (Bin Size
1 a
x Set a
_ Set a
_) Set a
t2 = forall a. Ord a => a -> Set a -> Set a
insert a
x Set a
t2
union Set a
Tip Set a
t2 = Set a
t2
union t1 :: Set a
t1@(Bin Size
_ a
x Set a
l1 Set a
r1) Set a
t2 = case forall a. Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS a
x Set a
t2 of
(Set a
l2 :*: Set a
r2)
| Set a
l1l2 forall a. a -> a -> Bool
`ptrEq` Set a
l1 Bool -> Bool -> Bool
&& Set a
r1r2 forall a. a -> a -> Bool
`ptrEq` Set a
r1 -> Set a
t1
| Bool
otherwise -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l1l2 Set a
r1r2
where !l1l2 :: Set a
l1l2 = forall a. Ord a => Set a -> Set a -> Set a
union Set a
l1 Set a
l2
!r1r2 :: Set a
r1r2 = forall a. Ord a => Set a -> Set a -> Set a
union Set a
r1 Set a
r2
#if __GLASGOW_HASKELL__
{-# INLINABLE union #-}
#endif
difference :: Ord a => Set a -> Set a -> Set a
difference :: forall a. Ord a => Set a -> Set a -> Set a
difference Set a
Tip Set a
_ = forall a. Set a
Tip
difference Set a
t1 Set a
Tip = Set a
t1
difference Set a
t1 (Bin Size
_ a
x Set a
l2 Set a
r2) = case forall a. Ord a => a -> Set a -> (Set a, Set a)
split a
x Set a
t1 of
(Set a
l1, Set a
r1)
| forall a. Set a -> Size
size Set a
l1l2 forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
r1r2 forall a. Eq a => a -> a -> Bool
== forall a. Set a -> Size
size Set a
t1 -> Set a
t1
| Bool
otherwise -> forall a. Set a -> Set a -> Set a
merge Set a
l1l2 Set a
r1r2
where !l1l2 :: Set a
l1l2 = forall a. Ord a => Set a -> Set a -> Set a
difference Set a
l1 Set a
l2
!r1r2 :: Set a
r1r2 = forall a. Ord a => Set a -> Set a -> Set a
difference Set a
r1 Set a
r2
#if __GLASGOW_HASKELL__
{-# INLINABLE difference #-}
#endif
intersection :: Ord a => Set a -> Set a -> Set a
intersection :: forall a. Ord a => Set a -> Set a -> Set a
intersection Set a
Tip Set a
_ = forall a. Set a
Tip
intersection Set a
_ Set a
Tip = forall a. Set a
Tip
intersection t1 :: Set a
t1@(Bin Size
_ a
x Set a
l1 Set a
r1) Set a
t2
| Bool
b = if Set a
l1l2 forall a. a -> a -> Bool
`ptrEq` Set a
l1 Bool -> Bool -> Bool
&& Set a
r1r2 forall a. a -> a -> Bool
`ptrEq` Set a
r1
then Set a
t1
else forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l1l2 Set a
r1r2
| Bool
otherwise = forall a. Set a -> Set a -> Set a
merge Set a
l1l2 Set a
r1r2
where
!(Set a
l2, Bool
b, Set a
r2) = forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
x Set a
t2
!l1l2 :: Set a
l1l2 = forall a. Ord a => Set a -> Set a -> Set a
intersection Set a
l1 Set a
l2
!r1r2 :: Set a
r1r2 = forall a. Ord a => Set a -> Set a -> Set a
intersection Set a
r1 Set a
r2
#if __GLASGOW_HASKELL__
{-# INLINABLE intersection #-}
#endif
intersections :: Ord a => NonEmpty (Set a) -> Set a
intersections :: forall a. Ord a => NonEmpty (Set a) -> Set a
intersections (Set a
s0 :| [Set a]
ss) = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
List.foldr forall {a} {a}.
Ord a =>
Set a -> (Set a -> Set a) -> Set a -> Set a
go forall a. a -> a
id [Set a]
ss Set a
s0
where
go :: Set a -> (Set a -> Set a) -> Set a -> Set a
go Set a
s Set a -> Set a
r Set a
acc
| forall a. Set a -> Bool
null Set a
acc = forall a. Set a
empty
| Bool
otherwise = Set a -> Set a
r (forall a. Ord a => Set a -> Set a -> Set a
intersection Set a
acc Set a
s)
newtype Intersection a = Intersection { forall a. Intersection a -> Set a
getIntersection :: Set a }
deriving (Size -> Intersection a -> ShowS
forall a. Show a => Size -> Intersection a -> ShowS
forall a. Show a => [Intersection a] -> ShowS
forall a. Show a => Intersection a -> [Char]
forall a.
(Size -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Intersection a] -> ShowS
$cshowList :: forall a. Show a => [Intersection a] -> ShowS
show :: Intersection a -> [Char]
$cshow :: forall a. Show a => Intersection a -> [Char]
showsPrec :: Size -> Intersection a -> ShowS
$cshowsPrec :: forall a. Show a => Size -> Intersection a -> ShowS
Show, Intersection a -> Intersection a -> Bool
forall a. Eq a => Intersection a -> Intersection a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Intersection a -> Intersection a -> Bool
$c/= :: forall a. Eq a => Intersection a -> Intersection a -> Bool
== :: Intersection a -> Intersection a -> Bool
$c== :: forall a. Eq a => Intersection a -> Intersection a -> Bool
Eq, Intersection a -> Intersection a -> Bool
Intersection a -> Intersection a -> Ordering
Intersection a -> Intersection a -> Intersection 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 {a}. Ord a => Eq (Intersection a)
forall a. Ord a => Intersection a -> Intersection a -> Bool
forall a. Ord a => Intersection a -> Intersection a -> Ordering
forall a.
Ord a =>
Intersection a -> Intersection a -> Intersection a
min :: Intersection a -> Intersection a -> Intersection a
$cmin :: forall a.
Ord a =>
Intersection a -> Intersection a -> Intersection a
max :: Intersection a -> Intersection a -> Intersection a
$cmax :: forall a.
Ord a =>
Intersection a -> Intersection a -> Intersection a
>= :: Intersection a -> Intersection a -> Bool
$c>= :: forall a. Ord a => Intersection a -> Intersection a -> Bool
> :: Intersection a -> Intersection a -> Bool
$c> :: forall a. Ord a => Intersection a -> Intersection a -> Bool
<= :: Intersection a -> Intersection a -> Bool
$c<= :: forall a. Ord a => Intersection a -> Intersection a -> Bool
< :: Intersection a -> Intersection a -> Bool
$c< :: forall a. Ord a => Intersection a -> Intersection a -> Bool
compare :: Intersection a -> Intersection a -> Ordering
$ccompare :: forall a. Ord a => Intersection a -> Intersection a -> Ordering
Ord)
instance (Ord a) => Semigroup (Intersection a) where
(Intersection Set a
a) <> :: Intersection a -> Intersection a -> Intersection a
<> (Intersection Set a
b) = forall a. Set a -> Intersection a
Intersection forall a b. (a -> b) -> a -> b
$ forall a. Ord a => Set a -> Set a -> Set a
intersection Set a
a Set a
b
stimes :: forall b. Integral b => b -> Intersection a -> Intersection a
stimes = forall b a. Integral b => b -> a -> a
stimesIdempotent
filter :: (a -> Bool) -> Set a -> Set a
filter :: forall a. (a -> Bool) -> Set a -> Set a
filter a -> Bool
_ Set a
Tip = forall a. Set a
Tip
filter a -> Bool
p t :: Set a
t@(Bin Size
_ a
x Set a
l Set a
r)
| a -> Bool
p a
x = if Set a
l forall a. a -> a -> Bool
`ptrEq` Set a
l' Bool -> Bool -> Bool
&& Set a
r forall a. a -> a -> Bool
`ptrEq` Set a
r'
then Set a
t
else forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l' Set a
r'
| Bool
otherwise = forall a. Set a -> Set a -> Set a
merge Set a
l' Set a
r'
where
!l' :: Set a
l' = forall a. (a -> Bool) -> Set a -> Set a
filter a -> Bool
p Set a
l
!r' :: Set a
r' = forall a. (a -> Bool) -> Set a -> Set a
filter a -> Bool
p Set a
r
partition :: (a -> Bool) -> Set a -> (Set a,Set a)
partition :: forall a. (a -> Bool) -> Set a -> (Set a, Set a)
partition a -> Bool
p0 Set a
t0 = forall a b. StrictPair a b -> (a, b)
toPair forall a b. (a -> b) -> a -> b
$ forall {a}. (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p0 Set a
t0
where
go :: (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
_ Set a
Tip = (forall a. Set a
Tip forall a b. a -> b -> StrictPair a b
:*: forall a. Set a
Tip)
go a -> Bool
p t :: Set a
t@(Bin Size
_ a
x Set a
l Set a
r) = case ((a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p Set a
l, (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p Set a
r) of
((Set a
l1 :*: Set a
l2), (Set a
r1 :*: Set a
r2))
| a -> Bool
p a
x -> (if Set a
l1 forall a. a -> a -> Bool
`ptrEq` Set a
l Bool -> Bool -> Bool
&& Set a
r1 forall a. a -> a -> Bool
`ptrEq` Set a
r
then Set a
t
else forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l1 Set a
r1) forall a b. a -> b -> StrictPair a b
:*: forall a. Set a -> Set a -> Set a
merge Set a
l2 Set a
r2
| Bool
otherwise -> forall a. Set a -> Set a -> Set a
merge Set a
l1 Set a
r1 forall a b. a -> b -> StrictPair a b
:*:
(if Set a
l2 forall a. a -> a -> Bool
`ptrEq` Set a
l Bool -> Bool -> Bool
&& Set a
r2 forall a. a -> a -> Bool
`ptrEq` Set a
r
then Set a
t
else forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l2 Set a
r2)
map :: Ord b => (a->b) -> Set a -> Set b
map :: forall b a. Ord b => (a -> b) -> Set a -> Set b
map a -> b
f = forall a. Ord a => [a] -> Set a
fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
List.map a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Set a -> [a]
toList
#if __GLASGOW_HASKELL__
{-# INLINABLE map #-}
#endif
mapMonotonic :: (a->b) -> Set a -> Set b
mapMonotonic :: forall a b. (a -> b) -> Set a -> Set b
mapMonotonic a -> b
_ Set a
Tip = forall a. Set a
Tip
mapMonotonic a -> b
f (Bin Size
sz a
x Set a
l Set a
r) = forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
sz (a -> b
f a
x) (forall a b. (a -> b) -> Set a -> Set b
mapMonotonic a -> b
f Set a
l) (forall a b. (a -> b) -> Set a -> Set b
mapMonotonic a -> b
f Set a
r)
fold :: (a -> b -> b) -> b -> Set a -> b
fold :: forall a b. (a -> b -> b) -> b -> Set a -> b
fold = forall a b. (a -> b -> b) -> b -> Set a -> b
foldr
{-# INLINE fold #-}
foldr :: (a -> b -> b) -> b -> Set a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Set a -> b
foldr a -> b -> b
f b
z = b -> Set a -> b
go b
z
where
go :: b -> Set a -> b
go b
z' Set a
Tip = b
z'
go b
z' (Bin Size
_ a
x Set a
l Set a
r) = b -> Set a -> b
go (a -> b -> b
f a
x (b -> Set a -> b
go b
z' Set a
r)) Set a
l
{-# INLINE foldr #-}
foldr' :: (a -> b -> b) -> b -> Set a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Set a -> b
foldr' a -> b -> b
f b
z = b -> Set a -> b
go b
z
where
go :: b -> Set a -> b
go !b
z' Set a
Tip = b
z'
go b
z' (Bin Size
_ a
x Set a
l Set a
r) = b -> Set a -> b
go (a -> b -> b
f a
x forall a b. (a -> b) -> a -> b
$! b -> Set a -> b
go b
z' Set a
r) Set a
l
{-# INLINE foldr' #-}
foldl :: (a -> b -> a) -> a -> Set b -> a
foldl :: forall b a. (b -> a -> b) -> b -> Set a -> b
foldl a -> b -> a
f a
z = a -> Set b -> a
go a
z
where
go :: a -> Set b -> a
go a
z' Set b
Tip = a
z'
go a
z' (Bin Size
_ b
x Set b
l Set b
r) = a -> Set b -> a
go (a -> b -> a
f (a -> Set b -> a
go a
z' Set b
l) b
x) Set b
r
{-# INLINE foldl #-}
foldl' :: (a -> b -> a) -> a -> Set b -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Set a -> b
foldl' a -> b -> a
f a
z = a -> Set b -> a
go a
z
where
go :: a -> Set b -> a
go !a
z' Set b
Tip = a
z'
go a
z' (Bin Size
_ b
x Set b
l Set b
r) =
let !z'' :: a
z'' = a -> Set b -> a
go a
z' Set b
l
in a -> Set b -> a
go (a -> b -> a
f a
z'' b
x) Set b
r
{-# INLINE foldl' #-}
elems :: Set a -> [a]
elems :: forall a. Set a -> [a]
elems = forall a. Set a -> [a]
toAscList
#ifdef __GLASGOW_HASKELL__
instance (Ord a) => GHCExts.IsList (Set a) where
type Item (Set a) = a
fromList :: [Item (Set a)] -> Set a
fromList = forall a. Ord a => [a] -> Set a
fromList
toList :: Set a -> [Item (Set a)]
toList = forall a. Set a -> [a]
toList
#endif
toList :: Set a -> [a]
toList :: forall a. Set a -> [a]
toList = forall a. Set a -> [a]
toAscList
toAscList :: Set a -> [a]
toAscList :: forall a. Set a -> [a]
toAscList = forall a b. (a -> b -> b) -> b -> Set a -> b
foldr (:) []
toDescList :: Set a -> [a]
toDescList :: forall a. Set a -> [a]
toDescList = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl (forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) []
#if __GLASGOW_HASKELL__
foldrFB :: (a -> b -> b) -> b -> Set a -> b
foldrFB :: forall a b. (a -> b -> b) -> b -> Set a -> b
foldrFB = forall a b. (a -> b -> b) -> b -> Set a -> b
foldr
{-# INLINE[0] foldrFB #-}
foldlFB :: (a -> b -> a) -> a -> Set b -> a
foldlFB :: forall b a. (b -> a -> b) -> b -> Set a -> b
foldlFB = forall b a. (b -> a -> b) -> b -> Set a -> b
foldl
{-# INLINE[0] foldlFB #-}
{-# INLINE elems #-}
{-# INLINE toList #-}
{-# NOINLINE[0] toAscList #-}
{-# NOINLINE[0] toDescList #-}
{-# RULES "Set.toAscList" [~1] forall s . toAscList s = build (\c n -> foldrFB c n s) #-}
{-# RULES "Set.toAscListBack" [1] foldrFB (:) [] = toAscList #-}
{-# RULES "Set.toDescList" [~1] forall s . toDescList s = build (\c n -> foldlFB (\xs x -> c x xs) n s) #-}
{-# RULES "Set.toDescListBack" [1] foldlFB (\xs x -> x : xs) [] = toDescList #-}
#endif
fromList :: Ord a => [a] -> Set a
fromList :: forall a. Ord a => [a] -> Set a
fromList [] = forall a. Set a
Tip
fromList [a
x] = forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip
fromList (a
x0 : [a]
xs0) | forall {a}. Ord a => a -> [a] -> Bool
not_ordered a
x0 [a]
xs0 = forall {t :: * -> *} {a}.
(Foldable t, Ord a) =>
Set a -> t a -> Set a
fromList' (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x0 forall a. Set a
Tip forall a. Set a
Tip) [a]
xs0
| Bool
otherwise = forall {a} {t}.
(Ord a, Num t, Bits t) =>
t -> Set a -> [a] -> Set a
go (Size
1::Int) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x0 forall a. Set a
Tip forall a. Set a
Tip) [a]
xs0
where
not_ordered :: a -> [a] -> Bool
not_ordered a
_ [] = Bool
False
not_ordered a
x (a
y : [a]
_) = a
x forall a. Ord a => a -> a -> Bool
>= a
y
{-# INLINE not_ordered #-}
fromList' :: Set a -> t a -> Set a
fromList' Set a
t0 t a
xs = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Foldable.foldl' forall {a}. Ord a => Set a -> a -> Set a
ins Set a
t0 t a
xs
where ins :: Set a -> a -> Set a
ins Set a
t a
x = forall a. Ord a => a -> Set a -> Set a
insert a
x Set a
t
go :: t -> Set a -> [a] -> Set a
go !t
_ Set a
t [] = Set a
t
go t
_ Set a
t [a
x] = forall a. a -> Set a -> Set a
insertMax a
x Set a
t
go t
s Set a
l xs :: [a]
xs@(a
x : [a]
xss) | forall {a}. Ord a => a -> [a] -> Bool
not_ordered a
x [a]
xss = forall {t :: * -> *} {a}.
(Foldable t, Ord a) =>
Set a -> t a -> Set a
fromList' Set a
l [a]
xs
| Bool
otherwise = case forall {t} {a}.
(Num t, Ord a, Bits t) =>
t -> [a] -> (Set a, [a], [a])
create t
s [a]
xss of
(Set a
r, [a]
ys, []) -> t -> Set a -> [a] -> Set a
go (t
s forall a. Bits a => a -> Size -> a
`shiftL` Size
1) (forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) [a]
ys
(Set a
r, [a]
_, [a]
ys) -> forall {t :: * -> *} {a}.
(Foldable t, Ord a) =>
Set a -> t a -> Set a
fromList' (forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) [a]
ys
create :: t -> [a] -> (Set a, [a], [a])
create !t
_ [] = (forall a. Set a
Tip, [], [])
create t
s xs :: [a]
xs@(a
x : [a]
xss)
| t
s forall a. Eq a => a -> a -> Bool
== t
1 = if forall {a}. Ord a => a -> [a] -> Bool
not_ordered a
x [a]
xss then (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip, [], [a]
xss)
else (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip, [a]
xss, [])
| Bool
otherwise = case t -> [a] -> (Set a, [a], [a])
create (t
s forall a. Bits a => a -> Size -> a
`shiftR` Size
1) [a]
xs of
res :: (Set a, [a], [a])
res@(Set a
_, [], [a]
_) -> (Set a, [a], [a])
res
(Set a
l, [a
y], [a]
zs) -> (forall a. a -> Set a -> Set a
insertMax a
y Set a
l, [], [a]
zs)
(Set a
l, ys :: [a]
ys@(a
y:[a]
yss), [a]
_) | forall {a}. Ord a => a -> [a] -> Bool
not_ordered a
y [a]
yss -> (Set a
l, [], [a]
ys)
| Bool
otherwise -> case t -> [a] -> (Set a, [a], [a])
create (t
s forall a. Bits a => a -> Size -> a
`shiftR` Size
1) [a]
yss of
(Set a
r, [a]
zs, [a]
ws) -> (forall a. a -> Set a -> Set a -> Set a
link a
y Set a
l Set a
r, [a]
zs, [a]
ws)
#if __GLASGOW_HASKELL__
{-# INLINABLE fromList #-}
#endif
fromAscList :: Eq a => [a] -> Set a
fromAscList :: forall a. Eq a => [a] -> Set a
fromAscList [a]
xs = forall a. [a] -> Set a
fromDistinctAscList (forall a. Eq a => [a] -> [a]
combineEq [a]
xs)
#if __GLASGOW_HASKELL__
{-# INLINABLE fromAscList #-}
#endif
fromDescList :: Eq a => [a] -> Set a
fromDescList :: forall a. Eq a => [a] -> Set a
fromDescList [a]
xs = forall a. [a] -> Set a
fromDistinctDescList (forall a. Eq a => [a] -> [a]
combineEq [a]
xs)
#if __GLASGOW_HASKELL__
{-# INLINABLE fromDescList #-}
#endif
combineEq :: Eq a => [a] -> [a]
combineEq :: forall a. Eq a => [a] -> [a]
combineEq [] = []
combineEq (a
x : [a]
xs) = forall {t}. Eq t => t -> [t] -> [t]
combineEq' a
x [a]
xs
where
combineEq' :: t -> [t] -> [t]
combineEq' t
z [] = [t
z]
combineEq' t
z (t
y:[t]
ys)
| t
z forall a. Eq a => a -> a -> Bool
== t
y = t -> [t] -> [t]
combineEq' t
z [t]
ys
| Bool
otherwise = t
z forall a. a -> [a] -> [a]
: t -> [t] -> [t]
combineEq' t
y [t]
ys
fromDistinctAscList :: [a] -> Set a
fromDistinctAscList :: forall a. [a] -> Set a
fromDistinctAscList = forall a. FromDistinctMonoState a -> Set a
fromDistinctAscList_linkAll forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Foldable.foldl' forall a. FromDistinctMonoState a -> a -> FromDistinctMonoState a
next (forall a. Stack a -> FromDistinctMonoState a
State0 forall a. Stack a
Nada)
where
next :: FromDistinctMonoState a -> a -> FromDistinctMonoState a
next :: forall a. FromDistinctMonoState a -> a -> FromDistinctMonoState a
next (State0 Stack a
stk) !a
x = forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctAscList_linkTop (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip) Stack a
stk
next (State1 Set a
l Stack a
stk) a
x = forall a. Stack a -> FromDistinctMonoState a
State0 (forall a. a -> Set a -> Stack a -> Stack a
Push a
x Set a
l Stack a
stk)
{-# INLINE fromDistinctAscList #-}
fromDistinctAscList_linkTop :: Set a -> Stack a -> FromDistinctMonoState a
fromDistinctAscList_linkTop :: forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctAscList_linkTop r :: Set a
r@(Bin Size
rsz a
_ Set a
_ Set a
_) (Push a
x l :: Set a
l@(Bin Size
lsz a
_ Set a
_ Set a
_) Stack a
stk)
| Size
rsz forall a. Eq a => a -> a -> Bool
== Size
lsz = forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctAscList_linkTop (forall a. a -> Set a -> Set a -> Set a
bin a
x Set a
l Set a
r) Stack a
stk
fromDistinctAscList_linkTop Set a
l Stack a
stk = forall a. Set a -> Stack a -> FromDistinctMonoState a
State1 Set a
l Stack a
stk
{-# INLINABLE fromDistinctAscList_linkTop #-}
fromDistinctAscList_linkAll :: FromDistinctMonoState a -> Set a
fromDistinctAscList_linkAll :: forall a. FromDistinctMonoState a -> Set a
fromDistinctAscList_linkAll (State0 Stack a
stk) = forall b a. (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack (\Set a
r a
x Set a
l -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) forall a. Set a
Tip Stack a
stk
fromDistinctAscList_linkAll (State1 Set a
r0 Stack a
stk) = forall b a. (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack (\Set a
r a
x Set a
l -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) Set a
r0 Stack a
stk
{-# INLINABLE fromDistinctAscList_linkAll #-}
fromDistinctDescList :: [a] -> Set a
fromDistinctDescList :: forall a. [a] -> Set a
fromDistinctDescList = forall a. FromDistinctMonoState a -> Set a
fromDistinctDescList_linkAll forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Foldable.foldl' forall a. FromDistinctMonoState a -> a -> FromDistinctMonoState a
next (forall a. Stack a -> FromDistinctMonoState a
State0 forall a. Stack a
Nada)
where
next :: FromDistinctMonoState a -> a -> FromDistinctMonoState a
next :: forall a. FromDistinctMonoState a -> a -> FromDistinctMonoState a
next (State0 Stack a
stk) !a
x = forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctDescList_linkTop (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip) Stack a
stk
next (State1 Set a
r Stack a
stk) a
x = forall a. Stack a -> FromDistinctMonoState a
State0 (forall a. a -> Set a -> Stack a -> Stack a
Push a
x Set a
r Stack a
stk)
{-# INLINE fromDistinctDescList #-}
fromDistinctDescList_linkTop :: Set a -> Stack a -> FromDistinctMonoState a
fromDistinctDescList_linkTop :: forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctDescList_linkTop l :: Set a
l@(Bin Size
lsz a
_ Set a
_ Set a
_) (Push a
x r :: Set a
r@(Bin Size
rsz a
_ Set a
_ Set a
_) Stack a
stk)
| Size
lsz forall a. Eq a => a -> a -> Bool
== Size
rsz = forall a. Set a -> Stack a -> FromDistinctMonoState a
fromDistinctDescList_linkTop (forall a. a -> Set a -> Set a -> Set a
bin a
x Set a
l Set a
r) Stack a
stk
fromDistinctDescList_linkTop Set a
r Stack a
stk = forall a. Set a -> Stack a -> FromDistinctMonoState a
State1 Set a
r Stack a
stk
{-# INLINABLE fromDistinctDescList_linkTop #-}
fromDistinctDescList_linkAll :: FromDistinctMonoState a -> Set a
fromDistinctDescList_linkAll :: forall a. FromDistinctMonoState a -> Set a
fromDistinctDescList_linkAll (State0 Stack a
stk) = forall b a. (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack (\Set a
l a
x Set a
r -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) forall a. Set a
Tip Stack a
stk
fromDistinctDescList_linkAll (State1 Set a
l0 Stack a
stk) = forall b a. (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack (\Set a
l a
x Set a
r -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
r) Set a
l0 Stack a
stk
{-# INLINABLE fromDistinctDescList_linkAll #-}
data FromDistinctMonoState a
= State0 !(Stack a)
| State1 !(Set a) !(Stack a)
data Stack a = Push !a !(Set a) !(Stack a) | Nada
foldl'Stack :: (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack :: forall b a. (b -> a -> Set a -> b) -> b -> Stack a -> b
foldl'Stack b -> a -> Set a -> b
f = b -> Stack a -> b
go
where
go :: b -> Stack a -> b
go !b
z Stack a
Nada = b
z
go b
z (Push a
x Set a
t Stack a
stk) = b -> Stack a -> b
go (b -> a -> Set a -> b
f b
z a
x Set a
t) Stack a
stk
{-# INLINE foldl'Stack #-}
instance Eq a => Eq (Set a) where
Set a
t1 == :: Set a -> Set a -> Bool
== Set a
t2 = (forall a. Set a -> Size
size Set a
t1 forall a. Eq a => a -> a -> Bool
== forall a. Set a -> Size
size Set a
t2) Bool -> Bool -> Bool
&& (forall a. Set a -> [a]
toAscList Set a
t1 forall a. Eq a => a -> a -> Bool
== forall a. Set a -> [a]
toAscList Set a
t2)
instance Ord a => Ord (Set a) where
compare :: Set a -> Set a -> Ordering
compare Set a
s1 Set a
s2 = forall a. Ord a => a -> a -> Ordering
compare (forall a. Set a -> [a]
toAscList Set a
s1) (forall a. Set a -> [a]
toAscList Set a
s2)
instance Show a => Show (Set a) where
showsPrec :: Size -> Set a -> ShowS
showsPrec Size
p Set a
xs = Bool -> ShowS -> ShowS
showParen (Size
p forall a. Ord a => a -> a -> Bool
> Size
10) forall a b. (a -> b) -> a -> b
$
[Char] -> ShowS
showString [Char]
"fromList " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows (forall a. Set a -> [a]
toList Set a
xs)
instance Eq1 Set where
liftEq :: forall a b. (a -> b -> Bool) -> Set a -> Set b -> Bool
liftEq a -> b -> Bool
eq Set a
m Set b
n =
forall a. Set a -> Size
size Set a
m forall a. Eq a => a -> a -> Bool
== forall a. Set a -> Size
size Set b
n Bool -> Bool -> Bool
&& forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
eq (forall a. Set a -> [a]
toList Set a
m) (forall a. Set a -> [a]
toList Set b
n)
instance Ord1 Set where
liftCompare :: forall a b. (a -> b -> Ordering) -> Set a -> Set b -> Ordering
liftCompare a -> b -> Ordering
cmp Set a
m Set b
n =
forall (f :: * -> *) a b.
Ord1 f =>
(a -> b -> Ordering) -> f a -> f b -> Ordering
liftCompare a -> b -> Ordering
cmp (forall a. Set a -> [a]
toList Set a
m) (forall a. Set a -> [a]
toList Set b
n)
instance Show1 Set where
liftShowsPrec :: forall a.
(Size -> a -> ShowS) -> ([a] -> ShowS) -> Size -> Set a -> ShowS
liftShowsPrec Size -> a -> ShowS
sp [a] -> ShowS
sl Size
d Set a
m =
forall a. (Size -> a -> ShowS) -> [Char] -> Size -> a -> ShowS
showsUnaryWith (forall (f :: * -> *) a.
Show1 f =>
(Size -> a -> ShowS) -> ([a] -> ShowS) -> Size -> f a -> ShowS
liftShowsPrec Size -> a -> ShowS
sp [a] -> ShowS
sl) [Char]
"fromList" Size
d (forall a. Set a -> [a]
toList Set a
m)
instance (Read a, Ord a) => Read (Set a) where
#ifdef __GLASGOW_HASKELL__
readPrec :: ReadPrec (Set a)
readPrec = forall a. ReadPrec a -> ReadPrec a
parens forall a b. (a -> b) -> a -> b
$ forall a. Size -> ReadPrec a -> ReadPrec a
prec Size
10 forall a b. (a -> b) -> a -> b
$ do
Ident [Char]
"fromList" <- ReadPrec Lexeme
lexP
[a]
xs <- forall a. Read a => ReadPrec a
readPrec
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Ord a => [a] -> Set a
fromList [a]
xs)
readListPrec :: ReadPrec [Set a]
readListPrec = forall a. Read a => ReadPrec [a]
readListPrecDefault
#else
readsPrec p = readParen (p > 10) $ \ r -> do
("fromList",s) <- lex r
(xs,t) <- reads s
return (fromList xs,t)
#endif
instance NFData a => NFData (Set a) where
rnf :: Set a -> ()
rnf Set a
Tip = ()
rnf (Bin Size
_ a
y Set a
l Set a
r) = forall a. NFData a => a -> ()
rnf a
y seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf Set a
l seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf Set a
r
split :: Ord a => a -> Set a -> (Set a,Set a)
split :: forall a. Ord a => a -> Set a -> (Set a, Set a)
split a
x Set a
t = forall a b. StrictPair a b -> (a, b)
toPair forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS a
x Set a
t
{-# INLINABLE split #-}
splitS :: Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS :: forall a. Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS a
_ Set a
Tip = (forall a. Set a
Tip forall a b. a -> b -> StrictPair a b
:*: forall a. Set a
Tip)
splitS a
x (Bin Size
_ a
y Set a
l Set a
r)
= case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT -> let (Set a
lt :*: Set a
gt) = forall a. Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS a
x Set a
l in (Set a
lt forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a -> Set a
link a
y Set a
gt Set a
r)
Ordering
GT -> let (Set a
lt :*: Set a
gt) = forall a. Ord a => a -> Set a -> StrictPair (Set a) (Set a)
splitS a
x Set a
r in (forall a. a -> Set a -> Set a -> Set a
link a
y Set a
l Set a
lt forall a b. a -> b -> StrictPair a b
:*: Set a
gt)
Ordering
EQ -> (Set a
l forall a b. a -> b -> StrictPair a b
:*: Set a
r)
{-# INLINABLE splitS #-}
splitMember :: Ord a => a -> Set a -> (Set a,Bool,Set a)
splitMember :: forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
_ Set a
Tip = (forall a. Set a
Tip, Bool
False, forall a. Set a
Tip)
splitMember a
x (Bin Size
_ a
y Set a
l Set a
r)
= case forall a. Ord a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT -> let (Set a
lt, Bool
found, Set a
gt) = forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
x Set a
l
!gt' :: Set a
gt' = forall a. a -> Set a -> Set a -> Set a
link a
y Set a
gt Set a
r
in (Set a
lt, Bool
found, Set a
gt')
Ordering
GT -> let (Set a
lt, Bool
found, Set a
gt) = forall a. Ord a => a -> Set a -> (Set a, Bool, Set a)
splitMember a
x Set a
r
!lt' :: Set a
lt' = forall a. a -> Set a -> Set a -> Set a
link a
y Set a
l Set a
lt
in (Set a
lt', Bool
found, Set a
gt)
Ordering
EQ -> (Set a
l, Bool
True, Set a
r)
#if __GLASGOW_HASKELL__
{-# INLINABLE splitMember #-}
#endif
findIndex :: Ord a => a -> Set a -> Int
findIndex :: forall a. Ord a => a -> Set a -> Size
findIndex = forall a. Ord a => Size -> a -> Set a -> Size
go Size
0
where
go :: Ord a => Int -> a -> Set a -> Int
go :: forall a. Ord a => Size -> a -> Set a -> Size
go !Size
_ !a
_ Set a
Tip = forall a. HasCallStack => [Char] -> a
error [Char]
"Set.findIndex: element is not in the set"
go Size
idx a
x (Bin Size
_ a
kx Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
kx of
Ordering
LT -> forall a. Ord a => Size -> a -> Set a -> Size
go Size
idx a
x Set a
l
Ordering
GT -> forall a. Ord a => Size -> a -> Set a -> Size
go (Size
idx forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
l forall a. Num a => a -> a -> a
+ Size
1) a
x Set a
r
Ordering
EQ -> Size
idx forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
l
#if __GLASGOW_HASKELL__
{-# INLINABLE findIndex #-}
#endif
lookupIndex :: Ord a => a -> Set a -> Maybe Int
lookupIndex :: forall a. Ord a => a -> Set a -> Maybe Size
lookupIndex = forall a. Ord a => Size -> a -> Set a -> Maybe Size
go Size
0
where
go :: Ord a => Int -> a -> Set a -> Maybe Int
go :: forall a. Ord a => Size -> a -> Set a -> Maybe Size
go !Size
_ !a
_ Set a
Tip = forall a. Maybe a
Nothing
go Size
idx a
x (Bin Size
_ a
kx Set a
l Set a
r) = case forall a. Ord a => a -> a -> Ordering
compare a
x a
kx of
Ordering
LT -> forall a. Ord a => Size -> a -> Set a -> Maybe Size
go Size
idx a
x Set a
l
Ordering
GT -> forall a. Ord a => Size -> a -> Set a -> Maybe Size
go (Size
idx forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
l forall a. Num a => a -> a -> a
+ Size
1) a
x Set a
r
Ordering
EQ -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$! Size
idx forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
l
#if __GLASGOW_HASKELL__
{-# INLINABLE lookupIndex #-}
#endif
elemAt :: Int -> Set a -> a
elemAt :: forall a. Size -> Set a -> a
elemAt !Size
_ Set a
Tip = forall a. HasCallStack => [Char] -> a
error [Char]
"Set.elemAt: index out of range"
elemAt Size
i (Bin Size
_ a
x Set a
l Set a
r)
= case forall a. Ord a => a -> a -> Ordering
compare Size
i Size
sizeL of
Ordering
LT -> forall a. Size -> Set a -> a
elemAt Size
i Set a
l
Ordering
GT -> forall a. Size -> Set a -> a
elemAt (Size
iforall a. Num a => a -> a -> a
-Size
sizeLforall a. Num a => a -> a -> a
-Size
1) Set a
r
Ordering
EQ -> a
x
where
sizeL :: Size
sizeL = forall a. Set a -> Size
size Set a
l
deleteAt :: Int -> Set a -> Set a
deleteAt :: forall a. Size -> Set a -> Set a
deleteAt !Size
i Set a
t =
case Set a
t of
Set a
Tip -> forall a. HasCallStack => [Char] -> a
error [Char]
"Set.deleteAt: index out of range"
Bin Size
_ a
x Set a
l Set a
r -> case forall a. Ord a => a -> a -> Ordering
compare Size
i Size
sizeL of
Ordering
LT -> forall a. a -> Set a -> Set a -> Set a
balanceR a
x (forall a. Size -> Set a -> Set a
deleteAt Size
i Set a
l) Set a
r
Ordering
GT -> forall a. a -> Set a -> Set a -> Set a
balanceL a
x Set a
l (forall a. Size -> Set a -> Set a
deleteAt (Size
iforall a. Num a => a -> a -> a
-Size
sizeLforall a. Num a => a -> a -> a
-Size
1) Set a
r)
Ordering
EQ -> forall a. Set a -> Set a -> Set a
glue Set a
l Set a
r
where
sizeL :: Size
sizeL = forall a. Set a -> Size
size Set a
l
take :: Int -> Set a -> Set a
take :: forall a. Size -> Set a -> Set a
take Size
i Set a
m | Size
i forall a. Ord a => a -> a -> Bool
>= forall a. Set a -> Size
size Set a
m = Set a
m
take Size
i0 Set a
m0 = forall a. Size -> Set a -> Set a
go Size
i0 Set a
m0
where
go :: Size -> Set a -> Set a
go Size
i !Set a
_ | Size
i forall a. Ord a => a -> a -> Bool
<= Size
0 = forall a. Set a
Tip
go !Size
_ Set a
Tip = forall a. Set a
Tip
go Size
i (Bin Size
_ a
x Set a
l Set a
r) =
case forall a. Ord a => a -> a -> Ordering
compare Size
i Size
sizeL of
Ordering
LT -> Size -> Set a -> Set a
go Size
i Set a
l
Ordering
GT -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l (Size -> Set a -> Set a
go (Size
i forall a. Num a => a -> a -> a
- Size
sizeL forall a. Num a => a -> a -> a
- Size
1) Set a
r)
Ordering
EQ -> Set a
l
where sizeL :: Size
sizeL = forall a. Set a -> Size
size Set a
l
drop :: Int -> Set a -> Set a
drop :: forall a. Size -> Set a -> Set a
drop Size
i Set a
m | Size
i forall a. Ord a => a -> a -> Bool
>= forall a. Set a -> Size
size Set a
m = forall a. Set a
Tip
drop Size
i0 Set a
m0 = forall a. Size -> Set a -> Set a
go Size
i0 Set a
m0
where
go :: Size -> Set a -> Set a
go Size
i Set a
m | Size
i forall a. Ord a => a -> a -> Bool
<= Size
0 = Set a
m
go !Size
_ Set a
Tip = forall a. Set a
Tip
go Size
i (Bin Size
_ a
x Set a
l Set a
r) =
case forall a. Ord a => a -> a -> Ordering
compare Size
i Size
sizeL of
Ordering
LT -> forall a. a -> Set a -> Set a -> Set a
link a
x (Size -> Set a -> Set a
go Size
i Set a
l) Set a
r
Ordering
GT -> Size -> Set a -> Set a
go (Size
i forall a. Num a => a -> a -> a
- Size
sizeL forall a. Num a => a -> a -> a
- Size
1) Set a
r
Ordering
EQ -> forall a. a -> Set a -> Set a
insertMin a
x Set a
r
where sizeL :: Size
sizeL = forall a. Set a -> Size
size Set a
l
splitAt :: Int -> Set a -> (Set a, Set a)
splitAt :: forall a. Size -> Set a -> (Set a, Set a)
splitAt Size
i0 Set a
m0
| Size
i0 forall a. Ord a => a -> a -> Bool
>= forall a. Set a -> Size
size Set a
m0 = (Set a
m0, forall a. Set a
Tip)
| Bool
otherwise = forall a b. StrictPair a b -> (a, b)
toPair forall a b. (a -> b) -> a -> b
$ forall {a}. Size -> Set a -> StrictPair (Set a) (Set a)
go Size
i0 Set a
m0
where
go :: Size -> Set a -> StrictPair (Set a) (Set a)
go Size
i Set a
m | Size
i forall a. Ord a => a -> a -> Bool
<= Size
0 = forall a. Set a
Tip forall a b. a -> b -> StrictPair a b
:*: Set a
m
go !Size
_ Set a
Tip = forall a. Set a
Tip forall a b. a -> b -> StrictPair a b
:*: forall a. Set a
Tip
go Size
i (Bin Size
_ a
x Set a
l Set a
r)
= case forall a. Ord a => a -> a -> Ordering
compare Size
i Size
sizeL of
Ordering
LT -> case Size -> Set a -> StrictPair (Set a) (Set a)
go Size
i Set a
l of
Set a
ll :*: Set a
lr -> Set a
ll forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a -> Set a
link a
x Set a
lr Set a
r
Ordering
GT -> case Size -> Set a -> StrictPair (Set a) (Set a)
go (Size
i forall a. Num a => a -> a -> a
- Size
sizeL forall a. Num a => a -> a -> a
- Size
1) Set a
r of
Set a
rl :*: Set a
rr -> forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
rl forall a b. a -> b -> StrictPair a b
:*: Set a
rr
Ordering
EQ -> Set a
l forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a
insertMin a
x Set a
r
where sizeL :: Size
sizeL = forall a. Set a -> Size
size Set a
l
takeWhileAntitone :: (a -> Bool) -> Set a -> Set a
takeWhileAntitone :: forall a. (a -> Bool) -> Set a -> Set a
takeWhileAntitone a -> Bool
_ Set a
Tip = forall a. Set a
Tip
takeWhileAntitone a -> Bool
p (Bin Size
_ a
x Set a
l Set a
r)
| a -> Bool
p a
x = forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l (forall a. (a -> Bool) -> Set a -> Set a
takeWhileAntitone a -> Bool
p Set a
r)
| Bool
otherwise = forall a. (a -> Bool) -> Set a -> Set a
takeWhileAntitone a -> Bool
p Set a
l
dropWhileAntitone :: (a -> Bool) -> Set a -> Set a
dropWhileAntitone :: forall a. (a -> Bool) -> Set a -> Set a
dropWhileAntitone a -> Bool
_ Set a
Tip = forall a. Set a
Tip
dropWhileAntitone a -> Bool
p (Bin Size
_ a
x Set a
l Set a
r)
| a -> Bool
p a
x = forall a. (a -> Bool) -> Set a -> Set a
dropWhileAntitone a -> Bool
p Set a
r
| Bool
otherwise = forall a. a -> Set a -> Set a -> Set a
link a
x (forall a. (a -> Bool) -> Set a -> Set a
dropWhileAntitone a -> Bool
p Set a
l) Set a
r
spanAntitone :: (a -> Bool) -> Set a -> (Set a, Set a)
spanAntitone :: forall a. (a -> Bool) -> Set a -> (Set a, Set a)
spanAntitone a -> Bool
p0 Set a
m = forall a b. StrictPair a b -> (a, b)
toPair (forall {a}. (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p0 Set a
m)
where
go :: (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
_ Set a
Tip = forall a. Set a
Tip forall a b. a -> b -> StrictPair a b
:*: forall a. Set a
Tip
go a -> Bool
p (Bin Size
_ a
x Set a
l Set a
r)
| a -> Bool
p a
x = let Set a
u :*: Set a
v = (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p Set a
r in forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
u forall a b. a -> b -> StrictPair a b
:*: Set a
v
| Bool
otherwise = let Set a
u :*: Set a
v = (a -> Bool) -> Set a -> StrictPair (Set a) (Set a)
go a -> Bool
p Set a
l in Set a
u forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a -> Set a
link a
x Set a
v Set a
r
link :: a -> Set a -> Set a -> Set a
link :: forall a. a -> Set a -> Set a -> Set a
link a
x Set a
Tip Set a
r = forall a. a -> Set a -> Set a
insertMin a
x Set a
r
link a
x Set a
l Set a
Tip = forall a. a -> Set a -> Set a
insertMax a
x Set a
l
link a
x l :: Set a
l@(Bin Size
sizeL a
y Set a
ly Set a
ry) r :: Set a
r@(Bin Size
sizeR a
z Set a
lz Set a
rz)
| Size
deltaforall a. Num a => a -> a -> a
*Size
sizeL forall a. Ord a => a -> a -> Bool
< Size
sizeR = forall a. a -> Set a -> Set a -> Set a
balanceL a
z (forall a. a -> Set a -> Set a -> Set a
link a
x Set a
l Set a
lz) Set a
rz
| Size
deltaforall a. Num a => a -> a -> a
*Size
sizeR forall a. Ord a => a -> a -> Bool
< Size
sizeL = forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
ly (forall a. a -> Set a -> Set a -> Set a
link a
x Set a
ry Set a
r)
| Bool
otherwise = forall a. a -> Set a -> Set a -> Set a
bin a
x Set a
l Set a
r
insertMax,insertMin :: a -> Set a -> Set a
insertMax :: forall a. a -> Set a -> Set a
insertMax a
x Set a
t
= case Set a
t of
Set a
Tip -> forall a. a -> Set a
singleton a
x
Bin Size
_ a
y Set a
l Set a
r
-> forall a. a -> Set a -> Set a -> Set a
balanceR a
y Set a
l (forall a. a -> Set a -> Set a
insertMax a
x Set a
r)
insertMin :: forall a. a -> Set a -> Set a
insertMin a
x Set a
t
= case Set a
t of
Set a
Tip -> forall a. a -> Set a
singleton a
x
Bin Size
_ a
y Set a
l Set a
r
-> forall a. a -> Set a -> Set a -> Set a
balanceL a
y (forall a. a -> Set a -> Set a
insertMin a
x Set a
l) Set a
r
merge :: Set a -> Set a -> Set a
merge :: forall a. Set a -> Set a -> Set a
merge Set a
Tip Set a
r = Set a
r
merge Set a
l Set a
Tip = Set a
l
merge l :: Set a
l@(Bin Size
sizeL a
x Set a
lx Set a
rx) r :: Set a
r@(Bin Size
sizeR a
y Set a
ly Set a
ry)
| Size
deltaforall a. Num a => a -> a -> a
*Size
sizeL forall a. Ord a => a -> a -> Bool
< Size
sizeR = forall a. a -> Set a -> Set a -> Set a
balanceL a
y (forall a. Set a -> Set a -> Set a
merge Set a
l Set a
ly) Set a
ry
| Size
deltaforall a. Num a => a -> a -> a
*Size
sizeR forall a. Ord a => a -> a -> Bool
< Size
sizeL = forall a. a -> Set a -> Set a -> Set a
balanceR a
x Set a
lx (forall a. Set a -> Set a -> Set a
merge Set a
rx Set a
r)
| Bool
otherwise = forall a. Set a -> Set a -> Set a
glue Set a
l Set a
r
glue :: Set a -> Set a -> Set a
glue :: forall a. Set a -> Set a -> Set a
glue Set a
Tip Set a
r = Set a
r
glue Set a
l Set a
Tip = Set a
l
glue l :: Set a
l@(Bin Size
sl a
xl Set a
ll Set a
lr) r :: Set a
r@(Bin Size
sr a
xr Set a
rl Set a
rr)
| Size
sl forall a. Ord a => a -> a -> Bool
> Size
sr = let !(a
m :*: Set a
l') = forall a. a -> Set a -> Set a -> StrictPair a (Set a)
maxViewSure a
xl Set a
ll Set a
lr in forall a. a -> Set a -> Set a -> Set a
balanceR a
m Set a
l' Set a
r
| Bool
otherwise = let !(a
m :*: Set a
r') = forall a. a -> Set a -> Set a -> StrictPair a (Set a)
minViewSure a
xr Set a
rl Set a
rr in forall a. a -> Set a -> Set a -> Set a
balanceL a
m Set a
l Set a
r'
deleteFindMin :: Set a -> (a,Set a)
deleteFindMin :: forall a. Set a -> (a, Set a)
deleteFindMin Set a
t
| Just (a, Set a)
r <- forall a. Set a -> Maybe (a, Set a)
minView Set a
t = (a, Set a)
r
| Bool
otherwise = (forall a. HasCallStack => [Char] -> a
error [Char]
"Set.deleteFindMin: can not return the minimal element of an empty set", forall a. Set a
Tip)
deleteFindMax :: Set a -> (a,Set a)
deleteFindMax :: forall a. Set a -> (a, Set a)
deleteFindMax Set a
t
| Just (a, Set a)
r <- forall a. Set a -> Maybe (a, Set a)
maxView Set a
t = (a, Set a)
r
| Bool
otherwise = (forall a. HasCallStack => [Char] -> a
error [Char]
"Set.deleteFindMax: can not return the maximal element of an empty set", forall a. Set a
Tip)
minViewSure :: a -> Set a -> Set a -> StrictPair a (Set a)
minViewSure :: forall a. a -> Set a -> Set a -> StrictPair a (Set a)
minViewSure = forall a. a -> Set a -> Set a -> StrictPair a (Set a)
go
where
go :: t -> Set t -> Set t -> StrictPair t (Set t)
go t
x Set t
Tip Set t
r = t
x forall a b. a -> b -> StrictPair a b
:*: Set t
r
go t
x (Bin Size
_ t
xl Set t
ll Set t
lr) Set t
r =
case t -> Set t -> Set t -> StrictPair t (Set t)
go t
xl Set t
ll Set t
lr of
t
xm :*: Set t
l' -> t
xm forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a -> Set a
balanceR t
x Set t
l' Set t
r
minView :: Set a -> Maybe (a, Set a)
minView :: forall a. Set a -> Maybe (a, Set a)
minView Set a
Tip = forall a. Maybe a
Nothing
minView (Bin Size
_ a
x Set a
l Set a
r) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$! forall a b. StrictPair a b -> (a, b)
toPair forall a b. (a -> b) -> a -> b
$ forall a. a -> Set a -> Set a -> StrictPair a (Set a)
minViewSure a
x Set a
l Set a
r
maxViewSure :: a -> Set a -> Set a -> StrictPair a (Set a)
maxViewSure :: forall a. a -> Set a -> Set a -> StrictPair a (Set a)
maxViewSure = forall a. a -> Set a -> Set a -> StrictPair a (Set a)
go
where
go :: t -> Set t -> Set t -> StrictPair t (Set t)
go t
x Set t
l Set t
Tip = t
x forall a b. a -> b -> StrictPair a b
:*: Set t
l
go t
x Set t
l (Bin Size
_ t
xr Set t
rl Set t
rr) =
case t -> Set t -> Set t -> StrictPair t (Set t)
go t
xr Set t
rl Set t
rr of
t
xm :*: Set t
r' -> t
xm forall a b. a -> b -> StrictPair a b
:*: forall a. a -> Set a -> Set a -> Set a
balanceL t
x Set t
l Set t
r'
maxView :: Set a -> Maybe (a, Set a)
maxView :: forall a. Set a -> Maybe (a, Set a)
maxView Set a
Tip = forall a. Maybe a
Nothing
maxView (Bin Size
_ a
x Set a
l Set a
r) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$! forall a b. StrictPair a b -> (a, b)
toPair forall a b. (a -> b) -> a -> b
$ forall a. a -> Set a -> Set a -> StrictPair a (Set a)
maxViewSure a
x Set a
l Set a
r
delta,ratio :: Int
delta :: Size
delta = Size
3
ratio :: Size
ratio = Size
2
balanceL :: a -> Set a -> Set a -> Set a
balanceL :: forall a. a -> Set a -> Set a -> Set a
balanceL a
x Set a
l Set a
r = case Set a
r of
Set a
Tip -> case Set a
l of
Set a
Tip -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip
(Bin Size
_ a
_ Set a
Tip Set a
Tip) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
2 a
x Set a
l forall a. Set a
Tip
(Bin Size
_ a
lx Set a
Tip (Bin Size
_ a
lrx Set a
_ Set a
_)) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
3 a
lrx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
lx forall a. Set a
Tip forall a. Set a
Tip) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip)
(Bin Size
_ a
lx ll :: Set a
ll@(Bin Size
_ a
_ Set a
_ Set a
_) Set a
Tip) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
3 a
lx Set a
ll (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip)
(Bin Size
ls a
lx ll :: Set a
ll@(Bin Size
lls a
_ Set a
_ Set a
_) lr :: Set a
lr@(Bin Size
lrs a
lrx Set a
lrl Set a
lrr))
| Size
lrs forall a. Ord a => a -> a -> Bool
< Size
ratioforall a. Num a => a -> a -> a
*Size
lls -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
ls) a
lx Set a
ll (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lrs) a
x Set a
lr forall a. Set a
Tip)
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
ls) a
lrx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
llsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
lrl) a
lx Set a
ll Set a
lrl) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
lrr) a
x Set a
lrr forall a. Set a
Tip)
(Bin Size
rs a
_ Set a
_ Set a
_) -> case Set a
l of
Set a
Tip -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rs) a
x forall a. Set a
Tip Set a
r
(Bin Size
ls a
lx Set a
ll Set a
lr)
| Size
ls forall a. Ord a => a -> a -> Bool
> Size
deltaforall a. Num a => a -> a -> a
*Size
rs -> case (Set a
ll, Set a
lr) of
(Bin Size
lls a
_ Set a
_ Set a
_, Bin Size
lrs a
lrx Set a
lrl Set a
lrr)
| Size
lrs forall a. Ord a => a -> a -> Bool
< Size
ratioforall a. Num a => a -> a -> a
*Size
lls -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
lx Set a
ll (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rsforall a. Num a => a -> a -> a
+Size
lrs) a
x Set a
lr Set a
r)
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
lrx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
llsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
lrl) a
lx Set a
ll Set a
lrl) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
lrr) a
x Set a
lrr Set a
r)
(Set a
_, Set a
_) -> forall a. HasCallStack => [Char] -> a
error [Char]
"Failure in Data.Set.balanceL"
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
x Set a
l Set a
r
{-# NOINLINE balanceL #-}
balanceR :: a -> Set a -> Set a -> Set a
balanceR :: forall a. a -> Set a -> Set a -> Set a
balanceR a
x Set a
l Set a
r = case Set a
l of
Set a
Tip -> case Set a
r of
Set a
Tip -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip
(Bin Size
_ a
_ Set a
Tip Set a
Tip) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
2 a
x forall a. Set a
Tip Set a
r
(Bin Size
_ a
rx Set a
Tip rr :: Set a
rr@(Bin Size
_ a
_ Set a
_ Set a
_)) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
3 a
rx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip) Set a
rr
(Bin Size
_ a
rx (Bin Size
_ a
rlx Set a
_ Set a
_) Set a
Tip) -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
3 a
rlx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
x forall a. Set a
Tip forall a. Set a
Tip) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin Size
1 a
rx forall a. Set a
Tip forall a. Set a
Tip)
(Bin Size
rs a
rx rl :: Set a
rl@(Bin Size
rls a
rlx Set a
rll Set a
rlr) rr :: Set a
rr@(Bin Size
rrs a
_ Set a
_ Set a
_))
| Size
rls forall a. Ord a => a -> a -> Bool
< Size
ratioforall a. Num a => a -> a -> a
*Size
rrs -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rs) a
rx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rls) a
x forall a. Set a
Tip Set a
rl) Set a
rr
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rs) a
rlx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
rll) a
x forall a. Set a
Tip Set a
rll) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rrsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
rlr) a
rx Set a
rlr Set a
rr)
(Bin Size
ls a
_ Set a
_ Set a
_) -> case Set a
r of
Set a
Tip -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
ls) a
x Set a
l forall a. Set a
Tip
(Bin Size
rs a
rx Set a
rl Set a
rr)
| Size
rs forall a. Ord a => a -> a -> Bool
> Size
deltaforall a. Num a => a -> a -> a
*Size
ls -> case (Set a
rl, Set a
rr) of
(Bin Size
rls a
rlx Set a
rll Set a
rlr, Bin Size
rrs a
_ Set a
_ Set a
_)
| Size
rls forall a. Ord a => a -> a -> Bool
< Size
ratioforall a. Num a => a -> a -> a
*Size
rrs -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
rx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rls) a
x Set a
l Set a
rl) Set a
rr
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
rlx (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
rll) a
x Set a
l Set a
rll) (forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
rrsforall a. Num a => a -> a -> a
+forall a. Set a -> Size
size Set a
rlr) a
rx Set a
rlr Set a
rr)
(Set a
_, Set a
_) -> forall a. HasCallStack => [Char] -> a
error [Char]
"Failure in Data.Set.balanceR"
| Bool
otherwise -> forall a. Size -> a -> Set a -> Set a -> Set a
Bin (Size
1forall a. Num a => a -> a -> a
+Size
lsforall a. Num a => a -> a -> a
+Size
rs) a
x Set a
l Set a
r
{-# NOINLINE balanceR #-}
bin :: a -> Set a -> Set a -> Set a
bin :: forall a. a -> Set a -> Set a -> Set a
bin a
x Set a
l Set a
r
= forall a. Size -> a -> Set a -> Set a -> Set a
Bin (forall a. Set a -> Size
size Set a
l forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
r forall a. Num a => a -> a -> a
+ Size
1) a
x Set a
l Set a
r
{-# INLINE bin #-}
splitRoot :: Set a -> [Set a]
splitRoot :: forall a. Set a -> [Set a]
splitRoot Set a
orig =
case Set a
orig of
Set a
Tip -> []
Bin Size
_ a
v Set a
l Set a
r -> [Set a
l, forall a. a -> Set a
singleton a
v, Set a
r]
{-# INLINE splitRoot #-}
powerSet :: Set a -> Set (Set a)
powerSet :: forall a. Set a -> Set (Set a)
powerSet Set a
xs0 = forall a. a -> Set a -> Set a
insertMin forall a. Set a
empty (forall a b. (a -> b -> b) -> b -> Set a -> b
foldr' forall {a}. a -> Set (Set a) -> Set (Set a)
step forall a. Set a
Tip Set a
xs0) where
step :: a -> Set (Set a) -> Set (Set a)
step a
x Set (Set a)
pxs = forall a. a -> Set a -> Set a
insertMin (forall a. a -> Set a
singleton a
x) (forall a. a -> Set a -> Set a
insertMin a
x forall a b. (a -> b) -> Set a -> Set b
`mapMonotonic` Set (Set a)
pxs) forall a. Set a -> Set a -> Set a
`glue` Set (Set a)
pxs
cartesianProduct :: Set a -> Set b -> Set (a, b)
cartesianProduct :: forall a b. Set a -> Set b -> Set (a, b)
cartesianProduct !Set a
_as Set b
Tip = forall a. Set a
Tip
cartesianProduct Set a
as (Bin Size
1 b
b Set b
_ Set b
_) = forall a b. (a -> b) -> Set a -> Set b
mapMonotonic (forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) b
b) Set a
as
cartesianProduct Set a
as Set b
bs =
forall a. MergeSet a -> Set a
getMergeSet forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (\a
a -> forall a. Set a -> MergeSet a
MergeSet forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> Set a -> Set b
mapMonotonic ((,) a
a) Set b
bs) Set a
as
newtype MergeSet a = MergeSet { forall a. MergeSet a -> Set a
getMergeSet :: Set a }
instance Semigroup (MergeSet a) where
MergeSet Set a
xs <> :: MergeSet a -> MergeSet a -> MergeSet a
<> MergeSet Set a
ys = forall a. Set a -> MergeSet a
MergeSet (forall a. Set a -> Set a -> Set a
merge Set a
xs Set a
ys)
instance Monoid (MergeSet a) where
mempty :: MergeSet a
mempty = forall a. Set a -> MergeSet a
MergeSet forall a. Set a
empty
mappend :: MergeSet a -> MergeSet a -> MergeSet a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
disjointUnion :: Set a -> Set b -> Set (Either a b)
disjointUnion :: forall a b. Set a -> Set b -> Set (Either a b)
disjointUnion Set a
as Set b
bs = forall a. Set a -> Set a -> Set a
merge (forall a b. (a -> b) -> Set a -> Set b
mapMonotonic forall a b. a -> Either a b
Left Set a
as) (forall a b. (a -> b) -> Set a -> Set b
mapMonotonic forall a b. b -> Either a b
Right Set b
bs)
showTree :: Show a => Set a -> String
showTree :: forall a. Show a => Set a -> [Char]
showTree Set a
s
= forall a. Show a => Bool -> Bool -> Set a -> [Char]
showTreeWith Bool
True Bool
False Set a
s
showTreeWith :: Show a => Bool -> Bool -> Set a -> String
showTreeWith :: forall a. Show a => Bool -> Bool -> Set a -> [Char]
showTreeWith Bool
hang Bool
wide Set a
t
| Bool
hang = (forall a. Show a => Bool -> [[Char]] -> Set a -> ShowS
showsTreeHang Bool
wide [] Set a
t) [Char]
""
| Bool
otherwise = (forall a. Show a => Bool -> [[Char]] -> [[Char]] -> Set a -> ShowS
showsTree Bool
wide [] [] Set a
t) [Char]
""
showsTree :: Show a => Bool -> [String] -> [String] -> Set a -> ShowS
showsTree :: forall a. Show a => Bool -> [[Char]] -> [[Char]] -> Set a -> ShowS
showsTree Bool
wide [[Char]]
lbars [[Char]]
rbars Set a
t
= case Set a
t of
Set a
Tip -> [[Char]] -> ShowS
showsBars [[Char]]
lbars forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"|\n"
Bin Size
_ a
x Set a
Tip Set a
Tip
-> [[Char]] -> ShowS
showsBars [[Char]]
lbars forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"\n"
Bin Size
_ a
x Set a
l Set a
r
-> forall a. Show a => Bool -> [[Char]] -> [[Char]] -> Set a -> ShowS
showsTree Bool
wide ([[Char]] -> [[Char]]
withBar [[Char]]
rbars) ([[Char]] -> [[Char]]
withEmpty [[Char]]
rbars) Set a
r forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Bool -> [[Char]] -> ShowS
showWide Bool
wide [[Char]]
rbars forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[[Char]] -> ShowS
showsBars [[Char]]
lbars forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"\n" forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Bool -> [[Char]] -> ShowS
showWide Bool
wide [[Char]]
lbars forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Bool -> [[Char]] -> [[Char]] -> Set a -> ShowS
showsTree Bool
wide ([[Char]] -> [[Char]]
withEmpty [[Char]]
lbars) ([[Char]] -> [[Char]]
withBar [[Char]]
lbars) Set a
l
showsTreeHang :: Show a => Bool -> [String] -> Set a -> ShowS
showsTreeHang :: forall a. Show a => Bool -> [[Char]] -> Set a -> ShowS
showsTreeHang Bool
wide [[Char]]
bars Set a
t
= case Set a
t of
Set a
Tip -> [[Char]] -> ShowS
showsBars [[Char]]
bars forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"|\n"
Bin Size
_ a
x Set a
Tip Set a
Tip
-> [[Char]] -> ShowS
showsBars [[Char]]
bars forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"\n"
Bin Size
_ a
x Set a
l Set a
r
-> [[Char]] -> ShowS
showsBars [[Char]]
bars forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"\n" forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Bool -> [[Char]] -> ShowS
showWide Bool
wide [[Char]]
bars forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Bool -> [[Char]] -> Set a -> ShowS
showsTreeHang Bool
wide ([[Char]] -> [[Char]]
withBar [[Char]]
bars) Set a
l forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Bool -> [[Char]] -> ShowS
showWide Bool
wide [[Char]]
bars forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a. Show a => Bool -> [[Char]] -> Set a -> ShowS
showsTreeHang Bool
wide ([[Char]] -> [[Char]]
withEmpty [[Char]]
bars) Set a
r
showWide :: Bool -> [String] -> String -> String
showWide :: Bool -> [[Char]] -> ShowS
showWide Bool
wide [[Char]]
bars
| Bool
wide = [Char] -> ShowS
showString (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a. [a] -> [a]
reverse [[Char]]
bars)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
"|\n"
| Bool
otherwise = forall a. a -> a
id
showsBars :: [String] -> ShowS
showsBars :: [[Char]] -> ShowS
showsBars [[Char]]
bars
= case [[Char]]
bars of
[] -> forall a. a -> a
id
[Char]
_ : [[Char]]
tl -> [Char] -> ShowS
showString (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a. [a] -> [a]
reverse [[Char]]
tl)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ShowS
showString [Char]
node
node :: String
node :: [Char]
node = [Char]
"+--"
withBar, withEmpty :: [String] -> [String]
withBar :: [[Char]] -> [[Char]]
withBar [[Char]]
bars = [Char]
"| "forall a. a -> [a] -> [a]
:[[Char]]
bars
withEmpty :: [[Char]] -> [[Char]]
withEmpty [[Char]]
bars = [Char]
" "forall a. a -> [a] -> [a]
:[[Char]]
bars
valid :: Ord a => Set a -> Bool
valid :: forall a. Ord a => Set a -> Bool
valid Set a
t
= forall a. Set a -> Bool
balanced Set a
t Bool -> Bool -> Bool
&& forall a. Ord a => Set a -> Bool
ordered Set a
t Bool -> Bool -> Bool
&& forall a. Set a -> Bool
validsize Set a
t
ordered :: Ord a => Set a -> Bool
ordered :: forall a. Ord a => Set a -> Bool
ordered Set a
t
= forall {t}. Ord t => (t -> Bool) -> (t -> Bool) -> Set t -> Bool
bounded (forall a b. a -> b -> a
const Bool
True) (forall a b. a -> b -> a
const Bool
True) Set a
t
where
bounded :: (t -> Bool) -> (t -> Bool) -> Set t -> Bool
bounded t -> Bool
lo t -> Bool
hi Set t
t'
= case Set t
t' of
Set t
Tip -> Bool
True
Bin Size
_ t
x Set t
l Set t
r -> (t -> Bool
lo t
x) Bool -> Bool -> Bool
&& (t -> Bool
hi t
x) Bool -> Bool -> Bool
&& (t -> Bool) -> (t -> Bool) -> Set t -> Bool
bounded t -> Bool
lo (forall a. Ord a => a -> a -> Bool
<t
x) Set t
l Bool -> Bool -> Bool
&& (t -> Bool) -> (t -> Bool) -> Set t -> Bool
bounded (forall a. Ord a => a -> a -> Bool
>t
x) t -> Bool
hi Set t
r
balanced :: Set a -> Bool
balanced :: forall a. Set a -> Bool
balanced Set a
t
= case Set a
t of
Set a
Tip -> Bool
True
Bin Size
_ a
_ Set a
l Set a
r -> (forall a. Set a -> Size
size Set a
l forall a. Num a => a -> a -> a
+ forall a. Set a -> Size
size Set a
r forall a. Ord a => a -> a -> Bool
<= Size
1 Bool -> Bool -> Bool
|| (forall a. Set a -> Size
size Set a
l forall a. Ord a => a -> a -> Bool
<= Size
deltaforall a. Num a => a -> a -> a
*forall a. Set a -> Size
size Set a
r Bool -> Bool -> Bool
&& forall a. Set a -> Size
size Set a
r forall a. Ord a => a -> a -> Bool
<= Size
deltaforall a. Num a => a -> a -> a
*forall a. Set a -> Size
size Set a
l)) Bool -> Bool -> Bool
&&
forall a. Set a -> Bool
balanced Set a
l Bool -> Bool -> Bool
&& forall a. Set a -> Bool
balanced Set a
r
validsize :: Set a -> Bool
validsize :: forall a. Set a -> Bool
validsize Set a
t
= (forall {a}. Set a -> Maybe Size
realsize Set a
t forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just (forall a. Set a -> Size
size Set a
t))
where
realsize :: Set a -> Maybe Size
realsize Set a
t'
= case Set a
t' of
Set a
Tip -> forall a. a -> Maybe a
Just Size
0
Bin Size
sz a
_ Set a
l Set a
r -> case (Set a -> Maybe Size
realsize Set a
l,Set a -> Maybe Size
realsize Set a
r) of
(Just Size
n,Just Size
m) | Size
nforall a. Num a => a -> a -> a
+Size
mforall a. Num a => a -> a -> a
+Size
1 forall a. Eq a => a -> a -> Bool
== Size
sz -> forall a. a -> Maybe a
Just Size
sz
(Maybe Size, Maybe Size)
_ -> forall a. Maybe a
Nothing