{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE DeriveDataTypeable, LambdaCase #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE RoleAnnotations #-}
module Data.IntegerInterval.Internal
( IntegerInterval
, lowerBound
, upperBound
, (<=..<=)
, empty
) where
import Control.DeepSeq
import Data.Data
import Data.ExtendedReal
import Data.Hashable
infix 5 <=..<=
data IntegerInterval
= Whole
| Empty
| Point !Integer
| LessOrEqual !Integer
| GreaterOrEqual !Integer
| BothClosed !Integer !Integer
deriving (IntegerInterval -> IntegerInterval -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IntegerInterval -> IntegerInterval -> Bool
$c/= :: IntegerInterval -> IntegerInterval -> Bool
== :: IntegerInterval -> IntegerInterval -> Bool
$c== :: IntegerInterval -> IntegerInterval -> Bool
Eq, Typeable)
lowerBound :: IntegerInterval -> Extended Integer
lowerBound :: IntegerInterval -> Extended Integer
lowerBound = \case
IntegerInterval
Whole -> forall r. Extended r
NegInf
IntegerInterval
Empty -> forall r. Extended r
PosInf
Point Integer
r -> forall r. r -> Extended r
Finite Integer
r
LessOrEqual Integer
_ -> forall r. Extended r
NegInf
GreaterOrEqual Integer
r -> forall r. r -> Extended r
Finite Integer
r
BothClosed Integer
p Integer
_ -> forall r. r -> Extended r
Finite Integer
p
upperBound :: IntegerInterval -> Extended Integer
upperBound :: IntegerInterval -> Extended Integer
upperBound = \case
IntegerInterval
Whole -> forall r. Extended r
PosInf
IntegerInterval
Empty -> forall r. Extended r
NegInf
Point Integer
r -> forall r. r -> Extended r
Finite Integer
r
LessOrEqual Integer
r -> forall r. r -> Extended r
Finite Integer
r
GreaterOrEqual Integer
_ -> forall r. Extended r
PosInf
BothClosed Integer
_ Integer
p -> forall r. r -> Extended r
Finite Integer
p
instance Data IntegerInterval where
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IntegerInterval -> c IntegerInterval
gfoldl forall d b. Data d => c (d -> b) -> d -> c b
k forall g. g -> c g
z IntegerInterval
x = forall g. g -> c g
z Extended Integer -> Extended Integer -> IntegerInterval
(<=..<=) forall d b. Data d => c (d -> b) -> d -> c b
`k` IntegerInterval -> Extended Integer
lowerBound IntegerInterval
x forall d b. Data d => c (d -> b) -> d -> c b
`k` IntegerInterval -> Extended Integer
upperBound IntegerInterval
x
toConstr :: IntegerInterval -> Constr
toConstr IntegerInterval
_ = Constr
intervalConstr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c IntegerInterval
gunfold forall b r. Data b => c (b -> r) -> c r
k forall r. r -> c r
z Constr
c = case Constr -> Int
constrIndex Constr
c of
Int
1 -> forall b r. Data b => c (b -> r) -> c r
k (forall b r. Data b => c (b -> r) -> c r
k (forall r. r -> c r
z Extended Integer -> Extended Integer -> IntegerInterval
(<=..<=)))
Int
_ -> forall a. HasCallStack => [Char] -> a
error [Char]
"gunfold"
dataTypeOf :: IntegerInterval -> DataType
dataTypeOf IntegerInterval
_ = DataType
intervalDataType
intervalConstr :: Constr
intervalConstr :: Constr
intervalConstr = DataType -> [Char] -> [[Char]] -> Fixity -> Constr
mkConstr DataType
intervalDataType [Char]
"<=..<=" [] Fixity
Infix
intervalDataType :: DataType
intervalDataType :: DataType
intervalDataType = [Char] -> [Constr] -> DataType
mkDataType [Char]
"Data.IntegerInterval.Internal.IntegerInterval" [Constr
intervalConstr]
instance NFData IntegerInterval where
rnf :: IntegerInterval -> ()
rnf = \case
IntegerInterval
Whole -> ()
IntegerInterval
Empty -> ()
Point Integer
r -> forall a. NFData a => a -> ()
rnf Integer
r
LessOrEqual Integer
r -> forall a. NFData a => a -> ()
rnf Integer
r
GreaterOrEqual Integer
r -> forall a. NFData a => a -> ()
rnf Integer
r
BothClosed Integer
p Integer
q -> forall a. NFData a => a -> ()
rnf Integer
p seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf Integer
q
instance Hashable IntegerInterval where
hashWithSalt :: Int -> IntegerInterval -> Int
hashWithSalt Int
s = \case
IntegerInterval
Whole -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
1 :: Int)
IntegerInterval
Empty -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
2 :: Int)
Point Integer
r -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
3 :: Int) forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Integer
r
LessOrEqual Integer
r -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
4 :: Int) forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Integer
r
GreaterOrEqual Integer
r -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
5 :: Int) forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Integer
r
BothClosed Integer
p Integer
q -> Int
s forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (Int
6 :: Int) forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Integer
p forall a. Hashable a => Int -> a -> Int
`hashWithSalt` Integer
q
(<=..<=)
:: Extended Integer
-> Extended Integer
-> IntegerInterval
<=..<= :: Extended Integer -> Extended Integer -> IntegerInterval
(<=..<=) Extended Integer
PosInf Extended Integer
_ = IntegerInterval
empty
(<=..<=) Extended Integer
_ Extended Integer
NegInf = IntegerInterval
empty
(<=..<=) Extended Integer
NegInf Extended Integer
PosInf = IntegerInterval
Whole
(<=..<=) Extended Integer
NegInf (Finite Integer
ub) = Integer -> IntegerInterval
LessOrEqual Integer
ub
(<=..<=) (Finite Integer
lb) Extended Integer
PosInf = Integer -> IntegerInterval
GreaterOrEqual Integer
lb
(<=..<=) (Finite Integer
lb) (Finite Integer
ub) =
case forall a. Ord a => a -> a -> Ordering
compare Integer
lb Integer
ub of
Ordering
EQ -> Integer -> IntegerInterval
Point Integer
lb
Ordering
LT -> Integer -> Integer -> IntegerInterval
BothClosed Integer
lb Integer
ub
Ordering
GT -> IntegerInterval
Empty
{-# INLINE (<=..<=) #-}
empty :: IntegerInterval
empty :: IntegerInterval
empty = IntegerInterval
Empty