{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving #-}
{-|
    Module      :  AERN2.MP.WithCurrentPrec.Limit
    Description :  WithCurrentPrec limits
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

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

    WithCurrentPrec limits
-}
module AERN2.MP.WithCurrentPrec.Limit
()
where

import MixedTypesNumPrelude
-- import qualified Prelude as P
-- import Text.Printf

-- import qualified Numeric.CollectErrors as CN

import GHC.TypeLits
import Control.Monad (join)

import AERN2.MP.Ball

import AERN2.Limit

import AERN2.MP.WithCurrentPrec.Type

instance 
    (HasLimits ix (CN MPBall -> CN MPBall)
    , LimitType ix (CN MPBall -> CN MPBall) ~ (CN MPBall -> CN MPBall)
    , KnownNat p)
    => 
    HasLimits ix (WithCurrentPrec p (CN MPBall)) 
    where
    type LimitType ix (WithCurrentPrec p (CN MPBall)) = WithCurrentPrec p (CN MPBall)
    limit :: (ix -> WithCurrentPrec p (CN MPBall))
-> LimitType ix (WithCurrentPrec p (CN MPBall))
limit ix -> WithCurrentPrec p (CN MPBall)
s = (ix -> CN (WithCurrentPrec p (CN MPBall)))
-> LimitType ix (CN (WithCurrentPrec p (CN MPBall)))
forall ix s. HasLimits ix s => (ix -> s) -> LimitType ix s
limit ((ix -> CN (WithCurrentPrec p (CN MPBall)))
 -> LimitType ix (CN (WithCurrentPrec p (CN MPBall))))
-> (ix -> CN (WithCurrentPrec p (CN MPBall)))
-> LimitType ix (CN (WithCurrentPrec p (CN MPBall)))
forall a b. (a -> b) -> a -> b
$ WithCurrentPrec p (CN MPBall) -> CN (WithCurrentPrec p (CN MPBall))
forall v. v -> CN v
cn (WithCurrentPrec p (CN MPBall)
 -> CN (WithCurrentPrec p (CN MPBall)))
-> (ix -> WithCurrentPrec p (CN MPBall))
-> ix
-> CN (WithCurrentPrec p (CN MPBall))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ix -> WithCurrentPrec p (CN MPBall)
s

instance 
    (HasLimits ix (CN MPBall -> CN MPBall)
    , LimitType ix (CN MPBall -> CN MPBall) ~ (CN MPBall -> CN MPBall)
    , KnownNat p)
    => 
    HasLimits ix (CN (WithCurrentPrec p (CN MPBall)))
    where
    type LimitType ix (CN (WithCurrentPrec p (CN MPBall))) = WithCurrentPrec p (CN MPBall)
    limit :: (ix -> CN (WithCurrentPrec p (CN MPBall)))
-> LimitType ix (CN (WithCurrentPrec p (CN MPBall)))
limit (ix -> CN (WithCurrentPrec p (CN MPBall))
s :: ix -> CN (WithCurrentPrec p (CN MPBall))) = 
        CN MPBall -> WithCurrentPrec p (CN MPBall)
forall k (p :: k) t. t -> WithCurrentPrec p t
WithCurrentPrec (CN MPBall -> WithCurrentPrec p (CN MPBall))
-> CN MPBall -> WithCurrentPrec p (CN MPBall)
forall a b. (a -> b) -> a -> b
$ (ix -> CN MPBall -> CN MPBall)
-> LimitType ix (CN MPBall -> CN MPBall)
forall ix s. HasLimits ix s => (ix -> s) -> LimitType ix s
limit (ix -> CN MPBall -> CN MPBall
snop) (CN MPBall -> CN MPBall) -> CN MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ CN MPBall
sample
        where
        sample :: CN MPBall
        sample :: CN MPBall
sample = Precision -> CN MPBall -> CN MPBall
forall t. CanSetPrecision t => Precision -> t -> t
setPrecision (WithCurrentPrec p MPBall -> Precision
forall (p :: Nat) t. KnownNat p => WithCurrentPrec p t -> Precision
getCurrentPrecision WithCurrentPrec p MPBall
sampleP) (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)
        sampleP :: WithCurrentPrec p MPBall
        sampleP :: WithCurrentPrec p MPBall
sampleP = [Char] -> WithCurrentPrec p MPBall
forall a. HasCallStack => [Char] -> a
error [Char]
"sampleP is not defined, it is only a type proxy"
        snop :: ix -> (CN MPBall -> CN MPBall)
        snop :: ix -> CN MPBall -> CN MPBall
snop ix
ix CN MPBall
_sample = CollectErrors NumErrors (CN MPBall) -> CN MPBall
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (CollectErrors NumErrors (CN MPBall) -> CN MPBall)
-> CollectErrors NumErrors (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ (WithCurrentPrec p (CN MPBall) -> CN MPBall)
-> CN (WithCurrentPrec p (CN MPBall))
-> CollectErrors NumErrors (CN MPBall)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WithCurrentPrec p (CN MPBall) -> CN MPBall
forall k (p :: k) t. WithCurrentPrec p t -> t
unWithCurrentPrec (CN (WithCurrentPrec p (CN MPBall))
 -> CollectErrors NumErrors (CN MPBall))
-> CN (WithCurrentPrec p (CN MPBall))
-> CollectErrors NumErrors (CN MPBall)
forall a b. (a -> b) -> a -> b
$ ix -> CN (WithCurrentPrec p (CN MPBall))
s ix
ix