Skip to content

Commit

Permalink
std::ops::Try impl for std::task::Poll
Browse files Browse the repository at this point in the history
  • Loading branch information
cramertj committed Jul 26, 2018
1 parent fefe816 commit bce8a91
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
54 changes: 54 additions & 0 deletions src/libcore/task/poll.rs
Expand Up @@ -12,6 +12,9 @@
reason = "futures in libcore are unstable",
issue = "50547")]

use ops::Try;
use result::Result;

/// Indicates whether a value is available or if the current task has been
/// scheduled to receive a wakeup instead.
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
Expand Down Expand Up @@ -39,6 +42,7 @@ impl<T> Poll<T> {
}

/// Returns whether this is `Poll::Ready`
#[inline]
pub fn is_ready(&self) -> bool {
match *self {
Poll::Ready(_) => true,
Expand All @@ -47,6 +51,7 @@ impl<T> Poll<T> {
}

/// Returns whether this is `Poll::Pending`
#[inline]
pub fn is_pending(&self) -> bool {
!self.is_ready()
}
Expand Down Expand Up @@ -81,3 +86,52 @@ impl<T> From<T> for Poll<T> {
Poll::Ready(t)
}
}

impl<T, E> Try for Poll<Result<T, E>> {
type Ok = Poll<T>;
type Error = E;

#[inline]
fn into_result(self) -> Result<Self::Ok, Self::Error> {
match self {
Poll::Ready(Ok(x)) => Ok(Poll::Ready(x)),
Poll::Ready(Err(e)) => Err(e),
Poll::Pending => Ok(Poll::Pending),
}
}

#[inline]
fn from_error(e: Self::Error) -> Self {
Poll::Ready(Err(e))
}

#[inline]
fn from_ok(x: Self::Ok) -> Self {
x.map(Ok)
}
}

impl<T, E> Try for Poll<Option<Result<T, E>>> {
type Ok = Poll<Option<T>>;
type Error = E;

#[inline]
fn into_result(self) -> Result<Self::Ok, Self::Error> {
match self {
Poll::Ready(Some(Ok(x))) => Ok(Poll::Ready(Some(x))),
Poll::Ready(Some(Err(e))) => Err(e),
Poll::Ready(None) => Ok(Poll::Ready(None)),
Poll::Pending => Ok(Poll::Pending),
}
}

#[inline]
fn from_error(e: Self::Error) -> Self {
Poll::Ready(Some(Err(e)))
}

#[inline]
fn from_ok(x: Self::Ok) -> Self {
x.map(|x| x.map(Ok))
}
}
61 changes: 61 additions & 0 deletions src/test/ui/try-poll.rs
@@ -0,0 +1,61 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-pass

#![allow(dead_code, unused)]
#![feature(futures_api)]

use std::task::Poll;

struct K;
struct E;

fn as_result() -> Result<(), E> {
// From Result
let K = Ok::<K, E>(K)?;

// From Poll<Result>
let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?;

// From Poll<Option<Result>>
let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?;

Ok(())
}

fn as_poll_result() -> Poll<Result<(), E>> {
// From Result
let K = Ok::<K, E>(K)?;

// From Poll<Result>
let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?;

// From Poll<Option<Result>>
let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?;

Poll::Ready(Ok(()))
}

fn as_poll_option_result() -> Poll<Option<Result<(), E>>> {
// From Result
let K = Ok::<K, E>(K)?;

// From Poll<Result>
let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?;

// From Poll<Option<Result>>
let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?;

Poll::Ready(Some(Ok(())))
}

fn main() {
}

0 comments on commit bce8a91

Please sign in to comment.