#![allow(private_bounds)]
use crate::{
bound_util::{RefTokioAsyncRead, RefTokioAsyncWrite},
local_socket::Name,
Sealed,
};
use std::{future::Future, io};
use tokio::io::{AsyncRead, AsyncWrite};
pub trait Stream:
AsyncRead + RefTokioAsyncRead + AsyncWrite + RefTokioAsyncWrite + Send + Sync + Sized + Sealed
{
type RecvHalf: RecvHalf<Stream = Self>;
type SendHalf: SendHalf<Stream = Self>;
fn connect(name: Name<'_>) -> impl Future<Output = io::Result<Self>> + Send + Sync;
fn split(self) -> (Self::RecvHalf, Self::SendHalf);
fn reunite(rh: Self::RecvHalf, sh: Self::SendHalf) -> ReuniteResult<Self>;
}
pub trait RecvHalf: Sized + AsyncRead + RefTokioAsyncRead + Sealed {
type Stream: Stream;
}
pub trait SendHalf: Sized + AsyncWrite + RefTokioAsyncWrite + Sealed {
type Stream: Stream;
}
pub type ReuniteResult<S> =
crate::error::ReuniteResult<S, <S as Stream>::RecvHalf, <S as Stream>::SendHalf>;