-module(bitfield). -export([pack/2]). -export([unpack/2]). -spec pack(list(), list()) -> binary(). pack(Enabled, Enum) when is_list(Enabled) andalso is_list(Enum) -> pack(gb_sets:from_list(Enabled), Enum, <<>>). pack(_, [], Acc) -> fill(Acc); pack(Enabled, [Field|Enum], Acc) -> Acc2 = case gb_sets:is_member(Field, Enabled) of true -> <>; _ -> <> end, pack(Enabled, Enum, Acc2). -spec unpack(binary(), list()) -> list(). unpack(Packed, Enum) when is_binary(Packed) andalso is_list(Enum) -> unpack(Packed, Enum, []). unpack(_, [], Acc) -> lists:reverse(Acc); unpack(<<>>, _, Acc) -> lists:reverse(Acc); unpack(<<1:1/little-unsigned, Packed/bitstring>>, [Field|Enum], Acc) -> unpack(Packed, Enum, [Field|Acc]); unpack(<<0:1/little-unsigned, Packed/bitstring>>, [_|Enum], Acc) -> unpack(Packed, Enum, Acc). fill(Bitstring) -> Len = 8 - bit_size(Bitstring) rem 8, <>.