#![deny(missing_docs, rustdoc::broken_intra_doc_links)]
#![cfg_attr(not(test), deny(clippy::unwrap_used))]
#![cfg_attr(n0_future_docsrs, feature(doc_auto_cfg))]
mod maybe_future;
pub mod task;
pub mod time;
pub use futures_buffered::*;
pub use futures_lite::{io, pin, ready, stream, Future, FutureExt, Stream, StreamExt};
pub use futures_util::{future::Either, Sink, SinkExt, TryFutureExt, TryStreamExt};
pub use maybe_future::MaybeFuture;
pub mod split {
pub use futures_util::stream::{SplitSink, SplitStream};
use crate::{Sink, Stream};
pub fn split<S, SinkItem>(stream_sink: S) -> (SplitSink<S, SinkItem>, SplitStream<S>)
where
S: Stream + Sized + Sink<SinkItem>,
{
use futures_util::stream::StreamExt as _;
stream_sink.split()
}
}
pub mod boxed {
#[cfg(not(wasm_browser))]
pub use futures_lite::future::Boxed as BoxFuture;
#[cfg(wasm_browser)]
pub use futures_lite::future::BoxedLocal as BoxFuture;
#[cfg(not(wasm_browser))]
pub use futures_lite::stream::Boxed as BoxStream;
#[cfg(wasm_browser)]
pub use futures_lite::stream::BoxedLocal as BoxStream;
}
pub mod future {
use std::task::Poll;
pub use futures_lite::future::*;
use super::pin;
pub fn now_or_never<T, F: Future<Output = T>>(fut: F) -> Option<T> {
pin!(fut);
let waker = std::task::Waker::noop();
let mut cx = std::task::Context::from_waker(waker);
match fut.poll(&mut cx) {
Poll::Ready(res) => Some(res),
Poll::Pending => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_now_or_never_smoke() {
let fut = std::future::ready(0);
assert_eq!(now_or_never(fut), Some(0));
let fut = std::future::pending::<isize>();
assert_eq!(now_or_never(fut), None);
}
}
}