uw-switch-semantics #53

Merged
uwiger merged 4 commits from uw-switch-semantics into master 2025-04-29 03:57:17 +09:00
2 changed files with 24 additions and 7 deletions
Showing only changes of commit f996253e6b - Show all commits

View File

@ -13,12 +13,15 @@
, decode_typed/3 %% (Type, RLP, Types) -> Term , decode_typed/3 %% (Type, RLP, Types) -> Term
, decode_typed/4 ]). %% (Type, RLP, Vsn, Types) -> Term , decode_typed/4 ]). %% (Type, RLP, Vsn, Types) -> Term
-export([ serialize/1 -export([ serialize/1 %% (Term) -> Bin
, serialize/2 , serialize/2 %% (Term, Types) -> Bin
, serialize_typed/2 , serialize/3 %% (Term, Vsn, Types) -> Bin
, serialize_typed/3 , serialize_typed/2 %% (Type, Term) -> Bin
, deserialize/1 , serialize_typed/3 %% (Type, Term, Types) -> Bin
, deserialize/2 ]). , 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 %% register a type schema, inspect existing schema
-export([ register_types/1 -export([ register_types/1

View File

@ -1,6 +1,8 @@
-module(gmser_dyn_types). -module(gmser_dyn_types).
-export([ from_list/2 ]). -export([ add_type/4
, from_list/2
, expand/1 ]).
-export([ next_code/1 ]). -export([ next_code/1 ]).
next_code(#{codes := Codes}) -> next_code(#{codes := Codes}) ->
@ -12,6 +14,18 @@ add_type(Tag, Code, Template, Types) ->
from_list(L, Types) -> from_list(L, Types) ->
lists:foldl(fun elem_to_type/2, Types, L). 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) -> elem_to_type({Tag, Code, Template}, Acc) when is_atom(Tag), is_integer(Code) ->
#{codes := Codes, rev := Rev, templates := Temps} = Acc, #{codes := Codes, rev := Rev, templates := Temps} = Acc,
case {is_map_key(Tag, Rev), is_map_key(Code, Codes)} of case {is_map_key(Tag, Rev), is_map_key(Code, Codes)} of