Packages

A platform agnostic Elm-like framework (soft-fork of Lustre)

Current section

Files

Jump to
agnostic src agnostic@vdom@cache.erl
Raw

src/agnostic@vdom@cache.erl

-module(agnostic@vdom@cache).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/agnostic/vdom/cache.gleam").
-export([compose_mapper/2, new_events/0, new/0, add_children/5, add_child/5, from_node/1, tick/1, events/1, update_events/2, memos/1, get_old_memo/3, keep_memo/3, add_memo/3, get_subtree/3, update_subtree/4, add_event/4, remove_event/3, remove_child/5, replace_child/6, decode/4, dispatch/2, handle/4, has_dispatched_events/2]).
-export_type([cache/1, events/1, child/1, added_children/1, decoded_event/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-opaque cache(JLN) :: {cache,
events(JLN),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JLN)), agnostic@vdom@vnode:element(JLN)),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JLN)), agnostic@vdom@vnode:element(JLN)),
list(binary()),
list(binary())}.
-opaque events(JLO) :: {events,
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JLO))),
agnostic@internals@mutable_map:mutable_map(binary(), child(JLO))}.
-type child(JLP) :: {child,
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_()),
events(JLP)}.
-type added_children(JLQ) :: {added_children,
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JLQ))),
agnostic@internals@mutable_map:mutable_map(binary(), child(JLQ)),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JLQ)), agnostic@vdom@vnode:element(JLQ))}.
-opaque decoded_event(JLR) :: {decoded_event,
binary(),
agnostic@vdom@vattr:handler(JLR)} |
{dispatched_event, binary()}.
-file("src/agnostic/vdom/cache.gleam", 64).
-spec compose_mapper(
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_()),
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_())
) -> fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_()).
compose_mapper(Mapper, Child_mapper) ->
fun(Message) -> Mapper(Child_mapper(Message)) end.
-file("src/agnostic/vdom/cache.gleam", 82).
-spec new_events() -> events(any()).
new_events() ->
{events, maps:new(), maps:new()}.
-file("src/agnostic/vdom/cache.gleam", 72).
?DOC("\n").
-spec new() -> cache(any()).
new() ->
{cache, new_events(), maps:new(), maps:new(), [], []}.
-file("src/agnostic/vdom/cache.gleam", 226).
-spec do_add_event(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JNS))),
agnostic@vdom@path:path(),
binary(),
gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JNS))
) -> agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JNS))).
do_add_event(Handlers, Path, Name, Handler) ->
agnostic@internals@mutable_map:insert(
Handlers,
agnostic@vdom@path:event(Path, Name),
Handler
).
-file("src/agnostic/vdom/cache.gleam", 263).
-spec add_attributes(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JOV))),
agnostic@vdom@path:path(),
list(agnostic@vdom@vattr:attribute(JOV))
) -> agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JOV))).
add_attributes(Handlers, Path, Attributes) ->
gleam@list:fold(
Attributes,
Handlers,
fun(Events, Attribute) -> case Attribute of
{event, _, Name, Handler, _, _, _, _, _} ->
do_add_event(Events, Path, Name, Handler);
_ ->
Events
end end
).
-file("src/agnostic/vdom/cache.gleam", 299).
-spec do_add_children(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JPN))),
agnostic@internals@mutable_map:mutable_map(binary(), child(JPN)),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JPN)), agnostic@vdom@vnode:element(JPN)),
agnostic@vdom@path:path(),
integer(),
list(agnostic@vdom@vnode:element(JPN))
) -> added_children(JPN).
do_add_children(Handlers, Children, Vdoms, Parent, Child_index, Nodes) ->
Next = Child_index + 1,
case Nodes of
[] ->
{added_children, Handlers, Children, Vdoms};
[{element, _, Key, _, _, Attributes, Nodes@1, _} | Rest] ->
Path = agnostic@vdom@path:add(Parent, Child_index, Key),
Handlers@1 = add_attributes(Handlers, Path, Attributes),
{added_children, Handlers@2, Children@1, Vdoms@1} = do_add_children(
Handlers@1,
Children,
Vdoms,
Path,
0,
Nodes@1
),
do_add_children(Handlers@2, Children@1, Vdoms@1, Parent, Next, Rest);
[{fragment, _, Key@1, Nodes@2, _} | Rest@1] ->
Path@1 = agnostic@vdom@path:add(Parent, Child_index, Key@1),
{added_children, Handlers@3, Children@2, Vdoms@2} = do_add_children(
Handlers,
Children,
Vdoms,
Path@1,
0,
Nodes@2
),
do_add_children(
Handlers@3,
Children@2,
Vdoms@2,
Parent,
Next,
Rest@1
);
[{raw_container, _, Key@2, _, _, Attributes@1, _, _} | Rest@2] ->
Path@2 = agnostic@vdom@path:add(Parent, Child_index, Key@2),
Handlers@4 = add_attributes(Handlers, Path@2, Attributes@1),
do_add_children(Handlers@4, Children, Vdoms, Parent, Next, Rest@2);
[{raw_node, _, Key@3, _, _} | Rest@3] ->
_ = agnostic@vdom@path:add(Parent, Child_index, Key@3),
do_add_children(Handlers, Children, Vdoms, Parent, Next, Rest@3);
[{map, _, Key@4, Mapper, Child} | Rest@4] ->
Path@3 = agnostic@vdom@path:add(Parent, Child_index, Key@4),
Added = do_add_children(
maps:new(),
maps:new(),
Vdoms,
agnostic@vdom@path:subtree(Path@3),
0,
agnostic@internals@constants:singleton_list(Child)
),
Vdoms@3 = erlang:element(4, Added),
Child_events = {events,
erlang:element(2, Added),
erlang:element(3, Added)},
Child@1 = {child, Mapper, Child_events},
Children@3 = agnostic@internals@mutable_map:insert(
Children,
agnostic@vdom@path:child(Path@3),
Child@1
),
do_add_children(Handlers, Children@3, Vdoms@3, Parent, Next, Rest@4);
[{memo, _, _, _, View} | Rest@5] ->
Child_node = View(),
Vdoms@4 = agnostic@internals@mutable_map:insert(
Vdoms,
View,
Child_node
),
Next@1 = Child_index,
Rest@6 = [Child_node | Rest@5],
do_add_children(Handlers, Children, Vdoms@4, Parent, Next@1, Rest@6);
[{text, _, _, _} | Rest@7] ->
do_add_children(Handlers, Children, Vdoms, Parent, Next, Rest@7)
end.
-file("src/agnostic/vdom/cache.gleam", 285).
?DOC("\n").
-spec add_children(
cache(JPG),
events(JPG),
agnostic@vdom@path:path(),
integer(),
list(agnostic@vdom@vnode:element(JPG))
) -> {cache(JPG), events(JPG)}.
add_children(Cache, Events, Path, Child_index, Nodes) ->
Vdoms = erlang:element(3, Cache),
{events, Handlers, Children} = Events,
{added_children, Handlers@1, Children@1, Vdoms@1} = do_add_children(
Handlers,
Children,
Vdoms,
Path,
Child_index,
Nodes
),
{{cache,
erlang:element(2, Cache),
Vdoms@1,
erlang:element(4, Cache),
erlang:element(5, Cache),
erlang:element(6, Cache)},
{events, Handlers@1, Children@1}}.
-file("src/agnostic/vdom/cache.gleam", 252).
-spec add_child(
cache(JOP),
events(JOP),
agnostic@vdom@path:path(),
integer(),
agnostic@vdom@vnode:element(JOP)
) -> {cache(JOP), events(JOP)}.
add_child(Cache, Events, Parent, Index, Child) ->
Children = agnostic@internals@constants:singleton_list(Child),
add_children(Cache, Events, Parent, Index, Children).
-file("src/agnostic/vdom/cache.gleam", 86).
-spec from_node(agnostic@vdom@vnode:element(JLW)) -> cache(JLW).
from_node(Root) ->
Cache = new(),
{Cache@1, Events} = add_child(
Cache,
erlang:element(2, Cache),
root,
0,
Root
),
{cache,
Events,
erlang:element(3, Cache@1),
erlang:element(4, Cache@1),
erlang:element(5, Cache@1),
erlang:element(6, Cache@1)}.
-file("src/agnostic/vdom/cache.gleam", 92).
-spec tick(cache(JLZ)) -> cache(JLZ).
tick(Cache) ->
{cache,
erlang:element(2, Cache),
maps:new(),
erlang:element(3, Cache),
erlang:element(6, Cache),
[]}.
-file("src/agnostic/vdom/cache.gleam", 102).
-spec events(cache(JMC)) -> events(JMC).
events(Cache) ->
erlang:element(2, Cache).
-file("src/agnostic/vdom/cache.gleam", 106).
-spec update_events(cache(JMF), events(JMF)) -> cache(JMF).
update_events(Cache, Events) ->
{cache,
Events,
erlang:element(3, Cache),
erlang:element(4, Cache),
erlang:element(5, Cache),
erlang:element(6, Cache)}.
-file("src/agnostic/vdom/cache.gleam", 117).
?DOC(" Get a dictionary of all materialised Memo views.\n").
-spec memos(cache(JMJ)) -> agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JMJ)), agnostic@vdom@vnode:element(JMJ)).
memos(Cache) ->
erlang:element(3, Cache).
-file("src/agnostic/vdom/cache.gleam", 123).
?DOC("\n").
-spec get_old_memo(
cache(JMM),
fun(() -> agnostic@vdom@vnode:element(JMM)),
fun(() -> agnostic@vdom@vnode:element(JMM))
) -> agnostic@vdom@vnode:element(JMM).
get_old_memo(Cache, Old, New) ->
agnostic@internals@mutable_map:get_or_compute(
erlang:element(4, Cache),
Old,
New
).
-file("src/agnostic/vdom/cache.gleam", 153).
-spec propagate_nested_memos(
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JMW)), agnostic@vdom@vnode:element(JMW)),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JMW)), agnostic@vdom@vnode:element(JMW)),
agnostic@vdom@vnode:element(JMW)
) -> agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JMW)), agnostic@vdom@vnode:element(JMW)).
propagate_nested_memos(Vdoms, Old_vdoms, Node) ->
case Node of
{memo, _, _, _, View} ->
case agnostic@internals@mutable_map:has_key(Old_vdoms, View) of
true ->
Cached = agnostic@internals@mutable_map:unsafe_get(
Old_vdoms,
View
),
Vdoms@1 = agnostic@internals@mutable_map:insert(
Vdoms,
View,
Cached
),
propagate_nested_memos(Vdoms@1, Old_vdoms, Cached);
false ->
Vdoms
end;
{element, _, _, _, _, _, Children, _} ->
gleam@list:fold(
Children,
Vdoms,
fun(Vdoms@2, Child) ->
propagate_nested_memos(Vdoms@2, Old_vdoms, Child)
end
);
{fragment, _, _, Children, _} ->
gleam@list:fold(
Children,
Vdoms,
fun(Vdoms@2, Child) ->
propagate_nested_memos(Vdoms@2, Old_vdoms, Child)
end
);
{map, _, _, _, Child@1} ->
propagate_nested_memos(Vdoms, Old_vdoms, Child@1);
{text, _, _, _} ->
Vdoms;
{raw_container, _, _, _, _, _, _, _} ->
Vdoms;
{raw_node, _, _, _, _} ->
Vdoms
end.
-file("src/agnostic/vdom/cache.gleam", 142).
?DOC(
" Reuses the cached element when dependencies are unchanged.\n"
"\n"
" Also walks the kept node and copies any nested memos' cached vdoms from\n"
" `old_vdoms` into the new `vdoms`. Without this, an outer-memo True branch\n"
" (deps unchanged) would skip diffing the inner content, and the inner\n"
" memo's view-fn would fall out of the cache on the next tick. A later\n"
" outer-memo False branch (deps differ) would then recurse into the cached\n"
" inner memo, call `get_old_memo` on the inner view-fn, miss the cache,\n"
" and fall back to evaluating the *previous render's* closure — which can\n"
" return a structure that no longer matches the live metadata tree,\n"
" producing a flattened patch path with steps that overrun the metadata.\n"
).
-spec keep_memo(
cache(JMR),
fun(() -> agnostic@vdom@vnode:element(JMR)),
fun(() -> agnostic@vdom@vnode:element(JMR))
) -> cache(JMR).
keep_memo(Cache, Old, New) ->
Node = agnostic@internals@mutable_map:get_or_compute(
erlang:element(4, Cache),
Old,
New
),
Vdoms = agnostic@internals@mutable_map:insert(
erlang:element(3, Cache),
New,
Node
),
Vdoms@1 = propagate_nested_memos(Vdoms, erlang:element(4, Cache), Node),
{cache,
erlang:element(2, Cache),
Vdoms@1,
erlang:element(4, Cache),
erlang:element(5, Cache),
erlang:element(6, Cache)}.
-file("src/agnostic/vdom/cache.gleam", 179).
?DOC(" Caches a newly computed element when dependencies changed.\n").
-spec add_memo(
cache(JNB),
fun(() -> agnostic@vdom@vnode:element(JNB)),
agnostic@vdom@vnode:element(JNB)
) -> cache(JNB).
add_memo(Cache, New, Node) ->
Vdoms = agnostic@internals@mutable_map:insert(
erlang:element(3, Cache),
New,
Node
),
{cache,
erlang:element(2, Cache),
Vdoms,
erlang:element(4, Cache),
erlang:element(5, Cache),
erlang:element(6, Cache)}.
-file("src/agnostic/vdom/cache.gleam", 189).
?DOC(" Gets the isolated event subtree for a Map node.\n").
-spec get_subtree(
events(JNG),
binary(),
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_())
) -> events(JNG).
get_subtree(Events, Path, Old_mapper) ->
Child = agnostic@internals@mutable_map:get_or_compute(
erlang:element(3, Events),
Path,
fun() -> {child, Old_mapper, new_events()} end
),
erlang:element(3, Child).
-file("src/agnostic/vdom/cache.gleam", 203).
?DOC(" Updates the Map node's isolated event subtree after diffing its child.\n").
-spec update_subtree(
events(JNJ),
binary(),
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_()),
events(JNJ)
) -> events(JNJ).
update_subtree(Parent, Path, Mapper, Events) ->
New_child = {child, Mapper, Events},
Children = agnostic@internals@mutable_map:insert(
erlang:element(3, Parent),
Path,
New_child
),
{events, erlang:element(2, Parent), Children}.
-file("src/agnostic/vdom/cache.gleam", 216).
-spec add_event(
events(JNN),
agnostic@vdom@path:path(),
binary(),
gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JNN))
) -> events(JNN).
add_event(Events, Path, Name, Handler) ->
Handlers = do_add_event(erlang:element(2, Events), Path, Name, Handler),
{events, Handlers, erlang:element(3, Events)}.
-file("src/agnostic/vdom/cache.gleam", 244).
-spec do_remove_event(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JOG))),
agnostic@vdom@path:path(),
binary()
) -> agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JOG))).
do_remove_event(Handlers, Path, Name) ->
agnostic@internals@mutable_map:delete(
Handlers,
agnostic@vdom@path:event(Path, Name)
).
-file("src/agnostic/vdom/cache.gleam", 235).
-spec remove_event(events(JOD), agnostic@vdom@path:path(), binary()) -> events(JOD).
remove_event(Events, Path, Name) ->
Handlers = do_remove_event(erlang:element(2, Events), Path, Name),
{events, Handlers, erlang:element(3, Events)}.
-file("src/agnostic/vdom/cache.gleam", 400).
-spec remove_attributes(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JQE))),
agnostic@vdom@path:path(),
list(agnostic@vdom@vattr:attribute(JQE))
) -> agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JQE))).
remove_attributes(Handlers, Path, Attributes) ->
gleam@list:fold(
Attributes,
Handlers,
fun(Events, Attribute) -> case Attribute of
{event, _, Name, _, _, _, _, _, _} ->
do_remove_event(Events, Path, Name);
_ ->
Events
end end
).
-file("src/agnostic/vdom/cache.gleam", 412).
-spec do_remove_children(
agnostic@internals@mutable_map:mutable_map(binary(), gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(JQP))),
agnostic@internals@mutable_map:mutable_map(binary(), child(JQP)),
agnostic@internals@mutable_map:mutable_map(fun(() -> agnostic@vdom@vnode:element(JQP)), agnostic@vdom@vnode:element(JQP)),
agnostic@vdom@path:path(),
integer(),
list(agnostic@vdom@vnode:element(JQP))
) -> events(JQP).
do_remove_children(Handlers, Children, Vdoms, Parent, Index, Nodes) ->
Next = Index + 1,
case Nodes of
[] ->
{events, Handlers, Children};
[{element, _, Key, _, _, Attributes, Nodes@1, _} | Rest] ->
Path = agnostic@vdom@path:add(Parent, Index, Key),
Handlers@1 = remove_attributes(Handlers, Path, Attributes),
{events, Handlers@2, Children@1} = do_remove_children(
Handlers@1,
Children,
Vdoms,
Path,
0,
Nodes@1
),
do_remove_children(
Handlers@2,
Children@1,
Vdoms,
Parent,
Next,
Rest
);
[{fragment, _, Key@1, Nodes@2, _} | Rest@1] ->
Path@1 = agnostic@vdom@path:add(Parent, Index, Key@1),
{events, Handlers@3, Children@2} = do_remove_children(
Handlers,
Children,
Vdoms,
Path@1,
0,
Nodes@2
),
do_remove_children(
Handlers@3,
Children@2,
Vdoms,
Parent,
Next,
Rest@1
);
[{raw_container, _, Key@2, _, _, Attributes@1, _, _} | Rest@2] ->
Path@2 = agnostic@vdom@path:add(Parent, Index, Key@2),
Handlers@4 = remove_attributes(Handlers, Path@2, Attributes@1),
do_remove_children(
Handlers@4,
Children,
Vdoms,
Parent,
Next,
Rest@2
);
[{raw_node, _, Key@3, _, _} | Rest@3] ->
_ = agnostic@vdom@path:add(Parent, Index, Key@3),
do_remove_children(Handlers, Children, Vdoms, Parent, Next, Rest@3);
[{map, _, Key@4, _, _} | Rest@4] ->
Path@3 = agnostic@vdom@path:add(Parent, Index, Key@4),
Children@3 = agnostic@internals@mutable_map:delete(
Children,
agnostic@vdom@path:child(Path@3)
),
do_remove_children(
Handlers,
Children@3,
Vdoms,
Parent,
Next,
Rest@4
);
[{memo, _, _, _, View} | Rest@5] ->
case agnostic@internals@mutable_map:has_key(Vdoms, View) of
true ->
Child = agnostic@internals@mutable_map:unsafe_get(
Vdoms,
View
),
Nodes@3 = [Child | Rest@5],
do_remove_children(
Handlers,
Children,
Vdoms,
Parent,
Index,
Nodes@3
);
false ->
do_remove_children(
Handlers,
Children,
Vdoms,
Parent,
Next,
Rest@5
)
end;
[{text, _, _, _} | Rest@6] ->
do_remove_children(Handlers, Children, Vdoms, Parent, Next, Rest@6)
end.
-file("src/agnostic/vdom/cache.gleam", 383).
-spec remove_child(
cache(JPZ),
events(JPZ),
agnostic@vdom@path:path(),
integer(),
agnostic@vdom@vnode:element(JPZ)
) -> events(JPZ).
remove_child(Cache, Events, Parent, Child_index, Child) ->
do_remove_children(
erlang:element(2, Events),
erlang:element(3, Events),
erlang:element(4, Cache),
Parent,
Child_index,
agnostic@internals@constants:singleton_list(Child)
).
-file("src/agnostic/vdom/cache.gleam", 483).
-spec replace_child(
cache(JRB),
events(JRB),
agnostic@vdom@path:path(),
integer(),
agnostic@vdom@vnode:element(JRB),
agnostic@vdom@vnode:element(JRB)
) -> {cache(JRB), events(JRB)}.
replace_child(Cache, Events, Parent, Child_index, Prev, Next) ->
Events@1 = remove_child(Cache, Events, Parent, Child_index, Prev),
add_child(Cache, Events@1, Parent, Child_index, Next).
-file("src/agnostic/vdom/cache.gleam", 521).
-spec get_handler(
events(any()),
list(binary()),
fun((gleam@dynamic:dynamic_()) -> gleam@dynamic:dynamic_())
) -> {ok, gleam@dynamic@decode:decoder(agnostic@vdom@vattr:handler(any()))} |
{error, nil}.
get_handler(Events, Path, Mapper) ->
case Path of
[] ->
{error, nil};
[Key] ->
case agnostic@internals@mutable_map:has_key(
erlang:element(2, Events),
Key
) of
false ->
{error, nil};
true ->
Handler = agnostic@internals@mutable_map:unsafe_get(
erlang:element(2, Events),
Key
),
{ok,
gleam@dynamic@decode:map(
Handler,
fun(Handler@1) ->
{handler,
erlang:element(2, Handler@1),
erlang:element(3, Handler@1),
(gleam@function:identity(Mapper))(
erlang:element(4, Handler@1)
)}
end
)}
end;
[Key@1 | Path@1] ->
case agnostic@internals@mutable_map:has_key(
erlang:element(3, Events),
Key@1
) of
false ->
{error, nil};
true ->
Child = agnostic@internals@mutable_map:unsafe_get(
erlang:element(3, Events),
Key@1
),
Mapper@1 = compose_mapper(Mapper, erlang:element(2, Child)),
get_handler(erlang:element(3, Child), Path@1, Mapper@1)
end
end.
-file("src/agnostic/vdom/cache.gleam", 502).
-spec decode(cache(any()), binary(), binary(), gleam@dynamic:dynamic_()) -> decoded_event(any()).
decode(Cache, Path, Name, Event) ->
Parts = agnostic@vdom@path:split_subtree_path(
<<<<Path/binary, (<<"\n"/utf8>>)/binary>>/binary, Name/binary>>
),
case get_handler(
erlang:element(2, Cache),
Parts,
fun gleam@function:identity/1
) of
{ok, Handler} ->
case gleam@dynamic@decode:run(Event, Handler) of
{ok, Handler@1} ->
{decoded_event, Path, Handler@1};
{error, _} ->
{dispatched_event, Path}
end;
{error, _} ->
{dispatched_event, Path}
end.
-file("src/agnostic/vdom/cache.gleam", 552).
-spec dispatch(cache(JRP), decoded_event(JRP)) -> {cache(JRP),
{ok, agnostic@vdom@vattr:handler(JRP)} | {error, nil}}.
dispatch(Cache, Event) ->
Next_dispatched_paths = [erlang:element(2, Event) |
erlang:element(6, Cache)],
Cache@1 = {cache,
erlang:element(2, Cache),
erlang:element(3, Cache),
erlang:element(4, Cache),
erlang:element(5, Cache),
Next_dispatched_paths},
case Event of
{decoded_event, _, Handler} ->
{Cache@1, {ok, Handler}};
{dispatched_event, _} ->
{Cache@1, {error, nil}}
end.
-file("src/agnostic/vdom/cache.gleam", 564).
?DOC("\n").
-spec handle(cache(JRT), binary(), binary(), gleam@dynamic:dynamic_()) -> {cache(JRT),
{ok, agnostic@vdom@vattr:handler(JRT)} | {error, nil}}.
handle(Cache, Path, Name, Event) ->
_pipe = decode(Cache, Path, Name, Event),
dispatch(Cache, _pipe).
-file("src/agnostic/vdom/cache.gleam", 574).
-spec has_dispatched_events(cache(any()), agnostic@vdom@path:path()) -> boolean().
has_dispatched_events(Cache, Path) ->
agnostic@vdom@path:matches(Path, erlang:element(5, Cache)).