¿Cómo devuelvo condicionalmente diferentes tipos de futuros?

Tengo un método que, dependiendo de un predicado, devolverá un futuro u otro. En otras palabras, una expresión if-else que devuelve un futuro:

extern crate futures; // 0.1.23

use futures::{future, Future};

fn f() -> impl Future<Item = usize, Error = ()> {
    if 1 > 0 {
        future::ok(2).map(|x| x)
    } else {
        future::ok(10).and_then(|x| future::ok(x + 2))
    }
}

Esto no compila:

error[E0308]: if and else have incompatible types
  --> src/lib.rs:6:5
   |
6  | /     if 1 > 0 {
7  | |         future::ok(2).map(|x| x)
8  | |     } else {
9  | |         future::ok(10).and_then(|x| future::ok(x + 2))
10 | |     }
   | |_____^ expected struct `futures::Map`, found struct `futures::AndThen`
   |
   = note: expected type `futures::Map<futures::FutureResult<{integer}, _>, [closure@src/lib.rs:7:27: 7:32]>`
              found type `futures::AndThen<futures::FutureResult<{integer}, _>, futures::FutureResult<{integer}, _>, [closure@src/lib.rs:9:33: 9:54]>`

Los futuros se crean de manera diferente y pueden tener cierres, por lo que sus tipos no son iguales. Idealmente, la solución no usaríaBoxes, ya que el resto de mi lógica asíncrona no los usa.

¿Cómo se hace normalmente la lógica if-else en futuros?

Respuestas a la pregunta(1)

Su respuesta a la pregunta