{-# LANGUAGE BangPatterns, UnboxedTuples, Safe #-}
module Data.RangeSet.Internal.Extractors (module Data.RangeSet.Internal.Extractors) where

import Prelude

import Data.RangeSet.Internal.Types
import Data.RangeSet.Internal.SmartConstructors

{-# INLINEABLE minRange #-}
minRange :: E -> E -> RangeSet a -> (# E, E #)
minRange :: E -> E -> RangeSet a -> (# E, E #)
minRange !E
l !E
u RangeSet a
Tip                 = (# E
l, E
u #)
minRange E
_  E
_  (Fork E
_ E
_ E
l E
u RangeSet a
lt RangeSet a
_) = E -> E -> RangeSet a -> (# E, E #)
forall a. E -> E -> RangeSet a -> (# E, E #)
minRange E
l E
u RangeSet a
lt

{-# INLINEABLE maxRange #-}
maxRange :: E -> E -> RangeSet a -> (# E, E #)
maxRange :: E -> E -> RangeSet a -> (# E, E #)
maxRange !E
l !E
u RangeSet a
Tip                 = (# E
l, E
u #)
maxRange E
_  E
_  (Fork E
_ E
_ E
l E
u RangeSet a
_ RangeSet a
rt) = E -> E -> RangeSet a -> (# E, E #)
forall a. E -> E -> RangeSet a -> (# E, E #)
maxRange E
l E
u RangeSet a
rt

{-# INLINE minDelete #-}
minDelete :: Size -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, RangeSet a #)
minDelete :: E -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, RangeSet a #)
minDelete !E
sz !E
l !E
u !RangeSet a
lt !RangeSet a
rt = let (# !E
ml, !E
mu, !E
_, RangeSet a
t' #) = E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
forall a.
E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go E
sz E
l E
u RangeSet a
lt RangeSet a
rt in (# E
ml, E
mu, RangeSet a
t' #)
  where
    go :: Size -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, Size, RangeSet a #)
    go :: E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go !E
sz !E
l !E
u RangeSet a
Tip !RangeSet a
rt = (# E
l, E
u, E
sz E -> E -> E
forall a. Num a => a -> a -> a
- RangeSet a -> E
forall a. RangeSet a -> E
size RangeSet a
rt, RangeSet a
rt #)
    go E
sz E
l E
u (Fork E
_ E
lsz E
ll E
lu RangeSet a
llt RangeSet a
lrt) RangeSet a
rt =
      let (# !E
ml, !E
mu, !E
msz, RangeSet a
lt' #) = E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
forall a.
E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go E
lsz E
ll E
lu RangeSet a
llt RangeSet a
lrt
      in (# E
ml, E
mu, E
msz, E -> E -> E -> RangeSet a -> RangeSet a -> RangeSet a
forall a. E -> E -> E -> RangeSet a -> RangeSet a -> RangeSet a
balanceR (E
sz E -> E -> E
forall a. Num a => a -> a -> a
- E
msz) E
l E
u RangeSet a
lt' RangeSet a
rt #)

{-# INLINE maxDelete #-}
maxDelete :: Size -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, RangeSet a #)
maxDelete :: E -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, RangeSet a #)
maxDelete !E
sz !E
l !E
u !RangeSet a
lt !RangeSet a
rt = let (# !E
ml, !E
mu, !E
_, RangeSet a
t' #) = E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
forall a.
E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go E
sz E
l E
u RangeSet a
lt RangeSet a
rt in (# E
ml, E
mu, RangeSet a
t' #)
  where
    go :: Size -> E -> E -> RangeSet a -> RangeSet a -> (# E, E, Size, RangeSet a #)
    go :: E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go !E
sz !E
l !E
u !RangeSet a
lt RangeSet a
Tip = (# E
l, E
u, E
sz E -> E -> E
forall a. Num a => a -> a -> a
- RangeSet a -> E
forall a. RangeSet a -> E
size RangeSet a
lt, RangeSet a
lt #)
    go E
sz E
l E
u RangeSet a
lt (Fork E
_ E
rsz E
rl E
ru RangeSet a
rlt RangeSet a
rrt) =
      let (# !E
ml, !E
mu, !E
msz, RangeSet a
rt' #) = E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
forall a.
E
-> E -> E -> RangeSet a -> RangeSet a -> (# E, E, E, RangeSet a #)
go E
rsz E
rl E
ru RangeSet a
rlt RangeSet a
rrt
      in (# E
ml, E
mu, E
msz, E -> E -> E -> RangeSet a -> RangeSet a -> RangeSet a
forall a. E -> E -> E -> RangeSet a -> RangeSet a -> RangeSet a
balanceL (E
sz E -> E -> E
forall a. Num a => a -> a -> a
- E
msz) E
l E
u RangeSet a
lt RangeSet a
rt' #)