auto merge of #9115 : erickt/rust/master, r=erickt
This is a series of patches to modernize option and result. The highlights are: * rename `.unwrap_or_default(value)` and etc to `.unwrap_or(value)` * add `.unwrap_or_default()` that uses the `Default` trait * add `Default` implementations for vecs, HashMap, Option * add `Option.and(T) -> Option<T>`, `Option.and_then(&fn() -> Option<T>) -> Option<T>`, `Option.or(T) -> Option<T>`, and `Option.or_else(&fn() -> Option<T>) -> Option<T>` * add `option::ToOption`, `option::IntoOption`, `option::AsOption`, `result::ToResult`, `result::IntoResult`, `result::AsResult`, `either::ToEither`, and `either::IntoEither`, `either::AsEither` * renamed `Option::chain*` and `Result::chain*` to `and_then` and `or_else` to avoid the eventual collision with `Iterator.chain`. * Added a bunch of impls of `Default` * Added a `#[deriving(Default)]` syntax extension * Removed impls of `Zero` for `Option<T>` and vecs.
This commit is contained in:
commit
2aa578efd9
55 changed files with 1102 additions and 230 deletions
|
|
@ -137,7 +137,17 @@ fn list_dir_sorted(path: &Path) -> ~[Path] {
|
|||
/**
|
||||
* A compiled Unix shell style pattern.
|
||||
*/
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes, Zero)]
|
||||
#[cfg(stage0)]
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes)]
|
||||
pub struct Pattern {
|
||||
priv tokens: ~[PatternToken]
|
||||
}
|
||||
|
||||
/**
|
||||
* A compiled Unix shell style pattern.
|
||||
*/
|
||||
#[cfg(not(stage0))]
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes, Default)]
|
||||
pub struct Pattern {
|
||||
priv tokens: ~[PatternToken]
|
||||
}
|
||||
|
|
@ -312,7 +322,7 @@ impl Pattern {
|
|||
let require_literal = |c| {
|
||||
(options.require_literal_separator && is_sep(c)) ||
|
||||
(options.require_literal_leading_dot && c == '.'
|
||||
&& is_sep(prev_char.unwrap_or_default('/')))
|
||||
&& is_sep(prev_char.unwrap_or('/')))
|
||||
};
|
||||
|
||||
for (ti, token) in self.tokens.slice_from(i).iter().enumerate() {
|
||||
|
|
@ -458,7 +468,37 @@ fn is_sep(c: char) -> bool {
|
|||
/**
|
||||
* Configuration options to modify the behaviour of `Pattern::matches_with(..)`
|
||||
*/
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes, Zero)]
|
||||
#[cfg(stage0)]
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes)]
|
||||
pub struct MatchOptions {
|
||||
|
||||
/**
|
||||
* Whether or not patterns should be matched in a case-sensitive manner. This
|
||||
* currently only considers upper/lower case relationships between ASCII characters,
|
||||
* but in future this might be extended to work with Unicode.
|
||||
*/
|
||||
case_sensitive: bool,
|
||||
|
||||
/**
|
||||
* If this is true then path-component separator characters (e.g. `/` on Posix)
|
||||
* must be matched by a literal `/`, rather than by `*` or `?` or `[...]`
|
||||
*/
|
||||
require_literal_separator: bool,
|
||||
|
||||
/**
|
||||
* If this is true then paths that contain components that start with a `.` will
|
||||
* not match unless the `.` appears literally in the pattern: `*`, `?` or `[...]`
|
||||
* will not match. This is useful because such files are conventionally considered
|
||||
* hidden on Unix systems and it might be desirable to skip them when listing files.
|
||||
*/
|
||||
require_literal_leading_dot: bool
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuration options to modify the behaviour of `Pattern::matches_with(..)`
|
||||
*/
|
||||
#[cfg(not(stage0))]
|
||||
#[deriving(Clone, Eq, TotalEq, Ord, TotalOrd, IterBytes, Default)]
|
||||
pub struct MatchOptions {
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ impl BigUint {
|
|||
|
||||
// Converts this BigUint into an int, unless it would overflow.
|
||||
pub fn to_int_opt(&self) -> Option<int> {
|
||||
self.to_uint_opt().chain(|n| {
|
||||
self.to_uint_opt().and_then(|n| {
|
||||
// If top bit of uint is set, it's too large to convert to
|
||||
// int.
|
||||
if (n >> (2*BigDigit::bits - 1) != 0) {
|
||||
|
|
@ -1221,7 +1221,7 @@ impl BigInt {
|
|||
match self.sign {
|
||||
Plus => self.data.to_int_opt(),
|
||||
Zero => Some(0),
|
||||
Minus => self.data.to_uint_opt().chain(|n| {
|
||||
Minus => self.data.to_uint_opt().and_then(|n| {
|
||||
let m: uint = 1 << (2*BigDigit::bits-1);
|
||||
if (n > m) {
|
||||
None
|
||||
|
|
|
|||
|
|
@ -273,9 +273,9 @@ impl<T: FromStr + Clone + Integer + Ord>
|
|||
return None
|
||||
}
|
||||
let a_option: Option<T> = FromStr::from_str(split[0]);
|
||||
do a_option.chain |a| {
|
||||
do a_option.and_then |a| {
|
||||
let b_option: Option<T> = FromStr::from_str(split[1]);
|
||||
do b_option.chain |b| {
|
||||
do b_option.and_then |b| {
|
||||
Some(Ratio::new(a.clone(), b.clone()))
|
||||
}
|
||||
}
|
||||
|
|
@ -291,10 +291,10 @@ impl<T: FromStrRadix + Clone + Integer + Ord>
|
|||
} else {
|
||||
let a_option: Option<T> = FromStrRadix::from_str_radix(split[0],
|
||||
radix);
|
||||
do a_option.chain |a| {
|
||||
do a_option.and_then |a| {
|
||||
let b_option: Option<T> =
|
||||
FromStrRadix::from_str_radix(split[1], radix);
|
||||
do b_option.chain |b| {
|
||||
do b_option.and_then |b| {
|
||||
Some(Ratio::new(a.clone(), b.clone()))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -442,21 +442,21 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
|
|||
},
|
||||
'c' => {
|
||||
parse_type(s, pos, 'a', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, ' '))
|
||||
.chain(|pos| parse_type(s, pos, 'b', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ' '))
|
||||
.chain(|pos| parse_type(s, pos, 'e', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ' '))
|
||||
.chain(|pos| parse_type(s, pos, 'T', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ' '))
|
||||
.chain(|pos| parse_type(s, pos, 'Y', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ' '))
|
||||
.and_then(|pos| parse_type(s, pos, 'b', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ' '))
|
||||
.and_then(|pos| parse_type(s, pos, 'e', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ' '))
|
||||
.and_then(|pos| parse_type(s, pos, 'T', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ' '))
|
||||
.and_then(|pos| parse_type(s, pos, 'Y', &mut *tm))
|
||||
}
|
||||
'D' | 'x' => {
|
||||
parse_type(s, pos, 'm', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, '/'))
|
||||
.chain(|pos| parse_type(s, pos, 'd', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, '/'))
|
||||
.chain(|pos| parse_type(s, pos, 'y', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '/'))
|
||||
.and_then(|pos| parse_type(s, pos, 'd', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '/'))
|
||||
.and_then(|pos| parse_type(s, pos, 'y', &mut *tm))
|
||||
}
|
||||
'd' => match match_digits_in_range(s, pos, 2u, false, 1_i32,
|
||||
31_i32) {
|
||||
|
|
@ -475,10 +475,10 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
|
|||
}
|
||||
'F' => {
|
||||
parse_type(s, pos, 'Y', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, '-'))
|
||||
.chain(|pos| parse_type(s, pos, 'm', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, '-'))
|
||||
.chain(|pos| parse_type(s, pos, 'd', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '-'))
|
||||
.and_then(|pos| parse_type(s, pos, 'm', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '-'))
|
||||
.and_then(|pos| parse_type(s, pos, 'd', &mut *tm))
|
||||
}
|
||||
'H' => {
|
||||
match match_digits_in_range(s, pos, 2u, false, 0_i32, 23_i32) {
|
||||
|
|
@ -553,17 +553,17 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
|
|||
},
|
||||
'R' => {
|
||||
parse_type(s, pos, 'H', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, ':'))
|
||||
.chain(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ':'))
|
||||
.and_then(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
}
|
||||
'r' => {
|
||||
parse_type(s, pos, 'I', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, ':'))
|
||||
.chain(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ':'))
|
||||
.chain(|pos| parse_type(s, pos, 'S', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ' '))
|
||||
.chain(|pos| parse_type(s, pos, 'p', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ':'))
|
||||
.and_then(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ':'))
|
||||
.and_then(|pos| parse_type(s, pos, 'S', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ' '))
|
||||
.and_then(|pos| parse_type(s, pos, 'p', &mut *tm))
|
||||
}
|
||||
'S' => {
|
||||
match match_digits_in_range(s, pos, 2u, false, 0_i32, 60_i32) {
|
||||
|
|
@ -578,10 +578,10 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
|
|||
//'s' {}
|
||||
'T' | 'X' => {
|
||||
parse_type(s, pos, 'H', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, ':'))
|
||||
.chain(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, ':'))
|
||||
.chain(|pos| parse_type(s, pos, 'S', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ':'))
|
||||
.and_then(|pos| parse_type(s, pos, 'M', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, ':'))
|
||||
.and_then(|pos| parse_type(s, pos, 'S', &mut *tm))
|
||||
}
|
||||
't' => parse_char(s, pos, '\t'),
|
||||
'u' => {
|
||||
|
|
@ -596,10 +596,10 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
|
|||
}
|
||||
'v' => {
|
||||
parse_type(s, pos, 'e', &mut *tm)
|
||||
.chain(|pos| parse_char(s, pos, '-'))
|
||||
.chain(|pos| parse_type(s, pos, 'b', &mut *tm))
|
||||
.chain(|pos| parse_char(s, pos, '-'))
|
||||
.chain(|pos| parse_type(s, pos, 'Y', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '-'))
|
||||
.and_then(|pos| parse_type(s, pos, 'b', &mut *tm))
|
||||
.and_then(|pos| parse_char(s, pos, '-'))
|
||||
.and_then(|pos| parse_type(s, pos, 'Y', &mut *tm))
|
||||
}
|
||||
//'W' {}
|
||||
'w' => {
|
||||
|
|
|
|||
|
|
@ -417,6 +417,13 @@ impl Uuid {
|
|||
}
|
||||
}
|
||||
|
||||
impl Default for Uuid {
|
||||
/// Returns the nil UUID, which is all zeroes
|
||||
fn default() -> Uuid {
|
||||
Uuid::new_nil()
|
||||
}
|
||||
}
|
||||
|
||||
impl Zero for Uuid {
|
||||
/// Returns the nil UUID, which is all zeroes
|
||||
fn zero() -> Uuid {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue