{-# 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 :: forall a. E -> E -> RangeSet a -> (# E, E #)
minRange !E
l !E
u RangeSet a
Tip               = (# E
l, E
u #)
minRange E
_  E
_  (Fork H
_ E
l E
u RangeSet a
lt RangeSet a
_) = 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 :: forall a. E -> E -> RangeSet a -> (# E, E #)
maxRange !E
l !E
u RangeSet a
Tip               = (# E
l, E
u #)
maxRange E
_  E
_  (Fork H
_ E
l E
u RangeSet a
_ RangeSet a
rt) = forall a. E -> E -> RangeSet a -> (# E, E #)
maxRange E
l E
u RangeSet a
rt

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

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