packages feed

Range-0.1.0.0: Data/Range.hs

module Data.Range (
      Range
    , empty
    , singleton
    , range
    , bounds
    , contains
    , extendTo
    , intersect
    , union
    ) where


data Range a = Empty | Bounds a a
    deriving (Eq, Ord)


empty :: Range a
empty = Empty


singleton :: a -> Range a
singleton x = Bounds x x


range :: (Ord a) => a -> a -> Range a
range l u = if l <= u
    then Bounds l u
    else Empty


bounds :: Range a -> Maybe (a, a)
bounds Empty = Nothing
bounds (Bounds l u) = Just (l, u)


contains :: (Ord a) => Range a -> a -> Bool
contains Empty _ = False
contains (Bounds l u) x = l <= x && x <= u


extendTo :: (Ord a) => Range a -> a -> Range a
extendTo Empty x = singleton x
extendTo (Bounds l u) x
    | x < l = Bounds x u
    | x > u = Bounds l x
    | otherwise = Bounds l u


intersect :: (Ord a) => Range a -> Range a -> Range a
intersect Empty _ = Empty
intersect _ Empty = Empty
intersect (Bounds l1 u1) (Bounds l2 u2) = range l u
    where
        l = max l1 l2
        u = min u1 u2


union :: (Ord a) => Range a -> Range a -> Maybe (Range a)
union Empty range = Just range
union range Empty = Just range
union b1@(Bounds l1 u1) b2@(Bounds l2 u2) = case intersect b1 b2 of
    Empty -> Nothing
    Bounds{} -> Just $ Bounds l u
    where
        l = min l1 l2
        u = max u1 u2