
-module(mapfun).
-export([map/2,compute/3]).






collectRes([]) -> [];

collectRes([ID|IDs]) -> receive

                           {ID,Res} -> [Res|collectRes(IDs)]

                        end.




map(_,[]) -> [];

map(F,List) ->
         ComputingActors = [spawn(mapfun,compute,[F,X,self()]) || X <- List ], %Just for readability. We can directily put the list as argument of collectRes
         collectRes(ComputingActors).                             



compute(F,X,Collector) -> Res = F(X),
 
                          Collector!{self(),Res}.




%% esempio di applicazione: 

%% c(mapfun).

%% Pippo = fun(X) -> (X*6) end.

%% mapfun:map(Pippo,[1,2,3,4].

%% [6,12,18,24]


