Module      :  Data.Number.ER.BasicTypes
    Description :  generic types for exact real number processing 
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable

    generic types for exact real number processing
module Data.Number.ER.BasicTypes 

import qualified Data.Number.ER.ExtendedInteger as EI

import qualified Data.Map as Map

    Precision represents an upper bound on the measure of 
    an approximation viewed as a set;
    not to be confused with the precision of 
    an 'Data.Number.ER.Real.Base.Float.ERFloat' and similar.
    In an approximation comprising a number of
    instances of 'Data.Number.ER.Real.Base.ERRealBase',
    we will refer to the bit-precision of these base components
    as the 'Granularity' of the approximation.
type Precision = EI.ExtendedInteger

  The bit size of the floating point numbers (or similar)
  used internally in real number and function approximations.
type Granularity = Int

prec2gran :: Precision -> Granularity
prec2gran = fromInteger . toInteger

    This type synonym should be used for funciton parameter(s)
    that guide the convergence of the function's result to
    a perfect (exact) result.  
    The name should remind us 
    that there is no universally valid relationship between
    this integer the quality (precision) of the result.    
    The only condition usually assumed is that in the limit
    when the effort index rises to infinity, the result 
    should be exact.
type EffortIndex = Integer

effIx2gran :: EffortIndex -> Granularity
effIx2gran  = fromInteger . toInteger

effIx2prec :: EffortIndex -> Precision
effIx2prec = fromInteger . toInteger

effIx2int :: EffortIndex -> Int
effIx2int = fromInteger . toInteger

int2effIx :: Int -> EffortIndex
int2effIx = fromInteger . toInteger

prec2effIx :: Precision -> EffortIndex
prec2effIx = fromInteger . toInteger

gran2effIx :: Granularity -> EffortIndex
gran2effIx = fromInteger . toInteger

    A variable identifier for axes in function domains, polynomials etc.
type VarID = Int
defaultVar :: VarID
defaultVar = 0

    A many-dimensional point or interval.
type Box ira = Map.Map VarID ira

{-| using 'defaultVar' -}
unaryDom :: ira -> Box ira
unaryDom r = Map.singleton defaultVar r

noinfoDom :: Box ira
noinfoDom = Map.empty