must 0.2.0

assertion library for rust
Documentation
use std::ops::{Range, RangeFrom, RangeFull, RangeTo};

/// **RangeArgument** is implemented by Rust's built-in range types, produced
/// by range syntax like `..`, `a..`, `..b` or `c..d`.
///
///
/// Copied from
/// https://doc.rust-lang.org/collections/range/trait.RangeArgument.html
pub trait RangeArgument<T> {
	/// Start index (inclusive)
	///
	/// Return start value if present, else `None`.
	///
	/// # Examples
	///
	/// ```
	/// #![feature(collections)]
	/// #![feature(collections_range)]
	///
	/// extern crate collections;
	///
	/// # fn main() {
	/// use collections::range::RangeArgument;
	///
	/// assert_eq!((..10).start(), None);
	/// assert_eq!((3..10).start(), Some(&3));
	/// # }
	/// ```
	fn start(&self) -> Option<&T> {
		None
	}

	/// End index (exclusive)
	///
	/// Return end value if present, else `None`.
	///
	/// # Examples
	///
	/// ```
	/// #![feature(collections)]
	/// #![feature(collections_range)]
	///
	/// extern crate collections;
	///
	/// # fn main() {
	/// use collections::range::RangeArgument;
	///
	/// assert_eq!((3..).end(), None);
	/// assert_eq!((3..10).end(), Some(&10));
	/// # }
	/// ```
	fn end(&self) -> Option<&T> {
		None
	}
}


impl<T> RangeArgument<T> for RangeFull {}

impl<T> RangeArgument<T> for RangeFrom<T> {
	fn start(&self) -> Option<&T> {
		Some(&self.start)
	}
}

impl<T> RangeArgument<T> for RangeTo<T> {
	fn end(&self) -> Option<&T> {
		Some(&self.end)
	}
}

impl<T> RangeArgument<T> for Range<T> {
	fn start(&self) -> Option<&T> {
		Some(&self.start)
	}
	fn end(&self) -> Option<&T> {
		Some(&self.end)
	}
}