-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Interval Arithmetic
--   
--   A <a>Numeric.Interval.Interval</a> is a closed, convex set of floating
--   point values.
--   
--   We do not control the rounding mode of the end points of the interval
--   when using floating point arithmetic, so be aware that in order to get
--   precise containment of the result, you will need to use an underlying
--   type with both lower and upper bounds like <a>CReal</a>
@package intervals
@version 0.9.3

module Numeric.Interval.Exception
data EmptyInterval
EmptyInterval :: EmptyInterval
data AmbiguousComparison
AmbiguousComparison :: AmbiguousComparison
instance GHC.Internal.Data.Data.Data Numeric.Interval.Exception.AmbiguousComparison
instance GHC.Internal.Data.Data.Data Numeric.Interval.Exception.EmptyInterval
instance GHC.Classes.Eq Numeric.Interval.Exception.AmbiguousComparison
instance GHC.Classes.Eq Numeric.Interval.Exception.EmptyInterval
instance GHC.Internal.Exception.Type.Exception Numeric.Interval.Exception.AmbiguousComparison
instance GHC.Internal.Exception.Type.Exception Numeric.Interval.Exception.EmptyInterval
instance GHC.Classes.Ord Numeric.Interval.Exception.AmbiguousComparison
instance GHC.Classes.Ord Numeric.Interval.Exception.EmptyInterval
instance GHC.Internal.Show.Show Numeric.Interval.Exception.AmbiguousComparison
instance GHC.Internal.Show.Show Numeric.Interval.Exception.EmptyInterval


-- | Interval arithmetic
module Numeric.Interval.Internal
data Interval a
I :: !a -> !a -> Interval a
Empty :: Interval a
(...) :: Ord a => a -> a -> Interval a
infix 3 ...
(+/-) :: (Num a, Ord a) => a -> a -> Interval a
infixl 6 +/-
interval :: Ord a => a -> a -> Maybe (Interval a)

-- | The whole real number line
--   
--   <pre>
--   &gt;&gt;&gt; whole
--   -Infinity ... Infinity
--   </pre>
whole :: Fractional a => Interval a

-- | An empty interval
--   
--   <pre>
--   &gt;&gt;&gt; empty
--   Empty
--   </pre>
empty :: Interval a

-- | Check if an interval is empty
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 5)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 1)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null empty
--   True
--   </pre>
null :: Interval a -> Bool

-- | A singleton point
--   
--   <pre>
--   &gt;&gt;&gt; singleton 1
--   1 ... 1
--   </pre>
singleton :: a -> Interval a

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; member 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 empty
--   False
--   </pre>
member :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notMember 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notMember 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notMember 5 empty
--   True
--   </pre>
notMember :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; elem 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 empty
--   False
--   </pre>

-- | <i>Deprecated: Use <a>member</a> instead.</i>
elem :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notElem 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notElem 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notElem 5 empty
--   True
--   </pre>

-- | <i>Deprecated: Use <a>notMember</a> instead.</i>
notElem :: Ord a => a -> Interval a -> Bool

-- | The infimum (lower bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; inf (1.0 ... 20.0)
--   1.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inf empty
--   *** Exception: empty interval
--   </pre>
inf :: Interval a -> a

-- | The supremum (upper bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; sup (1.0 ... 20.0)
--   20.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; sup empty
--   *** Exception: empty interval
--   </pre>
sup :: Interval a -> a

-- | Is the interval a singleton point? N.B. This is fairly fragile and
--   likely will not hold after even a few operations that only involve
--   singletons
--   
--   <pre>
--   &gt;&gt;&gt; singular (singleton 1)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; singular (1.0 ... 20.0)
--   False
--   </pre>
singular :: Ord a => Interval a -> Bool

-- | Calculate the width of an interval.
--   
--   <pre>
--   &gt;&gt;&gt; width (1 ... 20)
--   19
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width (singleton 1)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width empty
--   0
--   </pre>
width :: Num a => Interval a -> a

-- | Nearest point to the midpoint of the interval.
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (10.0 ... 20.0)
--   15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (singleton 5.0)
--   5.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint empty
--   *** Exception: empty interval
--   </pre>
midpoint :: Fractional a => Interval a -> a

-- | Calculate the intersection of two intervals.
--   
--   <pre>
--   &gt;&gt;&gt; intersection (1 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   5.0 ... 10.0
--   </pre>
intersection :: Ord a => Interval a -> Interval a -> Interval a

-- | Calculate the convex hull of two intervals
--   
--   <pre>
--   &gt;&gt;&gt; hull (0 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   0.0 ... 15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (15 ... 85 :: Interval Double) (0 ... 10 :: Interval Double)
--   0.0 ... 85.0
--   </pre>
hull :: Ord a => Interval a -> Interval a -> Interval a

-- | Bisect an interval at its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; bisect (10.0 ... 20.0)
--   (10.0 ... 15.0,15.0 ... 20.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect (singleton 5.0)
--   (5.0 ... 5.0,5.0 ... 5.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect Empty
--   (Empty,Empty)
--   </pre>
bisect :: Fractional a => Interval a -> (Interval a, Interval a)
bisectIntegral :: Integral a => Interval a -> (Interval a, Interval a)

-- | Magnitude
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (-20 ... 10)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (singleton 5)
--   5
--   </pre>
--   
--   throws <a>EmptyInterval</a> if the interval is empty.
--   
--   <pre>
--   &gt;&gt;&gt; magnitude empty
--   *** Exception: empty interval
--   </pre>
magnitude :: (Num a, Ord a) => Interval a -> a

-- | "mignitude"
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (-20 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (singleton 5)
--   5
--   </pre>
--   
--   throws <a>EmptyInterval</a> if the interval is empty.
--   
--   <pre>
--   &gt;&gt;&gt; mignitude empty
--   *** Exception: empty interval
--   </pre>
mignitude :: (Num a, Ord a) => Interval a -> a

-- | Hausdorff distance between intervals.
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (6 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (15 ... 24)
--   8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (-10 ... -2)
--   3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance Empty (1 ... 1)
--   *** Exception: empty interval
--   </pre>
distance :: (Num a, Ord a) => Interval a -> Interval a -> a

-- | Inflate an interval by enlarging it at both ends.
--   
--   <pre>
--   &gt;&gt;&gt; inflate 3 (-1 ... 7)
--   -4 ... 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate (-2) (0 ... 4)
--   -2 ... 6
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate 1 empty
--   Empty
--   </pre>
inflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Deflate an interval by shrinking it from both ends.
--   
--   <pre>
--   &gt;&gt;&gt; deflate 3.0 (-4.0 ... 10.0)
--   -1.0 ... 7.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 2.0 (-1.0 ... 1.0)
--   Empty
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 1.0 empty
--   Empty
--   </pre>
deflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Scale an interval about its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; scale 1.1 (-6.0 ... 4.0)
--   -6.5 ... 4.5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale (-2.0) (-1.0 ... 1.0)
--   Empty
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale 3.0 empty
--   Empty
--   </pre>
scale :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Construct a symmetric interval.
--   
--   <pre>
--   &gt;&gt;&gt; symmetric 3
--   -3 ... 3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; symmetric (-2)
--   -2 ... 2
--   </pre>
symmetric :: (Num a, Ord a) => a -> Interval a

-- | Check if interval <tt>X</tt> totally contains interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (25 ... 35 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (15 ... 35 :: Interval Double)
--   False
--   </pre>
contains :: Ord a => Interval a -> Interval a -> Bool

-- | Flipped version of <a>contains</a>. Check if interval <tt>X</tt> a
--   subset of interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (25 ... 35 :: Interval Double) `isSubsetOf` (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `isSubsetOf` (15 ... 35 :: Interval Double)
--   False
--   </pre>
isSubsetOf :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <tt>op</tt> y</tt>
certainly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (10 ... 30 :: Interval Double)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (10 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;=! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>==</a> y</tt>
--   
--   Only singleton intervals or empty intervals can return true
--   
--   <pre>
--   &gt;&gt;&gt; (singleton 5 :: Interval Double) ==! (singleton 5 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) ==! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(==!) :: Eq a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>/=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(/=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;=! (10 ... 20 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;! (10 ... 19 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>!) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <tt>op</tt> y</tt>?
possibly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;</a> y</tt>?
(<?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;=</a> y</tt>?
(<=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>==</a> y</tt>?
(==?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>/=</a> y</tt>?
(/=?) :: Eq a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;=</a> y</tt>?
(>=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;</a> y</tt>?
(>?) :: Ord a => Interval a -> Interval a -> Bool

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t idouble (1 ... 3)
--   idouble (1 ... 3) :: Interval Double
--   </pre>
idouble :: Interval Double -> Interval Double

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t ifloat (1 ... 3)
--   ifloat (1 ... 3) :: Interval Float
--   </pre>
ifloat :: Interval Float -> Interval Float

-- | an interval containing all x <a>quot</a> y &gt;&gt;&gt; (5 <a>quot</a>
--   3) <a>member</a> ((4...6) <a>iquot</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>iquot</a> ((-5)...4) *** Exception: divide by zero
iquot :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>rem</a> y &gt;&gt;&gt; (5 <a>rem</a>
--   3) <a>member</a> ((4...6) <a>irem</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>irem</a> ((-5)...4) *** Exception: divide by zero
irem :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>div</a> y &gt;&gt;&gt; (5 <a>div</a>
--   3) <a>member</a> ((4...6) <a>idiv</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>idiv</a> ((-5)...4) *** Exception: divide by zero
idiv :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>mod</a> y &gt;&gt;&gt; (5 <a>mod</a>
--   3) <a>member</a> ((4...6) <a>imod</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>imod</a> ((-5)...4) *** Exception: divide by zero
imod :: Integral a => Interval a -> Interval a -> Interval a
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Numeric.Interval.Internal.Interval a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Numeric.Interval.Internal.Interval a)
instance (GHC.Internal.Float.RealFloat a, GHC.Classes.Ord a) => GHC.Internal.Float.Floating (Numeric.Interval.Internal.Interval a)
instance (GHC.Internal.Real.Fractional a, GHC.Classes.Ord a) => GHC.Internal.Real.Fractional (Numeric.Interval.Internal.Interval a)
instance GHC.Internal.Generics.Generic1 Numeric.Interval.Internal.Interval
instance GHC.Internal.Generics.Generic (Numeric.Interval.Internal.Interval a)
instance GHC.Classes.Ord a => GHC.Internal.Base.Monoid (Numeric.Interval.Internal.Interval a)
instance (GHC.Internal.Num.Num a, GHC.Classes.Ord a) => GHC.Internal.Num.Num (Numeric.Interval.Internal.Interval a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Numeric.Interval.Internal.Interval a)
instance GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (Numeric.Interval.Internal.Interval a)
instance GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (Numeric.Interval.Internal.Interval a)
instance GHC.Internal.Real.Real a => GHC.Internal.Real.Real (Numeric.Interval.Internal.Interval a)
instance GHC.Classes.Ord a => GHC.Internal.Base.Semigroup (Numeric.Interval.Internal.Interval a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Numeric.Interval.Internal.Interval a)


-- | Interval arithmetic
module Numeric.Interval
data Interval a
(...) :: Ord a => a -> a -> Interval a
infix 3 ...
(+/-) :: (Num a, Ord a) => a -> a -> Interval a
infixl 6 +/-
interval :: Ord a => a -> a -> Maybe (Interval a)

-- | The whole real number line
--   
--   <pre>
--   &gt;&gt;&gt; whole
--   -Infinity ... Infinity
--   </pre>
whole :: Fractional a => Interval a

-- | An empty interval
--   
--   <pre>
--   &gt;&gt;&gt; empty
--   Empty
--   </pre>
empty :: Interval a

-- | Check if an interval is empty
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 5)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 1)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null empty
--   True
--   </pre>
null :: Interval a -> Bool

-- | A singleton point
--   
--   <pre>
--   &gt;&gt;&gt; singleton 1
--   1 ... 1
--   </pre>
singleton :: a -> Interval a

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; member 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 empty
--   False
--   </pre>
member :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notMember 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notMember 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notMember 5 empty
--   True
--   </pre>
notMember :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; elem 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 empty
--   False
--   </pre>

-- | <i>Deprecated: Use <a>member</a> instead.</i>
elem :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notElem 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notElem 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notElem 5 empty
--   True
--   </pre>

-- | <i>Deprecated: Use <a>notMember</a> instead.</i>
notElem :: Ord a => a -> Interval a -> Bool

-- | The infimum (lower bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; inf (1.0 ... 20.0)
--   1.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inf empty
--   *** Exception: empty interval
--   </pre>
inf :: Interval a -> a

-- | The supremum (upper bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; sup (1.0 ... 20.0)
--   20.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; sup empty
--   *** Exception: empty interval
--   </pre>
sup :: Interval a -> a

-- | Is the interval a singleton point? N.B. This is fairly fragile and
--   likely will not hold after even a few operations that only involve
--   singletons
--   
--   <pre>
--   &gt;&gt;&gt; singular (singleton 1)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; singular (1.0 ... 20.0)
--   False
--   </pre>
singular :: Ord a => Interval a -> Bool

-- | Calculate the width of an interval.
--   
--   <pre>
--   &gt;&gt;&gt; width (1 ... 20)
--   19
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width (singleton 1)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width empty
--   0
--   </pre>
width :: Num a => Interval a -> a

-- | Nearest point to the midpoint of the interval.
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (10.0 ... 20.0)
--   15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (singleton 5.0)
--   5.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint empty
--   *** Exception: empty interval
--   </pre>
midpoint :: Fractional a => Interval a -> a

-- | Calculate the intersection of two intervals.
--   
--   <pre>
--   &gt;&gt;&gt; intersection (1 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   5.0 ... 10.0
--   </pre>
intersection :: Ord a => Interval a -> Interval a -> Interval a

-- | Calculate the convex hull of two intervals
--   
--   <pre>
--   &gt;&gt;&gt; hull (0 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   0.0 ... 15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (15 ... 85 :: Interval Double) (0 ... 10 :: Interval Double)
--   0.0 ... 85.0
--   </pre>
hull :: Ord a => Interval a -> Interval a -> Interval a

-- | Bisect an interval at its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; bisect (10.0 ... 20.0)
--   (10.0 ... 15.0,15.0 ... 20.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect (singleton 5.0)
--   (5.0 ... 5.0,5.0 ... 5.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect Empty
--   (Empty,Empty)
--   </pre>
bisect :: Fractional a => Interval a -> (Interval a, Interval a)
bisectIntegral :: Integral a => Interval a -> (Interval a, Interval a)

-- | Magnitude
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (-20 ... 10)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (singleton 5)
--   5
--   </pre>
--   
--   throws <a>EmptyInterval</a> if the interval is empty.
--   
--   <pre>
--   &gt;&gt;&gt; magnitude empty
--   *** Exception: empty interval
--   </pre>
magnitude :: (Num a, Ord a) => Interval a -> a

-- | "mignitude"
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (-20 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (singleton 5)
--   5
--   </pre>
--   
--   throws <a>EmptyInterval</a> if the interval is empty.
--   
--   <pre>
--   &gt;&gt;&gt; mignitude empty
--   *** Exception: empty interval
--   </pre>
mignitude :: (Num a, Ord a) => Interval a -> a

-- | Hausdorff distance between intervals.
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (6 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (15 ... 24)
--   8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (-10 ... -2)
--   3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance Empty (1 ... 1)
--   *** Exception: empty interval
--   </pre>
distance :: (Num a, Ord a) => Interval a -> Interval a -> a

-- | Inflate an interval by enlarging it at both ends.
--   
--   <pre>
--   &gt;&gt;&gt; inflate 3 (-1 ... 7)
--   -4 ... 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate (-2) (0 ... 4)
--   -2 ... 6
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate 1 empty
--   Empty
--   </pre>
inflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Deflate an interval by shrinking it from both ends.
--   
--   <pre>
--   &gt;&gt;&gt; deflate 3.0 (-4.0 ... 10.0)
--   -1.0 ... 7.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 2.0 (-1.0 ... 1.0)
--   Empty
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 1.0 empty
--   Empty
--   </pre>
deflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Scale an interval about its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; scale 1.1 (-6.0 ... 4.0)
--   -6.5 ... 4.5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale (-2.0) (-1.0 ... 1.0)
--   Empty
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale 3.0 empty
--   Empty
--   </pre>
scale :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Construct a symmetric interval.
--   
--   <pre>
--   &gt;&gt;&gt; symmetric 3
--   -3 ... 3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; symmetric (-2)
--   -2 ... 2
--   </pre>
symmetric :: (Num a, Ord a) => a -> Interval a

-- | Check if interval <tt>X</tt> totally contains interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (25 ... 35 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (15 ... 35 :: Interval Double)
--   False
--   </pre>
contains :: Ord a => Interval a -> Interval a -> Bool

-- | Flipped version of <a>contains</a>. Check if interval <tt>X</tt> a
--   subset of interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (25 ... 35 :: Interval Double) `isSubsetOf` (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `isSubsetOf` (15 ... 35 :: Interval Double)
--   False
--   </pre>
isSubsetOf :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <tt>op</tt> y</tt>
certainly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (10 ... 30 :: Interval Double)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (10 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;=! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>==</a> y</tt>
--   
--   Only singleton intervals or empty intervals can return true
--   
--   <pre>
--   &gt;&gt;&gt; (singleton 5 :: Interval Double) ==! (singleton 5 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) ==! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(==!) :: Eq a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>/=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(/=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;=! (10 ... 20 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;! (10 ... 19 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>!) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <tt>op</tt> y</tt>?
possibly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;</a> y</tt>?
(<?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;=</a> y</tt>?
(<=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>==</a> y</tt>?
(==?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>/=</a> y</tt>?
(/=?) :: Eq a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;=</a> y</tt>?
(>=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;</a> y</tt>?
(>?) :: Ord a => Interval a -> Interval a -> Bool

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t idouble (1 ... 3)
--   idouble (1 ... 3) :: Interval Double
--   </pre>
idouble :: Interval Double -> Interval Double

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t ifloat (1 ... 3)
--   ifloat (1 ... 3) :: Interval Float
--   </pre>
ifloat :: Interval Float -> Interval Float

-- | an interval containing all x <a>quot</a> y &gt;&gt;&gt; (5 <a>quot</a>
--   3) <a>member</a> ((4...6) <a>iquot</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>iquot</a> ((-5)...4) *** Exception: divide by zero
iquot :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>rem</a> y &gt;&gt;&gt; (5 <a>rem</a>
--   3) <a>member</a> ((4...6) <a>irem</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>irem</a> ((-5)...4) *** Exception: divide by zero
irem :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>div</a> y &gt;&gt;&gt; (5 <a>div</a>
--   3) <a>member</a> ((4...6) <a>idiv</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>idiv</a> ((-5)...4) *** Exception: divide by zero
idiv :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>mod</a> y &gt;&gt;&gt; (5 <a>mod</a>
--   3) <a>member</a> ((4...6) <a>imod</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>imod</a> ((-5)...4) *** Exception: divide by zero
imod :: Integral a => Interval a -> Interval a -> Interval a


-- | "Directed" Interval arithmetic
module Numeric.Interval.Kaucher
data Interval a
I :: !a -> !a -> Interval a

-- | Create a directed interval.
(...) :: a -> a -> Interval a
infix 3 ...

-- | Try to create a non-empty interval.
interval :: Ord a => a -> a -> Maybe (Interval a)

-- | The whole real number line
--   
--   <pre>
--   &gt;&gt;&gt; whole
--   -Infinity ... Infinity
--   </pre>
whole :: Fractional a => Interval a

-- | An empty interval
--   
--   <pre>
--   &gt;&gt;&gt; empty
--   NaN ... NaN
--   </pre>
empty :: Fractional a => Interval a

-- | negation handles NaN properly
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 5)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null (1 ... 1)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; null empty
--   True
--   </pre>
null :: Ord a => Interval a -> Bool

-- | A singleton point
--   
--   <pre>
--   &gt;&gt;&gt; singleton 1
--   1 ... 1
--   </pre>
singleton :: a -> Interval a

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; member 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 empty
--   False
--   </pre>
member :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notMember 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notMember 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notMember 5 empty
--   True
--   </pre>
notMember :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; elem 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 8 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 empty
--   False
--   </pre>

-- | <i>Deprecated: Use <a>member</a> instead.</i>
elem :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notElem 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notElem 1.4 (1.0 ... 5.0)
--   False
--   </pre>
--   
--   And of course, nothing is a member of the empty interval.
--   
--   <pre>
--   &gt;&gt;&gt; notElem 5 empty
--   True
--   </pre>

-- | <i>Deprecated: Use <a>notMember</a> instead.</i>
notElem :: Ord a => a -> Interval a -> Bool

-- | The infinumum (lower bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; inf (1 ... 20)
--   1
--   </pre>
inf :: Interval a -> a

-- | The supremum (upper bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; sup (1 ... 20)
--   20
--   </pre>
sup :: Interval a -> a

-- | Is the interval a singleton point? N.B. This is fairly fragile and
--   likely will not hold after even a few operations that only involve
--   singletons
--   
--   <pre>
--   &gt;&gt;&gt; singular (singleton 1)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; singular (1.0 ... 20.0)
--   False
--   </pre>
singular :: Ord a => Interval a -> Bool

-- | Calculate the width of an interval.
--   
--   <pre>
--   &gt;&gt;&gt; width (1 ... 20)
--   19
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width (singleton 1)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width empty
--   NaN
--   </pre>
width :: Num a => Interval a -> a

-- | Nearest point to the midpoint of the interval.
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (10.0 ... 20.0)
--   15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (singleton 5.0)
--   5.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint empty
--   NaN
--   </pre>
midpoint :: Fractional a => Interval a -> a

-- | Calculate the intersection of two intervals.
--   
--   <pre>
--   &gt;&gt;&gt; intersection (1 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   5.0 ... 10.0
--   </pre>
intersection :: (Fractional a, Ord a) => Interval a -> Interval a -> Interval a

-- | Calculate the convex hull of two intervals
--   
--   <pre>
--   &gt;&gt;&gt; hull (0 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   0.0 ... 15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (15 ... 85 :: Interval Double) (0 ... 10 :: Interval Double)
--   0.0 ... 85.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (10 ... 20 :: Interval Double) (15 ... 0 :: Interval Double)
--   10.0 ... 20.0
--   </pre>
hull :: Ord a => Interval a -> Interval a -> Interval a

-- | Bisect an interval at its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; bisect (10.0 ... 20.0)
--   (10.0 ... 15.0,15.0 ... 20.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect (singleton 5.0)
--   (5.0 ... 5.0,5.0 ... 5.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect empty
--   (NaN ... NaN,NaN ... NaN)
--   </pre>
bisect :: Fractional a => Interval a -> (Interval a, Interval a)

-- | Magnitude
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (-20 ... 10)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (singleton 5)
--   5
--   </pre>
magnitude :: (Num a, Ord a) => Interval a -> a

-- | "mignitude"
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (-20 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (singleton 5)
--   5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude empty
--   NaN
--   </pre>
mignitude :: (Num a, Ord a) => Interval a -> a

-- | Hausdorff distance between non-empty intervals.
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (6 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (15 ... 24)
--   8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (-10 ... -2)
--   3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance empty (1 ... 1)
--   NaN
--   </pre>
distance :: (Num a, Ord a) => Interval a -> Interval a -> a

-- | Inflate an interval by enlarging it at both ends.
--   
--   <pre>
--   &gt;&gt;&gt; inflate 3 (-1 ... 7)
--   -4 ... 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate (-2) (0 ... 4)
--   2 ... 2
--   </pre>
inflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Deflate an interval by shrinking it from both ends.
--   
--   <pre>
--   &gt;&gt;&gt; deflate 3.0 (-4.0 ... 10.0)
--   -1.0 ... 7.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 2.0 (-1.0 ... 1.0)
--   1.0 ... -1.0
--   </pre>
deflate :: Fractional a => a -> Interval a -> Interval a

-- | Scale an interval about its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; scale 1.1 (-6.0 ... 4.0)
--   -6.5 ... 4.5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale (-2.0) (-1.0 ... 1.0)
--   2.0 ... -2.0
--   </pre>
scale :: Fractional a => a -> Interval a -> Interval a

-- | Construct a symmetric interval.
--   
--   <pre>
--   &gt;&gt;&gt; symmetric 3
--   -3 ... 3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; symmetric (-2)
--   2 ... -2
--   </pre>
symmetric :: Num a => a -> Interval a

-- | Check if interval <tt>X</tt> totally contains interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (25 ... 35 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (15 ... 35 :: Interval Double)
--   False
--   </pre>
contains :: Ord a => Interval a -> Interval a -> Bool

-- | Flipped version of <a>contains</a>. Check if interval <tt>X</tt> a
--   subset of interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (25 ... 35 :: Interval Double) `isSubsetOf` (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `isSubsetOf` (15 ... 35 :: Interval Double)
--   False
--   </pre>
isSubsetOf :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <tt>op</tt> y</tt>
certainly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (10 ... 30 :: Interval Double)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (10 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;=! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>==</a> y</tt>
--   
--   Only singleton intervals return true
--   
--   <pre>
--   &gt;&gt;&gt; (singleton 5 :: Interval Double) ==! (singleton 5 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) ==! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(==!) :: Eq a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>/=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(/=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;=! (10 ... 20 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;! (10 ... 19 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>!) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <tt>op</tt> y</tt>?
possibly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;</a> y</tt>?
(<?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;=</a> y</tt>?
(<=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>==</a> y</tt>?
(==?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>/=</a> y</tt>?
(/=?) :: Eq a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;=</a> y</tt>?
(>=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;</a> y</tt>?
(>?) :: Ord a => Interval a -> Interval a -> Bool

-- | The nearest value to that supplied which is contained in the interval.
clamp :: Ord a => Interval a -> a -> a

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t idouble (1 ... 3)
--   idouble (1 ... 3) :: Interval Double
--   </pre>
idouble :: Interval Double -> Interval Double

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t ifloat (1 ... 3)
--   ifloat (1 ... 3) :: Interval Float
--   </pre>
ifloat :: Interval Float -> Interval Float

-- | an interval containing all x <a>quot</a> y &gt;&gt;&gt; (5 <a>quot</a>
--   3) <a>member</a> ((4...6) <a>iquot</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>iquot</a> ((-5)...4) *** Exception: divide by zero
iquot :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>rem</a> y &gt;&gt;&gt; (5 <a>rem</a>
--   3) <a>member</a> ((4...6) <a>irem</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>irem</a> ((-5)...4) *** Exception: divide by zero
irem :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>div</a> y &gt;&gt;&gt; (5 <a>div</a>
--   3) <a>member</a> ((4...6) <a>idiv</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>idiv</a> ((-5)...4) *** Exception: divide by zero
idiv :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>mod</a> y &gt;&gt;&gt; (5 <a>mod</a>
--   3) <a>member</a> ((4...6) <a>imod</a> (2...4)) True &gt;&gt;&gt;
--   (1...10) <a>imod</a> ((-5)...4) *** Exception: divide by zero
imod :: Integral a => Interval a -> Interval a -> Interval a
instance GHC.Internal.Base.Applicative Numeric.Interval.Kaucher.Interval
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Numeric.Interval.Kaucher.Interval a)
instance Data.Distributive.Distributive Numeric.Interval.Kaucher.Interval
instance GHC.Classes.Eq a => GHC.Classes.Eq (Numeric.Interval.Kaucher.Interval a)
instance (GHC.Internal.Float.RealFloat a, GHC.Classes.Ord a) => GHC.Internal.Float.Floating (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Data.Foldable.Foldable Numeric.Interval.Kaucher.Interval
instance (GHC.Internal.Real.Fractional a, GHC.Classes.Ord a) => GHC.Internal.Real.Fractional (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Base.Functor Numeric.Interval.Kaucher.Interval
instance GHC.Internal.Generics.Generic1 Numeric.Interval.Kaucher.Interval
instance GHC.Internal.Generics.Generic (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Base.Monad Numeric.Interval.Kaucher.Interval
instance (GHC.Internal.Num.Num a, GHC.Classes.Ord a) => GHC.Internal.Num.Num (Numeric.Interval.Kaucher.Interval a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Real.Real a => GHC.Internal.Real.Real (Numeric.Interval.Kaucher.Interval a)
instance GHC.Classes.Ord a => GHC.Internal.Base.Semigroup (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Numeric.Interval.Kaucher.Interval a)
instance GHC.Internal.Data.Traversable.Traversable Numeric.Interval.Kaucher.Interval


-- | Interval arithmetic
module Numeric.Interval.NonEmpty.Internal
data Interval a
I :: !a -> !a -> Interval a

-- | Create a non-empty interval, turning it around if necessary
(...) :: Ord a => a -> a -> Interval a
infix 3 ...

-- | Try to create a non-empty interval.
interval :: Ord a => a -> a -> Maybe (Interval a)

-- | The whole real number line
--   
--   <pre>
--   &gt;&gt;&gt; whole
--   -Infinity ... Infinity
--   </pre>
--   
--   <pre>
--   (x :: Double) `elem` whole
--   </pre>
whole :: Fractional a => Interval a

-- | A singleton point
--   
--   <pre>
--   &gt;&gt;&gt; singleton 1
--   1 ... 1
--   </pre>
--   
--   <pre>
--   x `elem` (singleton x)
--   </pre>
--   
--   <pre>
--   x /= y ==&gt; y `notElem` (singleton x)
--   </pre>
singleton :: a -> Interval a

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; member 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 8 (1.0 ... 5.0)
--   False
--   </pre>
member :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notMember 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notMember 1.4 (1.0 ... 5.0)
--   False
--   </pre>
notMember :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; elem 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 8 (1.0 ... 5.0)
--   False
--   </pre>

-- | <i>Deprecated: Use <a>member</a> instead.</i>
elem :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notElem 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notElem 1.4 (1.0 ... 5.0)
--   False
--   </pre>

-- | <i>Deprecated: Use <a>notMember</a> instead.</i>
notElem :: Ord a => a -> Interval a -> Bool

-- | The infinumum (lower bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; inf (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   min x y == inf (x ... y)
--   </pre>
--   
--   <pre>
--   inf x &lt;= sup x
--   </pre>
inf :: Interval a -> a

-- | The supremum (upper bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; sup (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   sup x `elem` x
--   </pre>
--   
--   <pre>
--   max x y == sup (x ... y)
--   </pre>
--   
--   <pre>
--   inf x &lt;= sup x
--   </pre>
sup :: Interval a -> a

-- | Is the interval a singleton point? N.B. This is fairly fragile and
--   likely will not hold after even a few operations that only involve
--   singletons
--   
--   <pre>
--   &gt;&gt;&gt; singular (singleton 1)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; singular (1.0 ... 20.0)
--   False
--   </pre>
singular :: Ord a => Interval a -> Bool

-- | Calculate the width of an interval.
--   
--   <pre>
--   &gt;&gt;&gt; width (1 ... 20)
--   19
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width (singleton 1)
--   0
--   </pre>
--   
--   <pre>
--   0 &lt;= width x
--   </pre>
width :: Num a => Interval a -> a

-- | Nearest point to the midpoint of the interval.
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (10.0 ... 20.0)
--   15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (singleton 5.0)
--   5.0
--   </pre>
--   
--   <pre>
--   midpoint x `elem` (x :: Interval Double)
--   </pre>
midpoint :: Fractional a => Interval a -> a

-- | Hausdorff distance between intervals.
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (6 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (15 ... 24)
--   8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (-10 ... -2)
--   3
--   </pre>
--   
--   <pre>
--   commutative (distance :: Interval Double -&gt; Interval Double -&gt; Double)
--   </pre>
--   
--   <pre>
--   0 &lt;= distance x y
--   </pre>
distance :: (Num a, Ord a) => Interval a -> Interval a -> a

-- | Calculate the intersection of two intervals.
--   
--   <pre>
--   &gt;&gt;&gt; intersection (1 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   Just (5.0 ... 10.0)
--   </pre>
intersection :: Ord a => Interval a -> Interval a -> Maybe (Interval a)

-- | Calculate the convex hull of two intervals
--   
--   <pre>
--   &gt;&gt;&gt; hull (0 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   0.0 ... 15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (15 ... 85 :: Interval Double) (0 ... 10 :: Interval Double)
--   0.0 ... 85.0
--   </pre>
--   
--   <pre>
--   conservative2 const hull
--   </pre>
--   
--   <pre>
--   conservative2 (flip const) hull
--   </pre>
hull :: Ord a => Interval a -> Interval a -> Interval a

-- | Bisect an interval at its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; bisect (10.0 ... 20.0)
--   (10.0 ... 15.0,15.0 ... 20.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect (singleton 5.0)
--   (5.0 ... 5.0,5.0 ... 5.0)
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in sup a == inf b
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in inf a == inf x
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in sup b == sup x
--   </pre>
bisect :: Fractional a => Interval a -> (Interval a, Interval a)
bisectIntegral :: Integral a => Interval a -> (Interval a, Interval a)

-- | Magnitude
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (-20 ... 10)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (singleton 5)
--   5
--   </pre>
--   
--   <pre>
--   0 &lt;= magnitude x
--   </pre>
magnitude :: (Num a, Ord a) => Interval a -> a

-- | "mignitude"
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (-20 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (singleton 5)
--   5
--   </pre>
--   
--   <pre>
--   0 &lt;= mignitude x
--   </pre>
mignitude :: (Num a, Ord a) => Interval a -> a

-- | Check if interval <tt>X</tt> totally contains interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (25 ... 35 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (15 ... 35 :: Interval Double)
--   False
--   </pre>
contains :: Ord a => Interval a -> Interval a -> Bool

-- | Flipped version of <a>contains</a>. Check if interval <tt>X</tt> a
--   subset of interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (25 ... 35 :: Interval Double) `isSubsetOf` (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `isSubsetOf` (15 ... 35 :: Interval Double)
--   False
--   </pre>
isSubsetOf :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <tt>op</tt> y</tt>
certainly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (10 ... 30 :: Interval Double)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (10 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;=! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>==</a> y</tt>
--   
--   Only singleton intervals or empty intervals can return true
--   
--   <pre>
--   &gt;&gt;&gt; (singleton 5 :: Interval Double) ==! (singleton 5 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) ==! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(==!) :: Eq a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>/=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(/=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;=! (10 ... 20 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;! (10 ... 19 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>!) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <tt>op</tt> y</tt>?
possibly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;</a> y</tt>?
(<?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;=</a> y</tt>?
(<=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>==</a> y</tt>?
(==?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>/=</a> y</tt>?
(/=?) :: Eq a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;=</a> y</tt>?
(>=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;</a> y</tt>?
(>?) :: Ord a => Interval a -> Interval a -> Bool

-- | The nearest value to that supplied which is contained in the interval.
--   
--   <pre>
--   (clamp xs y) `elem` xs
--   </pre>
clamp :: Ord a => Interval a -> a -> a

-- | Inflate an interval by enlarging it at both ends.
--   
--   <pre>
--   &gt;&gt;&gt; inflate 3 (-1 ... 7)
--   -4 ... 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate (-2) (0 ... 4)
--   -2 ... 6
--   </pre>
--   
--   <pre>
--   inflate x i `contains` i
--   </pre>
inflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Deflate an interval by shrinking it from both ends. Note that in cases
--   that would result in an empty interval, the result is a singleton
--   interval at the midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; deflate 3.0 (-4.0 ... 10.0)
--   -1.0 ... 7.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 2.0 (-1.0 ... 1.0)
--   0.0 ... 0.0
--   </pre>
deflate :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Scale an interval about its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; scale 1.1 (-6.0 ... 4.0)
--   -6.5 ... 4.5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale (-2.0) (-1.0 ... 1.0)
--   -2.0 ... 2.0
--   </pre>
--   
--   <ul>
--   <li>- The property test below is currently disabled (#66).</li>
--   <li>- prop&gt; abs x &gt;= 1 ==&gt; (scale (x :: Double) i)
--   <a>contains</a> i prop&gt; forAll (choose (0,1)) $ x -&gt; abs x <a>1
--   ==</a> i <a>contains</a> (scale (x :: Double) i)</li>
--   </ul>
scale :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Construct a symmetric interval.
--   
--   <pre>
--   &gt;&gt;&gt; symmetric 3
--   -3 ... 3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; symmetric (-2)
--   -2 ... 2
--   </pre>
--   
--   <pre>
--   x `elem` symmetric x
--   </pre>
--   
--   <pre>
--   0 `elem` symmetric x
--   </pre>
symmetric :: (Num a, Ord a) => a -> Interval a

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t idouble (1 ... 3)
--   idouble (1 ... 3) :: Interval Double
--   </pre>
idouble :: Interval Double -> Interval Double

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t ifloat (1 ... 3)
--   ifloat (1 ... 3) :: Interval Float
--   </pre>
ifloat :: Interval Float -> Interval Float

-- | an interval containing all x <a>quot</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>quot</a> y) <a>member</a> (xs <a>iquot</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>iquot</a> ys)); return $ z === Left DivideByZero
iquot :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>rem</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>rem</a> y) <a>member</a> (xs <a>irem</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>irem</a> ys)); return $ z === Left DivideByZero
irem :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>div</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>div</a> y) <a>member</a> (xs <a>idiv</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>idiv</a> ys)); return $ z === Left DivideByZero
idiv :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>mod</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>mod</a> y) <a>member</a> (xs <a>imod</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>imod</a> ys)); return $ z === Left DivideByZero
imod :: Integral a => Interval a -> Interval a -> Interval a
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Numeric.Interval.NonEmpty.Internal.Interval a)
instance (GHC.Internal.Float.RealFloat a, GHC.Classes.Ord a) => GHC.Internal.Float.Floating (Numeric.Interval.NonEmpty.Internal.Interval a)
instance (GHC.Internal.Real.Fractional a, GHC.Classes.Ord a) => GHC.Internal.Real.Fractional (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Internal.Generics.Generic1 Numeric.Interval.NonEmpty.Internal.Interval
instance GHC.Internal.Generics.Generic (Numeric.Interval.NonEmpty.Internal.Interval a)
instance (GHC.Internal.Num.Num a, GHC.Classes.Ord a) => GHC.Internal.Num.Num (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Internal.Real.Real a => GHC.Internal.Real.Real (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Classes.Ord a => GHC.Internal.Base.Semigroup (Numeric.Interval.NonEmpty.Internal.Interval a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Numeric.Interval.NonEmpty.Internal.Interval a)


-- | Interval arithmetic
module Numeric.Interval.NonEmpty
data Interval a

-- | Create a non-empty interval, turning it around if necessary
(...) :: Ord a => a -> a -> Interval a
infix 3 ...

-- | Try to create a non-empty interval.
interval :: Ord a => a -> a -> Maybe (Interval a)

-- | The whole real number line
--   
--   <pre>
--   &gt;&gt;&gt; whole
--   -Infinity ... Infinity
--   </pre>
--   
--   <pre>
--   (x :: Double) `elem` whole
--   </pre>
whole :: Fractional a => Interval a

-- | A singleton point
--   
--   <pre>
--   &gt;&gt;&gt; singleton 1
--   1 ... 1
--   </pre>
--   
--   <pre>
--   x `elem` (singleton x)
--   </pre>
--   
--   <pre>
--   x /= y ==&gt; y `notElem` (singleton x)
--   </pre>
singleton :: a -> Interval a

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; member 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; member 8 (1.0 ... 5.0)
--   False
--   </pre>
member :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notMember 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notMember 1.4 (1.0 ... 5.0)
--   False
--   </pre>
notMember :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is in the interval.
--   
--   <pre>
--   &gt;&gt;&gt; elem 3.2 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 5 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 1 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; elem 8 (1.0 ... 5.0)
--   False
--   </pre>

-- | <i>Deprecated: Use <a>member</a> instead.</i>
elem :: Ord a => a -> Interval a -> Bool

-- | Determine if a point is not included in the interval
--   
--   <pre>
--   &gt;&gt;&gt; notElem 8 (1.0 ... 5.0)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; notElem 1.4 (1.0 ... 5.0)
--   False
--   </pre>

-- | <i>Deprecated: Use <a>notMember</a> instead.</i>
notElem :: Ord a => a -> Interval a -> Bool

-- | The infinumum (lower bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; inf (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   min x y == inf (x ... y)
--   </pre>
--   
--   <pre>
--   inf x &lt;= sup x
--   </pre>
inf :: Interval a -> a

-- | The supremum (upper bound) of an interval
--   
--   <pre>
--   &gt;&gt;&gt; sup (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   sup x `elem` x
--   </pre>
--   
--   <pre>
--   max x y == sup (x ... y)
--   </pre>
--   
--   <pre>
--   inf x &lt;= sup x
--   </pre>
sup :: Interval a -> a

-- | Is the interval a singleton point? N.B. This is fairly fragile and
--   likely will not hold after even a few operations that only involve
--   singletons
--   
--   <pre>
--   &gt;&gt;&gt; singular (singleton 1)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; singular (1.0 ... 20.0)
--   False
--   </pre>
singular :: Ord a => Interval a -> Bool

-- | Calculate the width of an interval.
--   
--   <pre>
--   &gt;&gt;&gt; width (1 ... 20)
--   19
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; width (singleton 1)
--   0
--   </pre>
--   
--   <pre>
--   0 &lt;= width x
--   </pre>
width :: Num a => Interval a -> a

-- | Nearest point to the midpoint of the interval.
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (10.0 ... 20.0)
--   15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; midpoint (singleton 5.0)
--   5.0
--   </pre>
--   
--   <pre>
--   midpoint x `elem` (x :: Interval Double)
--   </pre>
midpoint :: Fractional a => Interval a -> a

-- | Hausdorff distance between intervals.
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (6 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (15 ... 24)
--   8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; distance (1 ... 7) (-10 ... -2)
--   3
--   </pre>
--   
--   <pre>
--   commutative (distance :: Interval Double -&gt; Interval Double -&gt; Double)
--   </pre>
--   
--   <pre>
--   0 &lt;= distance x y
--   </pre>
distance :: (Num a, Ord a) => Interval a -> Interval a -> a

-- | Calculate the intersection of two intervals.
--   
--   <pre>
--   &gt;&gt;&gt; intersection (1 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   Just (5.0 ... 10.0)
--   </pre>
intersection :: Ord a => Interval a -> Interval a -> Maybe (Interval a)

-- | Calculate the convex hull of two intervals
--   
--   <pre>
--   &gt;&gt;&gt; hull (0 ... 10 :: Interval Double) (5 ... 15 :: Interval Double)
--   0.0 ... 15.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; hull (15 ... 85 :: Interval Double) (0 ... 10 :: Interval Double)
--   0.0 ... 85.0
--   </pre>
--   
--   <pre>
--   conservative2 const hull
--   </pre>
--   
--   <pre>
--   conservative2 (flip const) hull
--   </pre>
hull :: Ord a => Interval a -> Interval a -> Interval a

-- | Bisect an interval at its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; bisect (10.0 ... 20.0)
--   (10.0 ... 15.0,15.0 ... 20.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; bisect (singleton 5.0)
--   (5.0 ... 5.0,5.0 ... 5.0)
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in sup a == inf b
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in inf a == inf x
--   </pre>
--   
--   <pre>
--   let (a, b) = bisect (x :: Interval Double) in sup b == sup x
--   </pre>
bisect :: Fractional a => Interval a -> (Interval a, Interval a)
bisectIntegral :: Integral a => Interval a -> (Interval a, Interval a)

-- | Magnitude
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (1 ... 20)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (-20 ... 10)
--   20
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; magnitude (singleton 5)
--   5
--   </pre>
--   
--   <pre>
--   0 &lt;= magnitude x
--   </pre>
magnitude :: (Num a, Ord a) => Interval a -> a

-- | "mignitude"
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (1 ... 20)
--   1
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (-20 ... 10)
--   0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; mignitude (singleton 5)
--   5
--   </pre>
--   
--   <pre>
--   0 &lt;= mignitude x
--   </pre>
mignitude :: (Num a, Ord a) => Interval a -> a

-- | Check if interval <tt>X</tt> totally contains interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (25 ... 35 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `contains` (15 ... 35 :: Interval Double)
--   False
--   </pre>
contains :: Ord a => Interval a -> Interval a -> Bool

-- | Flipped version of <a>contains</a>. Check if interval <tt>X</tt> a
--   subset of interval <tt>Y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (25 ... 35 :: Interval Double) `isSubsetOf` (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) `isSubsetOf` (15 ... 35 :: Interval Double)
--   False
--   </pre>
isSubsetOf :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <tt>op</tt> y</tt>
certainly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;! (10 ... 30 :: Interval Double)
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&lt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (20 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) &lt;=! (10 ... 30 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 30 :: Interval Double) &lt;=! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(<=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>==</a> y</tt>
--   
--   Only singleton intervals or empty intervals can return true
--   
--   <pre>
--   &gt;&gt;&gt; (singleton 5 :: Interval Double) ==! (singleton 5 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 10 :: Interval Double) ==! (5 ... 10 :: Interval Double)
--   False
--   </pre>
(==!) :: Eq a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>/=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (20 ... 40 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 15 :: Interval Double) /=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(/=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;=</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;=! (10 ... 20 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;=! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>=!) :: Ord a => Interval a -> Interval a -> Bool

-- | For all <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>. <tt>x
--   <a>&gt;</a> y</tt>
--   
--   <pre>
--   &gt;&gt;&gt; (20 ... 40 :: Interval Double) &gt;! (10 ... 19 :: Interval Double)
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; (5 ... 20 :: Interval Double) &gt;! (15 ... 40 :: Interval Double)
--   False
--   </pre>
(>!) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <tt>op</tt> y</tt>?
possibly :: Ord a => (forall b. Ord b => b -> b -> Bool) -> Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;</a> y</tt>?
(<?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&lt;=</a> y</tt>?
(<=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>==</a> y</tt>?
(==?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>/=</a> y</tt>?
(/=?) :: Eq a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;=</a> y</tt>?
(>=?) :: Ord a => Interval a -> Interval a -> Bool

-- | Does there exist an <tt>x</tt> in <tt>X</tt>, <tt>y</tt> in <tt>Y</tt>
--   such that <tt>x <a>&gt;</a> y</tt>?
(>?) :: Ord a => Interval a -> Interval a -> Bool

-- | The nearest value to that supplied which is contained in the interval.
--   
--   <pre>
--   (clamp xs y) `elem` xs
--   </pre>
clamp :: Ord a => Interval a -> a -> a

-- | Inflate an interval by enlarging it at both ends.
--   
--   <pre>
--   &gt;&gt;&gt; inflate 3 (-1 ... 7)
--   -4 ... 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; inflate (-2) (0 ... 4)
--   -2 ... 6
--   </pre>
--   
--   <pre>
--   inflate x i `contains` i
--   </pre>
inflate :: (Num a, Ord a) => a -> Interval a -> Interval a

-- | Deflate an interval by shrinking it from both ends. Note that in cases
--   that would result in an empty interval, the result is a singleton
--   interval at the midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; deflate 3.0 (-4.0 ... 10.0)
--   -1.0 ... 7.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; deflate 2.0 (-1.0 ... 1.0)
--   0.0 ... 0.0
--   </pre>
deflate :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Scale an interval about its midpoint.
--   
--   <pre>
--   &gt;&gt;&gt; scale 1.1 (-6.0 ... 4.0)
--   -6.5 ... 4.5
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; scale (-2.0) (-1.0 ... 1.0)
--   -2.0 ... 2.0
--   </pre>
--   
--   <ul>
--   <li>- The property test below is currently disabled (#66).</li>
--   <li>- prop&gt; abs x &gt;= 1 ==&gt; (scale (x :: Double) i)
--   <a>contains</a> i prop&gt; forAll (choose (0,1)) $ x -&gt; abs x <a>1
--   ==</a> i <a>contains</a> (scale (x :: Double) i)</li>
--   </ul>
scale :: (Fractional a, Ord a) => a -> Interval a -> Interval a

-- | Construct a symmetric interval.
--   
--   <pre>
--   &gt;&gt;&gt; symmetric 3
--   -3 ... 3
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; symmetric (-2)
--   -2 ... 2
--   </pre>
--   
--   <pre>
--   x `elem` symmetric x
--   </pre>
--   
--   <pre>
--   0 `elem` symmetric x
--   </pre>
symmetric :: (Num a, Ord a) => a -> Interval a

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t idouble (1 ... 3)
--   idouble (1 ... 3) :: Interval Double
--   </pre>
idouble :: Interval Double -> Interval Double

-- | id function. Useful for type specification
--   
--   <pre>
--   &gt;&gt;&gt; :t ifloat (1 ... 3)
--   ifloat (1 ... 3) :: Interval Float
--   </pre>
ifloat :: Interval Float -> Interval Float

-- | an interval containing all x <a>quot</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>quot</a> y) <a>member</a> (xs <a>iquot</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>iquot</a> ys)); return $ z === Left DivideByZero
iquot :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>rem</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>rem</a> y) <a>member</a> (xs <a>irem</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>irem</a> ys)); return $ z === Left DivideByZero
irem :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>div</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>div</a> y) <a>member</a> (xs <a>idiv</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>idiv</a> ys)); return $ z === Left DivideByZero
idiv :: Integral a => Interval a -> Interval a -> Interval a

-- | an interval containing all x <a>mod</a> y prop&gt; forAll (memberOf
--   xs) $ x -&gt; forAll (memberOf ys) $ y -&gt; 0 <a>notMember</a> ys
--   ==&gt; (x <a>mod</a> y) <a>member</a> (xs <a>imod</a> ys) prop&gt; 0
--   <a>member</a> ys ==&gt; ioProperty $ do z &lt;- try (evaluate (xs
--   <a>imod</a> ys)); return $ z === Left DivideByZero
imod :: Integral a => Interval a -> Interval a -> Interval a
