1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/**************************************************************************************************
 *                                                                                                *
 * This Source Code Form is subject to the terms of the Mozilla Public                            *
 * License, v. 2.0. If a copy of the MPL was not distributed with this                            *
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.                                       *
 *                                                                                                *
 **************************************************************************************************/

// ======================================== Configuration ======================================= \\

#![no_std]

// ======================================== Documentation ======================================= \\

//! Deprecated in favor of [`futures-micro`](https://github.com/irrustible/futures-micro) and
//! [`futures-lite`](https://github.com/stjepang/futures-lite).

// =========================================== Imports ========================================== \\

use core::future::Future;
use core::pin::Pin;
use core::task::{Context, Poll};
use pin_project_lite::pin_project;

// ============================================ Types =========================================== \\

pin_project! {
    #[derive(Debug)]
    #[deprecated(since = "1.2.0", note = "please use `futures-micro` or `futures-lite` instead")]
    /// Deprecated in favor of [`futures-micro`](https://github.com/irrustible/futures-micro) and
    /// [`futures-lite`](https://github.com/stjepang/futures-lite).
    pub struct Race<Left, Right>
    where
        Left: Future,
        Right: Future<Output = Left::Output>,
    {
        #[pin]
        left: Left,
        #[pin]
        right: Right,
    }
}

// ========================================= Interfaces ========================================= \\

#[deprecated(since = "1.2.0", note = "please use `futures-micro` or `futures-lite` instead")]
/// Deprecated in favor of [`futures-micro`](https://github.com/irrustible/futures-micro) and
/// [`futures-lite`](https://github.com/stjepang/futures-lite).
pub trait RaceExt: Future {
    #[deprecated(since = "1.2.0", note = "please use `futures-micro` or `futures-lite` instead")]
    /// Deprecated in favor of [`futures-micro`](https://github.com/irrustible/futures-micro) and
    /// [`futures-lite`](https://github.com/stjepang/futures-lite).
    fn race<With>(self, with: With) -> Race<Self, With>
    where
        Self: Sized,
        With: Future<Output = Self::Output>,
    {
        Race {
            left: self,
            right: with,
        }
    }
}

impl<Fut: Future> RaceExt for Fut {}

// ========================================= impl Future ======================================== \\

impl<Left, Right> Future for Race<Left, Right>
where
    Left: Future,
    Right: Future<Output = Left::Output>,
{
    type Output = Left::Output;

    fn poll(self: Pin<&mut Self>, ctx: &mut Context) -> Poll<Self::Output> {
        let this = self.project();

        if let poll @ Poll::Ready(_) = this.left.poll(ctx) {
            return poll;
        }

        if let poll @ Poll::Ready(_) = this.right.poll(ctx) {
            return poll;
        }

        Poll::Pending
    }
}