anchor.diff:  %% Joins pforeach processes.
   %% @end
   %%--------------------------------------------------------------------
  --spec pforeach_gather(N :: non_neg_integer(), Ref :: reference()) -> ok.
  -pforeach_gather(0, _Ref) -> ok;
  -pforeach_gather(N, Ref) ->
  +-spec pforeach_gather([pid()], Ref :: reference()) -> ok | error.
  +pforeach_gather([], _Ref) -> ok;
  +pforeach_gather(Pids, Ref) ->
       receive
  -        Ref -> pforeach_gather(N - 1, Ref)
  -    end.
  -
  +        {Ref, Pid} -> pforeach_gather(Pids -- [Pid], Ref)
  +    after
  +        ?TIMEOUT ->
  +            IsAnyAlive = lists:foldl(fun
  +                (_, true) ->
  +                    true;
  +                (Pid, _Acc) ->
  +                    erlang:is_process_alive(Pid)
  +            end, false, Pids),
  +            case IsAnyAlive of
  +                true ->
  +                    pforeach_gather(Pids, Ref);
  +                false ->
  +                    error
  +            end
  +    end.
  +
  
positive.code: %% A  parallel version of lists:map/2. See {@link lists:map/2}
  %% @end
  %%--------------------------------------------------------------------
  -spec pmap(Fun :: fun((X :: A) -> B), L :: [A]) -> [B].
  pmap(Fun, L) ->
      Self = self(),
      Ref = erlang:make_ref(),
  
negative.code: %% Runs a function on X and signals parent that it's done.
  %% @end
  %%--------------------------------------------------------------------
  -spec pforeach_f(Parent :: pid(), Ref :: reference(),
      Fun :: fun((E :: A) -> any()), X :: A) -> {reference(),pid()}.
  pforeach_f(Parent, Ref, Fun, X) -> catch Fun(X), Parent ! {Ref, self()}.
  
  %%--------------------------------------------------------------------
  %% @private
  