module Numeric.VariablePrecision.Precision.Reify
( reifyPrecision
, withReifiedPrecision
, (.@$)
) where
import Numeric.VariablePrecision.Precision (NaturalNumber, n0, successorTo, VariablePrecision, withPrecision)
reifyPrecision :: Int -> (forall p . NaturalNumber p => p -> a) -> a
reifyPrecision = go n0
where
go :: NaturalNumber q => q -> Int -> (forall p . NaturalNumber p => p -> a) -> a
go n i f
| i < 0 = error $ "Numeric.VariablePrecision.Precision.Reify.reifyPrecision: negative argument: " ++ show i
| i == 0 = f n
| i > 0 = go (successorTo n) (i 1) f
withReifiedPrecision
:: (VariablePrecision t, NaturalNumber p)
=> t p
-> Int
-> (forall q. NaturalNumber q => t q -> a)
-> a
withReifiedPrecision x i f = reifyPrecision i (f . withPrecision x)
infixl 1 `withReifiedPrecision`
(.@$)
:: (VariablePrecision t, NaturalNumber p)
=> t p
-> Int
-> (forall q. NaturalNumber q => t q -> a)
-> a
(.@$) = withReifiedPrecision
infix 1 .@$