{-|
    Module      :  AERN2.Real
    Description :  Exact real numbers
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable

    Exact real numbers represented by Cauchy sequences of MPBalls.
-}
module AERN2.Real
(
   -- * real numbers and conversions
   CReal, 
   CSequence (..), 
   creal, HasCReals, CanBeCReal,
   cseqPrecisions, cseqIndexForPrecision, 
   cseqFromWithCurrentPrec, cseqFromPrecFunction,
   pi,
   crealFromWithCurrentPrec, crealFromPrecFunction,
   -- * limits
   HasLimits(..),
   -- * lazy Kleeneans
   CKleenean, CanBeCKleenean, ckleenean, 
   CanSelect(..), CanSelectBool, CanSelectCNBool,
   -- * extracting approximations
   CanExtractApproximation(..), (?), bits, prec,
   -- * abstract real numbers
   RealNumber
)
where

import AERN2.Limit
import AERN2.Select
import AERN2.MP
import AERN2.MP.WithCurrentPrec
import AERN2.Real.Type
import AERN2.Real.Comparisons ()
import AERN2.Real.CKleenean
import AERN2.Real.Field ()
import AERN2.Real.Limit ()
import AERN2.Real.Elementary (pi)
-- import AERN2.Real.Tests ()

import MixedTypesNumPrelude
-- import qualified Prelude as P
import GHC.TypeLits ( KnownNat )
import Numeric.CollectErrors (CanTakeCNErrors)

-- import Text.Printf
-- -- import AERN2.MP.Dyadic

class
    (OrderedField r
    , HasLimitsSameType Int r
    , HasLimitsSameType Integer r
    , HasLimitsSameType Rational r
    , CanTakeCNErrors r
    , CanSelectCNBool (OrderCompareType r r)
    , OrderCompareType r r ~ OrderCompareType Integer r
    , OrderCompareType r r ~ OrderCompareType r Integer
    , OrderCompareType r r ~ OrderCompareType Int r
    , OrderCompareType r r ~ OrderCompareType r Int
    , OrderCompareType r r ~ OrderCompareType Rational r
    , OrderCompareType r r ~ OrderCompareType r Rational
    , EqCompareType r r ~ OrderCompareType r r
    , EqCompareType r r ~ EqCompareType Integer r
    , EqCompareType r r ~ EqCompareType r Integer
    , EqCompareType r r ~ EqCompareType Int r
    , EqCompareType r r ~ EqCompareType r Int
    , EqCompareType r r ~ EqCompareType Rational r
    , EqCompareType r r ~ EqCompareType r Rational)
    => 
    RealNumber r

instance RealNumber CReal
instance
    (KnownNat p) => 
    RealNumber (WithCurrentPrec p (CN MPBall))