anchor.diff:      % TODO: asynchronous fetching would be really nice
       lists:map(fun (Path) ->
                         % get metrics handler
  -                      case ets:lookup(metrics, Paths) of
  +                      case ets:lookup(metrics, Path) of
                             [] ->
                                 % there is no metrics handler already meaning
                                 % there is nothing cached to be merged
  
positive.code:     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
  
negative.code: safe_tail(Rem, [_ | Xs]) -> safe_tail(Rem - 1, Xs).
  
  
  safe_avg(_Sum, Len) when Len =< 0 -> 0;
  safe_avg(Sum, Len) -> Sum / Len.
  
  
  moving_average([], _Window) -> [];
  moving_average(Values, Window) when Window =< 0 -> Values;
  moving_average(Values, Window) ->
      FirstPart = lists:sublist(Values, Window),
      FirstLen = safe_length(FirstPart),
      FirstSum = safe_sum(FirstPart),
      FirstAvg = safe_avg(FirstSum, FirstLen),
      Rest = safe_tail(Window, Values),
      lists:reverse(moving_average(Rest, Values, FirstSum, FirstLen, [FirstAvg])).
  
  