Como retorno condicionalmente diferentes tipos de futuros?

Eu tenho um método que, dependendo de um predicado, retornará um futuro ou outro. Em outras palavras, uma expressão if-else que retorna um 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))
    }
}

Isso não 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]>`

Os futuros são criados de maneira diferente e podem conter fechamentos, portanto, seus tipos não são iguais. Idealmente, a solução não usariaBoxes, já que o resto da minha lógica assíncrona não os usa.

Como é normalmente feita a lógica if-else nos futuros?

questionAnswers(1)

yourAnswerToTheQuestion