{-# LANGUAGE DeriveFunctor #-}
{-# OPTIONS_HADDOCK not-home #-}

module Database.LSMTree.Internal.Range (
    Range (..)
  ) where

import           Control.DeepSeq (NFData (..))

{-------------------------------------------------------------------------------
  Small auxiliary types
-------------------------------------------------------------------------------}

-- | A range of keys.
data Range k =
    -- | Inclusive lower bound, exclusive upper bound
    FromToExcluding k k
    -- | Inclusive lower bound, inclusive upper bound
  | FromToIncluding k k
  deriving stock (Int -> Range k -> ShowS
[Range k] -> ShowS
Range k -> String
(Int -> Range k -> ShowS)
-> (Range k -> String) -> ([Range k] -> ShowS) -> Show (Range k)
forall k. Show k => Int -> Range k -> ShowS
forall k. Show k => [Range k] -> ShowS
forall k. Show k => Range k -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall k. Show k => Int -> Range k -> ShowS
showsPrec :: Int -> Range k -> ShowS
$cshow :: forall k. Show k => Range k -> String
show :: Range k -> String
$cshowList :: forall k. Show k => [Range k] -> ShowS
showList :: [Range k] -> ShowS
Show, Range k -> Range k -> Bool
(Range k -> Range k -> Bool)
-> (Range k -> Range k -> Bool) -> Eq (Range k)
forall k. Eq k => Range k -> Range k -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall k. Eq k => Range k -> Range k -> Bool
== :: Range k -> Range k -> Bool
$c/= :: forall k. Eq k => Range k -> Range k -> Bool
/= :: Range k -> Range k -> Bool
Eq, (forall a b. (a -> b) -> Range a -> Range b)
-> (forall a b. a -> Range b -> Range a) -> Functor Range
forall a b. a -> Range b -> Range a
forall a b. (a -> b) -> Range a -> Range b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Range a -> Range b
fmap :: forall a b. (a -> b) -> Range a -> Range b
$c<$ :: forall a b. a -> Range b -> Range a
<$ :: forall a b. a -> Range b -> Range a
Functor)

instance NFData k => NFData (Range k) where
  rnf :: Range k -> ()
rnf (FromToExcluding k
k1 k
k2) = k -> ()
forall a. NFData a => a -> ()
rnf k
k1 () -> () -> ()
forall a b. a -> b -> b
`seq` k -> ()
forall a. NFData a => a -> ()
rnf k
k2
  rnf (FromToIncluding k
k1 k
k2) = k -> ()
forall a. NFData a => a -> ()
rnf k
k1 () -> () -> ()
forall a b. a -> b -> b
`seq` k -> ()
forall a. NFData a => a -> ()
rnf k
k2