pub trait EnvIO {
type Out;
// Required method
fn run(self) -> Self::Out;
// Provided method
fn flat_map<OutEnv, F>(self, f: F) -> FlatMap<Self, F>
where Self: Sized,
OutEnv: EnvIO,
F: Fn(Self::Out) -> OutEnv { ... }
}