From 2838669e003056dbd3614d79ee1be1758213df65 Mon Sep 17 00:00:00 2001 From: preciz Date: Wed, 22 Apr 2026 10:07:34 +0200 Subject: [PATCH] Optimize selector traversal Avoid extra reversals while preserving descendant order. --- lib/floki/finder.ex | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/floki/finder.ex b/lib/floki/finder.ex index d94c69df..1aa33c94 100644 --- a/lib/floki/finder.ex +++ b/lib/floki/finder.ex @@ -319,7 +319,7 @@ defmodule Floki.Finder do end defp get_selector_nodes(%Selector.Combinator{match_type: :child}, html_node, _tree) do - Enum.reverse(html_node.children_nodes_ids) + html_node.children_nodes_ids end defp get_selector_nodes(%Selector.Combinator{match_type: :adjacent_sibling}, html_node, tree) do @@ -373,7 +373,6 @@ defmodule Floki.Finder do case get_node(node_id, tree) do %{children_nodes_ids: children} when children != [] -> do_get_descendant_ids(children, tree, []) - |> Enum.reverse() _ -> [] @@ -383,16 +382,17 @@ defmodule Floki.Finder do defp do_get_descendant_ids([], _tree, acc), do: acc defp do_get_descendant_ids([node_id | rest], tree, acc) do - acc = do_get_descendant_ids(rest, tree, acc) - acc = [node_id | acc] + acc = + case get_node(node_id, tree) do + %{children_nodes_ids: children} when children != [] -> + do_get_descendant_ids(children, tree, acc) - case get_node(node_id, tree) do - %{children_nodes_ids: children} when children != [] -> - do_get_descendant_ids(children, tree, acc) + _ -> + acc + end - _ -> - acc - end + acc = [node_id | acc] + do_get_descendant_ids(rest, tree, acc) end @spec map(Floki.html_tree() | Floki.html_node(), function()) ::