-module(gmhc_counters). -export([ initialize/0 ]). -export([ add/1 , add/2 , add_read/1 , add_read/2 , get_value/1 , values/0 ]). counters() -> #{ connector => 1 }. initialize() -> Counters = counters(), Size = map_size(Counters), CRef = counters:new(Size, []), put_counters(#{ref => CRef, counters => Counters}). add(Counter) -> add(Counter, 1). add(Counter, Incr) when is_integer(Incr), Incr >= 0 -> {CRef, Ix} = counter_ix(Counter), counters:add(CRef, Ix, Incr). add_read(Counter) -> add_read(Counter, 1). add_read(Counter, Incr) when is_integer(Incr), Incr >= 0 -> {CRef, Ix} = counter_ix(Counter), counters:add(CRef, Ix, Incr), counters:get(CRef, Ix). get_value(Counter) -> {CRef, Ix} = counter_ix(Counter), counters:get(CRef, Ix). values() -> #{ref := CRef, counters := Counters} = get_counters(), maps:map(fun(_,Ix) -> counters:get(CRef, Ix) end, Counters). counter_ix(Counter) -> #{ref := CRef, counters := #{Counter := Ix}} = get_counters(), {CRef, Ix}. put_counters(C) -> persistent_term:put(?MODULE, C). get_counters() -> persistent_term:get(?MODULE).