diff --git a/src/gmser_dyn.erl b/src/gmser_dyn.erl index a39843c..1acb533 100644 --- a/src/gmser_dyn.erl +++ b/src/gmser_dyn.erl @@ -13,12 +13,15 @@ , decode_typed/3 %% (Type, RLP, Types) -> Term , decode_typed/4 ]). %% (Type, RLP, Vsn, Types) -> Term --export([ serialize/1 - , serialize/2 - , serialize_typed/2 - , serialize_typed/3 - , deserialize/1 - , deserialize/2 ]). +-export([ serialize/1 %% (Term) -> Bin + , serialize/2 %% (Term, Types) -> Bin + , serialize/3 %% (Term, Vsn, Types) -> Bin + , serialize_typed/2 %% (Type, Term) -> Bin + , serialize_typed/3 %% (Type, Term, Types) -> Bin + , serialize_typed/4 %% (Type, Term, Vsn, Types) -> Bin + , deserialize/1 %% (Bin) -> Term + , deserialize/2 %% (Bin, Types) -> Term + , deserialize/3 ]). %% (Bin, Vsn, Types) -> Term %% register a type schema, inspect existing schema -export([ register_types/1 diff --git a/src/gmser_dyn_types.erl b/src/gmser_dyn_types.erl index cec7a30..6117d6d 100644 --- a/src/gmser_dyn_types.erl +++ b/src/gmser_dyn_types.erl @@ -1,6 +1,8 @@ -module(gmser_dyn_types). --export([ from_list/2 ]). +-export([ add_type/4 + , from_list/2 + , expand/1 ]). -export([ next_code/1 ]). next_code(#{codes := Codes}) -> @@ -12,6 +14,18 @@ add_type(Tag, Code, Template, Types) -> from_list(L, Types) -> lists:foldl(fun elem_to_type/2, Types, L). +expand(#{vsn := V, templates := Templates0} = Types) -> + Templates = + maps:map( + fun(_, F) when is_function(F, 0) -> + F(); + (_, F) when is_function(F, 1) -> + F(V); + (_, T) -> + T + end, Templates0), + Types#{templates := Templates}. + elem_to_type({Tag, Code, Template}, Acc) when is_atom(Tag), is_integer(Code) -> #{codes := Codes, rev := Rev, templates := Temps} = Acc, case {is_map_key(Tag, Rev), is_map_key(Code, Codes)} of