anchor.diff:      safe_sum(Vs, Acc + Value).
   
   
  +safe_length(Vs) ->
  +    safe_length(Vs, 0).
  +
  +safe_length([], Len) -> Len;
  +safe_length([null | Xs], Len) ->
  +    safe_length(Xs, Len);
  +safe_length([{_TS, null} | Xs], Len) ->
  +    safe_length(Xs, Len);
  +safe_length([_ | Xs], Len) ->
  +    safe_length(Xs, Len + 1).
  +
  +
   safe_multiply([]) -> null;
   safe_multiply([{_TS, V} | Vs]) ->
       safe_multiply(Vs, V);
  
positive.code:                               % there is no metrics handler already meaning
                                % there is nothing cached to be merged
                                % -> just read from fs directly instead
                                File = statser_metric_handler:get_whisper_file(Path),
                                Result = statser_whisper:fetch(File, From, Until, Now),
                                Result#series{target=Path};
  
negative.code:             Sorted = lists:sort(fun({SigmaA, _}, {SigmaB, _}) -> SigmaA > SigmaB end, SigmaSeries),
              lists:map(fun({_Sigma, S}) -> S end, lists:sublist(Sorted, N))
      end;
  
  % movingAverage
  evaluate_call(<<"movingAverage">>, [Series, Window], _From, _Until, _Now) when is_binary(Window) ->
      Offset = statser_util:parse_unit(Window),
      % TODO: fetch new data with `Offset` set back
      lists:map(fun(S) ->
                        WindowPoints = Offset / S#series.step,
                        S
                end, Series);
  
  % multiplySeries
  evaluate_call(<<"multiplySeries">>, Series, _From, _Until, _Now) ->
  