module Numeric.VariablePrecision.Precision
( HasPrecision(precisionOf)
, precision
, atPrecision
, atPrecisionOf
, (.@)
, VariablePrecision(adjustPrecision)
, withPrecision
, withPrecisionOf
, (.@~)
, module TypeLevel.NaturalNumber
) where
import TypeLevel.NaturalNumber
class HasPrecision t where
precisionOf :: NaturalNumber p => t p -> p
precisionOf _ = error "Numeric.VariablePrecision.Precision.HasPrecision.precisionOf: result evaluated"
precision :: (HasPrecision t, NaturalNumber p) => t p -> Int
precision = naturalNumberAsInt . precisionOf
atPrecision :: (HasPrecision t, NaturalNumber p) => t p -> p -> t p
atPrecision = const
atPrecisionOf
:: (HasPrecision t, HasPrecision s, NaturalNumber p)
=> t p -> s p -> t p
atPrecisionOf = const
infixl 5 `atPrecisionOf`
(.@)
:: (HasPrecision t, HasPrecision s, NaturalNumber p)
=> t p -> s p -> t p
(.@) = atPrecisionOf
infixl 5 .@
class HasPrecision t => VariablePrecision t where
adjustPrecision :: (NaturalNumber p, NaturalNumber q) => t p -> t q
withPrecision
:: (VariablePrecision t, NaturalNumber p, NaturalNumber q)
=> t p -> q -> t q
withPrecision x q = adjustPrecision x `atPrecision` q
withPrecisionOf
:: (VariablePrecision t, HasPrecision s, NaturalNumber p, NaturalNumber q)
=> t p -> s q -> t q
withPrecisionOf x w = x `withPrecision` precisionOf w
infixl 5 `withPrecisionOf`
(.@~)
:: (VariablePrecision t, HasPrecision s, NaturalNumber p, NaturalNumber q)
=> t p -> s q -> t q
(.@~) = withPrecisionOf
infixl 5 .@~