#![allow(dead_code)] use futures::prelude::*; use libp2p_core::muxing::StreamMuxer; pub struct CloseMuxer { state: CloseMuxerState, } impl CloseMuxer { pub fn new(m: M) -> CloseMuxer { CloseMuxer { state: CloseMuxerState::Close(m) } } } pub enum CloseMuxerState { Close(M), Done, } impl Future for CloseMuxer where M: StreamMuxer, M::Error: From { type Item = M; type Error = M::Error; fn poll(&mut self) -> Poll { loop { match std::mem::replace(&mut self.state, CloseMuxerState::Done) { CloseMuxerState::Close(muxer) => { if muxer.close()?.is_not_ready() { self.state = CloseMuxerState::Close(muxer); return Ok(Async::NotReady) } return Ok(Async::Ready(muxer)) } CloseMuxerState::Done => panic!() } } } }