Update the README.md file with your solutions. Don't forget to list the group members's SCIPER numbers.
# Problem 1: Implementing map and filter on Futures
In this exercise, you will come up with an implementation of the `map` and `filter` methods of Futures. First of all, spend some time as a group to make sure that you understand what those methods are supposed to do. Then, complete the following code to implement the two methods:
```scala
traitFuture[T]{self=>
defmap[S](f:T=>S):Future[S]=
newFuture[S]{
defonComplete(callback:Try[S]=>Unit):Unit=???
}
deffilter(f:T=>Boolean):Future[T]=
newFuture[T]{
defonComplete(callback:Try[T]=>Unit):Unit=???
}
}
```
In the case of `filter`, if the original `Future` successfully returns a value which does not satisfy the predicate, the new `Future` should return a `Failure` containing a `NoSuchElementException`.
# Problem 2: Coordinator / Worker
In this exercise, you will have to implement a Coordinator / Worker actor system, in which one actor, the coordinator, dispatches work to other actors, the workers. Between the coordinator and the workers, only two kinds of messages are sent: `Request` and `Ready` messages.
```scala
caseclassRequest(computation:=>Unit)
caseobjectReady
```
The coordinator actor sends `Request` messages to workers to request them to perform some computation (passed as an argument of `Request`). Upon reception of a `Request`, a worker should perform the computation. Workers should send a `Ready` message to their coordinator whenever they finish executing the requested computation, and also right after they are created.
The coordinator actor itself receives requests through `Request` messages from clients. The coordinator actor should then dispatch the work to worker actors. The coordinator should however never send a request to a worker which has not declared itself ready via a `Ready` message beforehand.
Implement the `Coordinator` and `Worker` classes.
```scala
classCoordinatorextendsActor{
???
overridedefreceive=???
}
classWorker(coordinator:Coordinator)extendsActor{
???
overridedefreceive=???
}
```
An example system using the Coordinator and Worker actors is shown below.