Skip to content

Commit c22e7f0

Browse files
committed
Cleaned up the option and result module in more detail
Made both types implement more standard traits in a nicer way Derived more traits
1 parent 0d92c53 commit c22e7f0

File tree

2 files changed

+42
-57
lines changed

2 files changed

+42
-57
lines changed

src/libstd/option.rs

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,46 +40,28 @@
4040
use any::Any;
4141
use clone::Clone;
4242
use clone::DeepClone;
43-
use cmp::{Eq,Ord};
43+
use cmp::{Eq, TotalEq, TotalOrd};
4444
use default::Default;
4545
use either;
4646
use fmt;
4747
use iter::{Iterator, DoubleEndedIterator, ExactSize};
48-
use iter;
4948
use kinds::Send;
5049
use num::Zero;
51-
use result;
52-
use str::{StrSlice, OwnedStr};
50+
use result::{IntoResult, ToResult, AsResult};
51+
use result::{Result, Ok, Err};
52+
use str::OwnedStr;
5353
use to_str::ToStr;
5454
use util;
5555

5656
/// The option type
57-
#[deriving(Clone, DeepClone, Eq, ToStr)]
57+
#[deriving(Clone, DeepClone, Eq, Ord, TotalEq, TotalOrd, ToStr)]
5858
pub enum Option<T> {
5959
/// No value
6060
None,
6161
/// Some value `T`
6262
Some(T)
6363
}
6464

65-
impl<T: Eq + Ord> Ord for Option<T> {
66-
fn lt(&self, other: &Option<T>) -> bool {
67-
iter::order::lt(self.iter(), other.iter())
68-
}
69-
70-
fn le(&self, other: &Option<T>) -> bool {
71-
iter::order::le(self.iter(), other.iter())
72-
}
73-
74-
fn ge(&self, other: &Option<T>) -> bool {
75-
iter::order::ge(self.iter(), other.iter())
76-
}
77-
78-
fn gt(&self, other: &Option<T>) -> bool {
79-
iter::order::gt(self.iter(), other.iter())
80-
}
81-
}
82-
8365
/////////////////////////////////////////////////////////////////////////////
8466
// Type implementation
8567
/////////////////////////////////////////////////////////////////////////////
@@ -436,22 +418,33 @@ impl<T> AsOption<T> for Option<T> {
436418
// Trait implementations
437419
/////////////////////////////////////////////////////////////////////////////
438420

439-
impl<T: Clone> result::ToResult<T, ()> for Option<T> {
421+
impl<T: Clone> ToResult<T, ()> for Option<T> {
440422
#[inline]
441-
fn to_result(&self) -> result::Result<T, ()> {
423+
fn to_result(&self) -> Result<T, ()> {
442424
match *self {
443-
Some(ref x) => result::Ok(x.clone()),
444-
None => result::Err(()),
425+
Some(ref x) => Ok(x.clone()),
426+
None => Err(()),
445427
}
446428
}
447429
}
448430

449-
impl<T> result::IntoResult<T, ()> for Option<T> {
431+
impl<T> IntoResult<T, ()> for Option<T> {
450432
#[inline]
451-
fn into_result(self) -> result::Result<T, ()> {
433+
fn into_result(self) -> Result<T, ()> {
452434
match self {
453-
Some(x) => result::Ok(x),
454-
None => result::Err(()),
435+
Some(x) => Ok(x),
436+
None => Err(()),
437+
}
438+
}
439+
}
440+
441+
impl<T> AsResult<T, ()> for Option<T> {
442+
#[inline]
443+
fn as_result<'a>(&'a self) -> Result<&'a T, &'a ()> {
444+
static UNIT: () = ();
445+
match *self {
446+
Some(ref t) => Ok(t),
447+
None => Err(&UNIT),
455448
}
456449
}
457450
}
@@ -536,7 +529,8 @@ mod tests {
536529
use either::{IntoEither, ToEither};
537530
use either;
538531
use result::{IntoResult, ToResult};
539-
use result;
532+
use result::{Result, Ok, Err};
533+
use str::StrSlice;
540534
use util;
541535

542536
#[test]
@@ -814,17 +808,17 @@ mod tests {
814808
let some: Option<int> = Some(100);
815809
let none: Option<int> = None;
816810

817-
assert_eq!(some.to_result(), result::Ok(100));
818-
assert_eq!(none.to_result(), result::Err(()));
811+
assert_eq!(some.to_result(), Ok(100));
812+
assert_eq!(none.to_result(), Err(()));
819813
}
820814

821815
#[test]
822816
pub fn test_into_result() {
823817
let some: Option<int> = Some(100);
824818
let none: Option<int> = None;
825819

826-
assert_eq!(some.into_result(), result::Ok(100));
827-
assert_eq!(none.into_result(), result::Err(()));
820+
assert_eq!(some.into_result(), Ok(100));
821+
assert_eq!(none.into_result(), Err(()));
828822
}
829823

830824
#[test]

src/libstd/result.rs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use fmt;
1818
use iter::Iterator;
1919
use kinds::Send;
2020
use option::{None, Option, Some, OptionIterator};
21-
use option;
21+
use option::{ToOption, IntoOption, AsOption};
22+
use str::OwnedStr;
2223
use to_str::ToStr;
2324
use vec::OwnedVector;
2425
use vec;
@@ -28,7 +29,7 @@ use vec;
2829
/// In order to provide informative error messages, `E` is required to implement `ToStr`.
2930
/// It is further recommended for `E` to be a descriptive error type, eg a `enum` for
3031
/// all possible errors cases.
31-
#[deriving(Clone, Eq)]
32+
#[deriving(Clone, DeepClone, Eq, Ord, TotalEq, TotalOrd, ToStr)]
3233
pub enum Result<T, E> {
3334
/// Contains the successful result value
3435
Ok(T),
@@ -300,7 +301,7 @@ impl<T, E> AsResult<T, E> for Result<T, E> {
300301
// Trait implementations
301302
/////////////////////////////////////////////////////////////////////////////
302303

303-
impl<T: Clone, E> option::ToOption<T> for Result<T, E> {
304+
impl<T: Clone, E> ToOption<T> for Result<T, E> {
304305
#[inline]
305306
fn to_option(&self) -> Option<T> {
306307
match *self {
@@ -310,7 +311,7 @@ impl<T: Clone, E> option::ToOption<T> for Result<T, E> {
310311
}
311312
}
312313

313-
impl<T, E> option::IntoOption<T> for Result<T, E> {
314+
impl<T, E> IntoOption<T> for Result<T, E> {
314315
#[inline]
315316
fn into_option(self) -> Option<T> {
316317
match self {
@@ -320,7 +321,7 @@ impl<T, E> option::IntoOption<T> for Result<T, E> {
320321
}
321322
}
322323

323-
impl<T, E> option::AsOption<T> for Result<T, E> {
324+
impl<T, E> AsOption<T> for Result<T, E> {
324325
#[inline]
325326
fn as_option<'a>(&'a self) -> Option<&'a T> {
326327
match *self {
@@ -360,16 +361,6 @@ impl<T, E> either::AsEither<E, T> for Result<T, E> {
360361
}
361362
}
362363

363-
impl<T: ToStr, E: ToStr> ToStr for Result<T, E> {
364-
#[inline]
365-
fn to_str(&self) -> ~str {
366-
match *self {
367-
Ok(ref t) => format!("Ok({:s})", t.to_str()),
368-
Err(ref e) => format!("Err({:s})", e.to_str())
369-
}
370-
}
371-
}
372-
373364
impl<T: fmt::Default, E: fmt::Default> fmt::Default for Result<T, E> {
374365
#[inline]
375366
fn fmt(s: &Result<T, E>, f: &mut fmt::Formatter) {
@@ -457,7 +448,7 @@ mod tests {
457448
use either;
458449
use iter::range;
459450
use option::{IntoOption, ToOption, AsOption};
460-
use option;
451+
use option::{Option, Some, None};
461452
use vec::ImmutableVector;
462453
use to_str::ToStr;
463454

@@ -588,17 +579,17 @@ mod tests {
588579
let ok: Result<int, int> = Ok(100);
589580
let err: Result<int, int> = Err(404);
590581
591-
assert_eq!(ok.to_option(), option::Some(100));
592-
assert_eq!(err.to_option(), option::None);
582+
assert_eq!(ok.to_option(), Some(100));
583+
assert_eq!(err.to_option(), None);
593584
}
594585
595586
#[test]
596587
pub fn test_into_option() {
597588
let ok: Result<int, int> = Ok(100);
598589
let err: Result<int, int> = Err(404);
599590
600-
assert_eq!(ok.into_option(), option::Some(100));
601-
assert_eq!(err.into_option(), option::None);
591+
assert_eq!(ok.into_option(), Some(100));
592+
assert_eq!(err.into_option(), None);
602593
}
603594
604595
#[test]
@@ -607,7 +598,7 @@ mod tests {
607598
let err: Result<int, int> = Err(404);
608599
609600
assert_eq!(ok.as_option().unwrap(), &100);
610-
assert_eq!(err.as_option(), option::None);
601+
assert_eq!(err.as_option(), None);
611602
}
612603
613604
#[test]

0 commit comments

Comments
 (0)