use Bound;
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for a primitive type.
/// Base implementation of `Domain` for the `Ordering` enum.
/// Base implementation of `Domain` for a `NoisyFloat`.
/// Base implementation of `Domain` for a `BigInt`.
/// Base implementation of `Domain` for a `BigUint`.
/// Provides otherwise unknown information about the type it is being implemented for.
///
/// There are five properties which can be combined into six categories a domain can be in,
/// each with their own implementation requirements and assumptions.
///
/// Should the type you're trying to implement not fit into any of these, please open an issue!
///
/// # Properties
/// Requirements to be recognized as
/// - `discrete`:
/// - `DISCRETE` is set to true
/// - `predecessor()` and `successor()` are implemented and do not panic
/// - `continuous`:
/// - `DISCRETE` is set to false (default)
/// - `predecessor()` and `successor()` are never to be called (they panic by default)
/// - `limited`:
/// - `minimum()` and `maximum()` do not return `Bound::Unbounded`
/// - `bidirectional`
/// - `minimum()` and `maximum()` return `Bound::Unbounded` (default)
/// - `unidirectional`
/// - either `minimum()` or `maximum()` does not return `Bound::Unbounded`
///
/// # Categories
/// ## discrete and limited
/// This is your typical primitive integer like `u8` or `i32`.
///
/// ## discrete, unlimited and bidirectional
/// An example for this kind of domain is `BigInt`. The `num-bigint` crate is used to optionally
/// provide an implementation.
///
/// ## discrete, unlimited and unidirectional
/// Like `BigInt`, but limited in one direction: `BigUint`.
///
/// ## continuous and limited
/// Because `f32` or `f64` do not implement `Ord`, this trait can not be implemented for them directly.
/// Instead, using `noisy_float`, all four types (`N32`, `N64`, `R32` and `R64`) have an optional
/// implementation. In terms of concrete values, an example domain could be `[0.0, 1.0]`.
///
/// ## continuous, unlimited and bidirectional
/// This category requires an arbitrarily large float. So far no base/default implementation exists.
/// If you would like to suggest a crate that provides this type (it must implement `Ord`!), please
/// leave an issue.
///
/// ## continuous, unlimited and unidirectional
/// This category requires an arbitrarily large float. So far no base/default implementation exists.
/// If you would like to suggest a crate that provides this type (it must implement `Ord`!), please
/// leave an issue.
/// `Domain`-driven trait required to implement iterators on discrete types.