module PostgreSQL.Binary.Range where

import PostgreSQL.Binary.Prelude

data Range a = Empty | Range !(Bound a) !(Bound a)
  deriving (Range a -> Range a -> Bool
(Range a -> Range a -> Bool)
-> (Range a -> Range a -> Bool) -> Eq (Range a)
forall a. Eq a => Range a -> Range a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Range a -> Range a -> Bool
== :: Range a -> Range a -> Bool
$c/= :: forall a. Eq a => Range a -> Range a -> Bool
/= :: Range a -> Range a -> Bool
Eq, Int -> Range a -> ShowS
[Range a] -> ShowS
Range a -> String
(Int -> Range a -> ShowS)
-> (Range a -> String) -> ([Range a] -> ShowS) -> Show (Range a)
forall a. Show a => Int -> Range a -> ShowS
forall a. Show a => [Range a] -> ShowS
forall a. Show a => Range a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Range a -> ShowS
showsPrec :: Int -> Range a -> ShowS
$cshow :: forall a. Show a => Range a -> String
show :: Range a -> String
$cshowList :: forall a. Show a => [Range a] -> ShowS
showList :: [Range a] -> ShowS
Show, Eq (Range a)
Eq (Range a) =>
(Range a -> Range a -> Ordering)
-> (Range a -> Range a -> Bool)
-> (Range a -> Range a -> Bool)
-> (Range a -> Range a -> Bool)
-> (Range a -> Range a -> Bool)
-> (Range a -> Range a -> Range a)
-> (Range a -> Range a -> Range a)
-> Ord (Range a)
Range a -> Range a -> Bool
Range a -> Range a -> Ordering
Range a -> Range a -> Range a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Range a)
forall a. Ord a => Range a -> Range a -> Bool
forall a. Ord a => Range a -> Range a -> Ordering
forall a. Ord a => Range a -> Range a -> Range a
$ccompare :: forall a. Ord a => Range a -> Range a -> Ordering
compare :: Range a -> Range a -> Ordering
$c< :: forall a. Ord a => Range a -> Range a -> Bool
< :: Range a -> Range a -> Bool
$c<= :: forall a. Ord a => Range a -> Range a -> Bool
<= :: Range a -> Range a -> Bool
$c> :: forall a. Ord a => Range a -> Range a -> Bool
> :: Range a -> Range a -> Bool
$c>= :: forall a. Ord a => Range a -> Range a -> Bool
>= :: Range a -> Range a -> Bool
$cmax :: forall a. Ord a => Range a -> Range a -> Range a
max :: Range a -> Range a -> Range a
$cmin :: forall a. Ord a => Range a -> Range a -> Range a
min :: Range a -> Range a -> Range a
Ord, (forall x. Range a -> Rep (Range a) x)
-> (forall x. Rep (Range a) x -> Range a) -> Generic (Range a)
forall x. Rep (Range a) x -> Range a
forall x. Range a -> Rep (Range a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Range a) x -> Range a
forall a x. Range a -> Rep (Range a) x
$cfrom :: forall a x. Range a -> Rep (Range a) x
from :: forall x. Range a -> Rep (Range a) x
$cto :: forall a x. Rep (Range a) x -> Range a
to :: forall x. Rep (Range a) x -> Range a
Generic)

data Bound a = Incl !a | Excl !a | Inf
  deriving (Bound a -> Bound a -> Bool
(Bound a -> Bound a -> Bool)
-> (Bound a -> Bound a -> Bool) -> Eq (Bound a)
forall a. Eq a => Bound a -> Bound a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Bound a -> Bound a -> Bool
== :: Bound a -> Bound a -> Bool
$c/= :: forall a. Eq a => Bound a -> Bound a -> Bool
/= :: Bound a -> Bound a -> Bool
Eq, Int -> Bound a -> ShowS
[Bound a] -> ShowS
Bound a -> String
(Int -> Bound a -> ShowS)
-> (Bound a -> String) -> ([Bound a] -> ShowS) -> Show (Bound a)
forall a. Show a => Int -> Bound a -> ShowS
forall a. Show a => [Bound a] -> ShowS
forall a. Show a => Bound a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Bound a -> ShowS
showsPrec :: Int -> Bound a -> ShowS
$cshow :: forall a. Show a => Bound a -> String
show :: Bound a -> String
$cshowList :: forall a. Show a => [Bound a] -> ShowS
showList :: [Bound a] -> ShowS
Show, Eq (Bound a)
Eq (Bound a) =>
(Bound a -> Bound a -> Ordering)
-> (Bound a -> Bound a -> Bool)
-> (Bound a -> Bound a -> Bool)
-> (Bound a -> Bound a -> Bool)
-> (Bound a -> Bound a -> Bool)
-> (Bound a -> Bound a -> Bound a)
-> (Bound a -> Bound a -> Bound a)
-> Ord (Bound a)
Bound a -> Bound a -> Bool
Bound a -> Bound a -> Ordering
Bound a -> Bound a -> Bound a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Bound a)
forall a. Ord a => Bound a -> Bound a -> Bool
forall a. Ord a => Bound a -> Bound a -> Ordering
forall a. Ord a => Bound a -> Bound a -> Bound a
$ccompare :: forall a. Ord a => Bound a -> Bound a -> Ordering
compare :: Bound a -> Bound a -> Ordering
$c< :: forall a. Ord a => Bound a -> Bound a -> Bool
< :: Bound a -> Bound a -> Bool
$c<= :: forall a. Ord a => Bound a -> Bound a -> Bool
<= :: Bound a -> Bound a -> Bool
$c> :: forall a. Ord a => Bound a -> Bound a -> Bool
> :: Bound a -> Bound a -> Bool
$c>= :: forall a. Ord a => Bound a -> Bound a -> Bool
>= :: Bound a -> Bound a -> Bool
$cmax :: forall a. Ord a => Bound a -> Bound a -> Bound a
max :: Bound a -> Bound a -> Bound a
$cmin :: forall a. Ord a => Bound a -> Bound a -> Bound a
min :: Bound a -> Bound a -> Bound a
Ord, (forall x. Bound a -> Rep (Bound a) x)
-> (forall x. Rep (Bound a) x -> Bound a) -> Generic (Bound a)
forall x. Rep (Bound a) x -> Bound a
forall x. Bound a -> Rep (Bound a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Bound a) x -> Bound a
forall a x. Bound a -> Rep (Bound a) x
$cfrom :: forall a x. Bound a -> Rep (Bound a) x
from :: forall x. Bound a -> Rep (Bound a) x
$cto :: forall a x. Rep (Bound a) x -> Bound a
to :: forall x. Rep (Bound a) x -> Bound a
Generic)

type Multirange a = [Range a]