diff --git a/embedded-io-async/src/lib.rs b/embedded-io-async/src/lib.rs index b90935f2..573c41e7 100644 --- a/embedded-io-async/src/lib.rs +++ b/embedded-io-async/src/lib.rs @@ -167,3 +167,20 @@ pub trait Seek: ErrorType { self.seek(SeekFrom::Current(0)).await } } + +/// Split a stream in a reader and writer, which are independent +pub trait SplitRW: ErrorType { + /// Reader type of the split stream + type Reader<'a>: Read + where + Self: 'a; + + /// Writer type of the split stream + type Writer<'a>: Write + where + Self: 'a; + + /// Split a stream in a independent reader and writer + /// The stream is mutably borrowed, until the reader and writer are dropped. + fn split_rw<'s>(&'s mut self) -> Result<(Self::Reader<'s>, Self::Writer<'s>), Self::Error>; +} diff --git a/embedded-io/src/lib.rs b/embedded-io/src/lib.rs index daca2441..af46323a 100644 --- a/embedded-io/src/lib.rs +++ b/embedded-io/src/lib.rs @@ -566,3 +566,20 @@ pub trait WriteReady: ErrorType { /// If this returns `true`, it's guaranteed that the next call to [`Write::write`] will not block. fn write_ready(&mut self) -> Result; } + +/// Split a stream in a reader and writer, which are independent +pub trait SplitRW: ErrorType { + /// Reader type of the split stream + type Reader<'a>: Read + where + Self: 'a; + + /// Writer type of the split stream + type Writer<'a>: Write + where + Self: 'a; + + /// Split a stream in a independent reader and writer + /// The stream is mutably borrowed, until the reader and writer are dropped. + fn split_rw<'s>(&'s mut self) -> Result<(Self::Reader<'s>, Self::Writer<'s>), Self::Error>; +}