%%%
%%% Copyright 2011, Boundary
%%%
%%% Licensed under the Apache License, Version 2.0 (the "License");
%%% you may not use this file except in compliance with the License.
%%% You may obtain a copy of the License at
%%%
%%%     http://www.apache.org/licenses/LICENSE-2.0
%%%
%%% Unless required by applicable law or agreed to in writing, software
%%% distributed under the License is distributed on an "AS IS" BASIS,
%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%%% See the License for the specific language governing permissions and
%%% limitations under the License.
%%%


%%%-------------------------------------------------------------------
%%% File:      folsom_metrics_histogram.erl
%%% @author    joe williams <j@boundary.com>
%%% @doc
%%% @end
%%%------------------------------------------------------------------

-module(folsom_metrics_histogram).

-export([new/1,
         new/2,
         new/3,
         new/4,
         update/2,
         get_value/1,
         get_values/1
         ]).

-include("folsom.hrl").

new(Name) ->
    new(Name, uniform).

new(Name, SampleType) ->
    new(Name, SampleType, ?DEFAULT_SIZE).

new(Name, SampleType, SampleSize) ->
    Sample = folsom_sample:new(SampleType, SampleSize),
    Hist = #histogram{type = SampleType, sample = Sample},
    ets:insert(?HISTOGRAM_TABLE, {Name, Hist}).

new(Name, SampleType, SampleSize, Alpha) ->
    Sample = folsom_sample:new(SampleType, SampleSize, Alpha),
    Hist = #histogram{type = SampleType, sample = Sample},
    ets:insert(?HISTOGRAM_TABLE, {Name, Hist}).

update(Name, Value) ->
    Hist = get_value(Name),
    NewSample = folsom_sample:update(Hist#histogram.type, Hist#histogram.sample, Value),
    ets:insert(?HISTOGRAM_TABLE, {Name, Hist#histogram{sample = NewSample}}).

% gets the histogram record from ets
get_value(Name) ->
    [{_, Value}] = ets:lookup(?HISTOGRAM_TABLE, Name),
    Value.

% pulls the sample out of the record gotten from ets
get_values(Name) ->
    Hist = get_value(Name),
    folsom_sample:get_values(Hist#histogram.type, Hist#histogram.sample).
