packages feed

rangeset-0.1.0.0: src/ghc/Data/RangeSet/Internal/Extractors.hs

{-# 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 !l !u Tip               = (# l, u #)
minRange _  _  (Fork _ l u lt _) = minRange l u lt

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

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

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