@@ -245,6 +245,76 @@ impl Ordering {
245
245
Greater => Less ,
246
246
}
247
247
}
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
+ }
248
318
}
249
319
250
320
/// Trait for types that form a [total order](https://en.wikipedia.org/wiki/Total_order).
0 commit comments