use anyhow::Error;
use futures::future;
use futures::future::FutureExt;
use futures::future::Shared;
use futures::future::TryFuture;
use futures::future::TryFutureExt;
use shared_error::anyhow::IntoSharedError;
use shared_error::anyhow::SharedError;
pub type TryShared<Fut> = Shared<future::MapErr<Fut, NewSharedError>>;
type NewSharedError = fn(Error) -> SharedError;
pub(crate) fn try_shared<Fut>(fut: Fut) -> TryShared<Fut>
where
<Fut as TryFuture>::Ok: Clone,
Fut: TryFuture<Error = Error> + Sized,
{
fut.map_err(IntoSharedError::<SharedError>::shared_error as NewSharedError)
.shared()
}