///|
/// Core rounding modes aligned with mpmath's low-level modes:
/// - Nearest: tie-to-even
/// - Floor: towards -inf
/// - Ceiling: towards +inf
/// - Up: away from zero
/// - Down: towards zero
pub enum RoundMode {
  Nearest
  Floor
  Ceiling
  Up
  Down
} derive(Debug, Eq)

///|
pub impl Show for RoundMode with fn output(self, logger) {
  logger.write_object(self.to_repr())
}

///|
/// Raw arbitrary-precision floating-point value:
/// value = (-1)^sign * man * 2^exp
/// Canonical invariant: `man` is non-negative and odd unless it is zero.
pub struct RawMpf {
  sign : Int
  man : BigInt
  exp : Int
  bc : Int
} derive(Debug, Eq)

///|
pub impl Show for RawMpf with fn output(self, logger) {
  logger.write_object(self.to_repr())
}

///|
pub(all) suberror MpfError {
  ValueError(String)
  DomainError(String)
  DivisionByZero(String)
  ParseError(String)
  FormatError(String)
  UnsupportedError(String)
} derive(Debug, Eq)

///|
pub impl Show for MpfError with fn output(self, logger) {
  logger.write_object(self.to_repr())
}

///|
/// Canonical positive zero.
pub let fzero : RawMpf = { sign: 0, man: 0N, exp: 0, bc: 0 }

///|
/// Canonical positive one.
pub let fone : RawMpf = { sign: 0, man: 1N, exp: 0, bc: 1 }

///|
/// Canonical negative one.
pub let fnone : RawMpf = { sign: 1, man: 1N, exp: 0, bc: 1 }

///|
/// Canonical NaN sentinel.
pub let fnan : RawMpf = { sign: 0, man: 0N, exp: -123, bc: -1 }

///|
/// Canonical positive infinity.
pub let finf : RawMpf = { sign: 0, man: 0N, exp: -456, bc: -2 }

///|
/// Canonical negative infinity.
pub let fninf : RawMpf = { sign: 1, man: 0N, exp: -789, bc: -3 }

///|
/// Rounding mode alias: nearest (tie-to-even).
pub let round_nearest : RoundMode = Nearest

///|
/// Rounding mode alias: toward negative infinity.
pub let round_floor : RoundMode = Floor

///|
/// Rounding mode alias: toward positive infinity.
pub let round_ceiling : RoundMode = Ceiling

///|
/// Rounding mode alias: away from zero.
pub let round_up : RoundMode = Up

///|
/// Rounding mode alias: toward zero.
pub let round_down : RoundMode = Down