{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE CPP, DeriveDataTypeable #-}
{-# LANGUAGE Safe #-}
#if __GLASGOW_HASKELL__ >= 708
{-# LANGUAGE RoleAnnotations #-}
#endif
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 = Interval !(Extended Integer) !(Extended Integer)
deriving (Eq, Typeable)
lowerBound :: IntegerInterval -> Extended Integer
lowerBound (Interval lb _) = lb
upperBound :: IntegerInterval -> Extended Integer
upperBound (Interval _ ub) = ub
instance Data IntegerInterval where
gfoldl k z x = z (<=..<=) `k` lowerBound x `k` upperBound x
toConstr _ = intervalConstr
gunfold k z c = case constrIndex c of
1 -> k (k (z (<=..<=)))
_ -> error "gunfold"
dataTypeOf _ = intervalDataType
intervalConstr :: Constr
intervalConstr = mkConstr intervalDataType "<=..<=" [] Infix
intervalDataType :: DataType
intervalDataType = mkDataType "Data.IntegerInterval.Internal.IntegerInterval" [intervalConstr]
instance NFData IntegerInterval where
rnf (Interval lb ub) = rnf lb `seq` rnf ub
instance Hashable IntegerInterval where
hashWithSalt s (Interval lb ub) = s `hashWithSalt` lb `hashWithSalt` ub
(<=..<=)
:: Extended Integer
-> Extended Integer
-> IntegerInterval
(<=..<=) PosInf _ = empty
(<=..<=) _ NegInf = empty
(<=..<=) lb ub
| lb <= ub = Interval lb ub
| otherwise = empty
empty :: IntegerInterval
empty = Interval PosInf NegInf