packages feed

rangeset-0.1.0.0: src/ghc/Data/RangeSet/Primitives.hs

{-# LANGUAGE BangPatterns, Safe #-}
module Data.RangeSet.Primitives (empty, member, insert, delete, fold) where

import Prelude
import Data.RangeSet.Internal

{-|
The empty `RangeSet`.

@since 0.0.1.0
-}
{-# INLINE empty #-}
empty :: RangeSet a
empty = Tip

{-|
Test whether or not a given value is found within the set.

@since 0.0.1.0
-}
{-# INLINEABLE member #-}
member :: Enum a => a -> RangeSet a -> Bool
member !x = go
  where
    !x' = fromEnum x
    go :: RangeSet a -> Bool
    go (Fork _ l u lt rt)
      | l <= x'   = x' <= u || go rt
      | otherwise = go lt
    go Tip = False

{-|
Insert a new element into the set.

@since 0.0.1.0
-}
{-# INLINEABLE insert #-}
insert :: Enum a => a -> RangeSet a -> RangeSet a
insert = insertE . fromEnum

{-|
Remove an element from the set, if it appears.

@since 0.0.1.0
-}
{-# INLINEABLE delete #-}
delete :: Enum a => a -> RangeSet a -> RangeSet a
delete = deleteE . fromEnum

{-|
Folds a range set.

@since 0.0.1.0
-}
{-# INLINEABLE fold #-}
fold :: Enum a
     => (a -> a -> b -> b -> b) -- ^ Function that combines the lower and upper values (inclusive) for a range with the folded left- and right-subtrees.
     -> b                       -- ^ Value to be substituted at the leaves.
     -> RangeSet a
     -> b
fold fork = foldE (\l u -> fork (toEnum l) (toEnum u))