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