packages feed

radix-tree-1.0.0.0: src/Radix/Word/Common.hs

{-# LANGUAGE PatternSynonyms #-}

module Radix.Word.Common
  ( Range (Range, ..)
  ) where

import           Radix.Word.Foundation



-- | A closed interval between two keys.
data Range = -- | Invariant: \(k_L \le k_R\).
             UnsafeRange
               {-# UNPACK #-} !Key -- ^ \(k_L\)
               {-# UNPACK #-} !Key -- ^ \(k_R\)

instance Show Range where
  showsPrec d (UnsafeRange kL kR) =
    showParen (d > 10) $
      showString "Range " . shows kL
           . showChar ' ' . shows kR

{-# COMPLETE Range #-}
-- | Reorders endpoints to fit mathematical notation:
--   \([12, 3]\) will be converted to \([3, 12]\).
--
--   Pattern matching guarantees \(k_1 \le k_2\).
pattern Range
  :: Word  -- ^ \(k_1\)
  -> Word  -- ^ \(k_2\)
  -> Range
pattern Range kL kR <- UnsafeRange kL kR
  where
    Range k1 k2
      | k1 <= k2  = UnsafeRange k1 k2
      | otherwise = UnsafeRange k2 k1