module Numeric.VariablePrecision.Precision.Reify
( reifyPrecision
, withReifiedPrecision
, (.@$)
) where
import Numeric.VariablePrecision.Precision
( VariablePrecision, withPrecision, Word
, NaturalNumber, n0, successorTo
)
reifyPrecision :: Word -> (forall p . NaturalNumber p => p -> a) -> a
reifyPrecision = go n0
where
go :: NaturalNumber q => q -> Word -> (forall p . NaturalNumber p => p -> a) -> a
go n i f
| i == 0 = f n
| otherwise = go (successorTo n) (i 1) f
withReifiedPrecision
:: (VariablePrecision t, NaturalNumber p)
=> t p
-> Word
-> (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
-> Word
-> (forall q. NaturalNumber q => t q -> a)
-> a
(.@$) = withReifiedPrecision
infixl 1 .@$