#![allow(private_bounds)]
use crate::{
bound_util::{RefRead, RefWrite},
local_socket::Name,
Sealed,
};
use std::io::{self, prelude::*};
pub trait Stream: Read + RefRead + Write + RefWrite + Send + Sync + Sized + Sealed {
type RecvHalf: RecvHalf<Stream = Self>;
type SendHalf: SendHalf<Stream = Self>;
fn connect(name: Name<'_>) -> io::Result<Self>;
fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()>;
fn split(self) -> (Self::RecvHalf, Self::SendHalf);
fn reunite(rh: Self::RecvHalf, sh: Self::SendHalf) -> ReuniteResult<Self>;
}
pub trait RecvHalf: Sized + Read + RefRead + Sealed {
type Stream: Stream;
}
pub trait SendHalf: Sized + Write + RefWrite + Sealed {
type Stream: Stream;
}
pub type ReuniteResult<S> =
crate::error::ReuniteResult<S, <S as Stream>::RecvHalf, <S as Stream>::SendHalf>;