@@ -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).
0 commit comments