|
57 | 57 | %% A set of keys, mapping each key to a unique index. |
58 | 58 | -record(keyset, { |
59 | 59 | rev_keys = [] :: list(binary()), %% list of known keys in reverse order |
60 | | - key_to_index = maps:new() :: map() %% maps each known key to a 0-based index |
| 60 | + rev_keys_length = 0 :: non_neg_integer(), %% length of the rev_keys list |
| 61 | + key_to_index = maps:new() :: map() %% maps each known key to a 0-based index |
61 | 62 | }). |
62 | 63 |
|
63 | 64 | %% Internal state of a record aggregator. It stores an aggregated record that |
@@ -278,23 +279,23 @@ is_key(Key, #keyset{key_to_index = KeyToIndex} = _KeySet) -> |
278 | 279 |
|
279 | 280 | get_or_add_key(undefined, KeySet) -> |
280 | 281 | {undefined, KeySet}; |
281 | | -get_or_add_key(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = KeySet) -> |
| 282 | +get_or_add_key(Key, #keyset{rev_keys = RevKeys, rev_keys_length = Length, key_to_index = KeyToIndex} = KeySet) -> |
282 | 283 | case maps:get(Key, KeyToIndex, not_found) of |
283 | 284 | not_found -> |
284 | | - Index = length(RevKeys), |
285 | 285 | NewKeySet = KeySet#keyset{ |
286 | 286 | rev_keys = [Key | RevKeys], |
287 | | - key_to_index = maps:put(Key, Index, KeyToIndex) |
| 287 | + rev_keys_length = Length + 1, |
| 288 | + key_to_index = maps:put(Key, Length, KeyToIndex) |
288 | 289 | }, |
289 | | - {Index, NewKeySet}; |
| 290 | + {Length, NewKeySet}; |
290 | 291 | Index -> |
291 | 292 | {Index, KeySet} |
292 | 293 | end. |
293 | 294 |
|
294 | 295 |
|
295 | | -potential_index(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = _KeySet) -> |
| 296 | +potential_index(Key, #keyset{rev_keys_length = Length, key_to_index = KeyToIndex} = _KeySet) -> |
296 | 297 | case maps:get(Key, KeyToIndex, not_found) of |
297 | | - not_found -> length(RevKeys); |
| 298 | + not_found -> Length; |
298 | 299 | Index -> Index |
299 | 300 | end. |
300 | 301 |
|
|
0 commit comments