Suppose I need to run two concurrent computations, wait for both of them, and then combine their results. More specifically, I need to run `f1: X1 => Y1` and `f2: X2 => Y2` concurrently and then call `f: (Y1, Y2) => Y` to finally get a value of `Y`.

I can create *future computations* `fut1: X1 => Future[Y1]` and `fut2: X2 => Future[Y2]` and then compose them to get `fut: (X1, X2) => Future[Y]` using monadic composition.

The problem is that monadic composition implies *sequential wait*. In our case it implies that we wait for one future first *and then* we will wait for another. For instance. if it takes 2 sec. to the first future to complete and just 1 sec. to the 2nd future to fail we waste 1 sec.

Thus it looks like we need an *applicative* composition of the futures to wait till *either* both complete or at least one future fails. Does it make sense ? How would you implement `<*>` for futures ?