Skip to content

Commit d41c91c

Browse files
committed
Add or and or_else for ordering.
1 parent c6673db commit d41c91c

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed

src/libcore/cmp.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,76 @@ impl Ordering {
245245
Greater => Less,
246246
}
247247
}
248+
249+
/// Chain two orderings.
250+
///
251+
/// Returns `self` when it's not `Equal`. Otherwise returns `other`.
252+
/// # Examples
253+
///
254+
/// ```
255+
/// use std::cmp::Ordering;
256+
///
257+
/// let result = Ordering::Equal.or(Ordering::Less);
258+
/// assert_eq!(result, Ordering::Less);
259+
///
260+
/// let result = Ordering::Less.or(Ordering::Equal);
261+
/// assert_eq!(result, Ordering::Less);
262+
///
263+
/// let result = Ordering::Less.or(Ordering::Greater);
264+
/// assert_eq!(result, Ordering::Less);
265+
///
266+
/// let result = Ordering::Equal.or(Ordering::Equal);
267+
/// assert_eq!(result, Ordering::Equal);
268+
///
269+
/// let x = (1, 2, 7);
270+
/// let y = (1, 5, 3);
271+
/// let result = x.0.cmp(y.0).or(x.1.cmp(y.1)).or(x.2.cmp(y.2));
272+
///
273+
/// assert_eq!(result, Ordering::Less);
274+
/// ```
275+
#[unstable(feature = "ordering_chaining", issue = "37053")]
276+
pub fn or(self, other: Ordering) -> Ordering {
277+
match self {
278+
Equal => other,
279+
_ => self,
280+
}
281+
}
282+
283+
/// Chain the ordering with given function.
284+
///
285+
/// Returns `self` when it's not `Equal`. Otherwise calls `f` and returns
286+
/// the result.
287+
///
288+
/// # Examples
289+
///
290+
/// ```
291+
/// use std::cmp::Ordering;
292+
///
293+
/// let result = Ordering::Equal.or_else(|| Ordering::Less);
294+
/// assert_eq!(result, Ordering::Less);
295+
///
296+
/// let result = Ordering::Less.or_else(|| Ordering::Equal);
297+
/// assert_eq!(result, Ordering::Less);
298+
///
299+
/// let result = Ordering::Less.or_else(|| Ordering::Greater);
300+
/// assert_eq!(result, Ordering::Less);
301+
///
302+
/// let result = Ordering::Equal.or_else(|| Ordering::Equal);
303+
/// assert_eq!(result, Ordering::Equal);
304+
///
305+
/// let x = (1, 2, 7);
306+
/// let y = (1, 5, 3);
307+
/// let result = x.0.cmp(&y.0).or_else(|| x.1.cmp(&y.1)).or_else(|| x.2.cmp(&y.2));
308+
///
309+
/// assert_eq!(result, Ordering::Less);
310+
/// ```
311+
#[unstable(feature = "ordering_chaining", issue = "37053")]
312+
pub fn or_else<F: FnOnce() -> Ordering>(self, f: F) -> Ordering {
313+
match self {
314+
Equal => f(),
315+
_ => self,
316+
}
317+
}
248318
}
249319

250320
/// Trait for types that form a [total order](https://en.wikipedia.org/wiki/Total_order).

src/libcoretest/cmp.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,32 @@ fn test_ordering_order() {
4141
assert_eq!(Greater.cmp(&Less), Greater);
4242
}
4343

44+
#[test]
45+
fn test_ordering_or() {
46+
assert_eq!(Equal.or(Less), Less);
47+
assert_eq!(Equal.or(Equal), Equal);
48+
assert_eq!(Equal.or(Greater), Greater);
49+
assert_eq!(Less.or(Less), Less);
50+
assert_eq!(Less.or(Equal), Less);
51+
assert_eq!(Less.or(Greater), Less);
52+
assert_eq!(Greater.or(Less), Greater);
53+
assert_eq!(Greater.or(Equal), Greater);
54+
assert_eq!(Greater.or(Greater), Greater);
55+
}
56+
57+
#[test]
58+
fn test_ordering_or_else() {
59+
assert_eq!(Equal.or_else(|| Less), Less);
60+
assert_eq!(Equal.or_else(|| Equal), Equal);
61+
assert_eq!(Equal.or_else(|| Greater), Greater);
62+
assert_eq!(Less.or_else(|| Less), Less);
63+
assert_eq!(Less.or_else(|| Equal), Less);
64+
assert_eq!(Less.or_else(|| Greater), Less);
65+
assert_eq!(Greater.or_else(|| Less), Greater);
66+
assert_eq!(Greater.or_else(|| Equal), Greater);
67+
assert_eq!(Greater.or_else(|| Greater), Greater);
68+
}
69+
4470
#[test]
4571
fn test_user_defined_eq() {
4672
// Our type.

src/libcoretest/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#![feature(unique)]
3535
#![feature(iter_max_by)]
3636
#![feature(iter_min_by)]
37+
#![feature(ordering_chaining)]
3738

3839
extern crate core;
3940
extern crate test;

0 commit comments

Comments
 (0)