1-module(keydel).
2
3-export([store/3]).
4
5-record(att, {f}).
6
7-type attachment() :: list().
8
9-opaque att() :: #att{} | attachment().
10
11-spec store(atom(), any(), att()) -> att().
12store(Field, undefined, Att) when is_list(Att) ->
13    lists:keydelete(Field, 1, Att);
14store(Field, Value, Att) when is_list(Att) ->
15    lists:keystore(Field, 1, Att, {Field, Value});
16store(Field, Value, Att) ->
17    store(Field, Value, upgrade(Att)).
18
19
20-spec upgrade(#att{}) -> attachment().
21upgrade(#att{} = Att) ->
22    Map = lists:zip(
23            record_info(fields, att),
24            lists:seq(2, record_info(size, att))
25           ),
26    %% Don't store undefined elements since that is default
27    [{F, element(I, Att)} || {F, I} <- Map, element(I, Att) /= undefined];
28upgrade(Att) ->
29    Att.
30