Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 17 additions & 51 deletions consumer/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use alloc::{
vec,
vec::Vec,
};
use core::{fmt, iter::FusedIterator};
use core::fmt;

use crate::filters::FilterResult;
use crate::iterators::{
Expand Down Expand Up @@ -150,11 +150,7 @@ impl<'a> Node<'a> {

pub fn child_ids(
&self,
) -> impl DoubleEndedIterator<Item = NodeId>
+ ExactSizeIterator<Item = NodeId>
+ FusedIterator<Item = NodeId>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = NodeId> + ExactSizeIterator + use<'a> {
if self.is_graft() {
ChildIds::Graft(self.graft_child_id())
} else {
Expand All @@ -167,81 +163,58 @@ impl<'a> Node<'a> {

pub fn children(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>>
+ ExactSizeIterator<Item = Node<'a>>
+ FusedIterator<Item = Node<'a>>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = Node<'a>> + ExactSizeIterator + use<'a> {
let state = self.tree_state;
self.child_ids()
.map(move |id| state.node_by_id(id).unwrap())
}

pub fn filtered_children<F: Fn(&Node) -> FilterResult + 'a>(
pub fn filtered_children<F: Fn(&Node) -> FilterResult>(
&self,
filter: F,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + use<'a, F>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a, F> {
FilteredChildren::new(*self, filter)
}

pub fn following_sibling_ids(
&self,
) -> impl DoubleEndedIterator<Item = NodeId>
+ ExactSizeIterator<Item = NodeId>
+ FusedIterator<Item = NodeId>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = NodeId> + ExactSizeIterator + use<'a> {
FollowingSiblings::new(*self)
}

pub fn following_siblings(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>>
+ ExactSizeIterator<Item = Node<'a>>
+ FusedIterator<Item = Node<'a>>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = Node<'a>> + ExactSizeIterator + use<'a> {
let state = self.tree_state;
self.following_sibling_ids()
.map(move |id| state.node_by_id(id).unwrap())
}

pub fn following_filtered_siblings<F: Fn(&Node) -> FilterResult + 'a>(
pub fn following_filtered_siblings<F: Fn(&Node) -> FilterResult>(
&self,
filter: F,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + use<'a, F>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a, F> {
FollowingFilteredSiblings::new(*self, filter)
}

pub fn preceding_sibling_ids(
&self,
) -> impl DoubleEndedIterator<Item = NodeId>
+ ExactSizeIterator<Item = NodeId>
+ FusedIterator<Item = NodeId>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = NodeId> + ExactSizeIterator + use<'a> {
PrecedingSiblings::new(*self)
}

pub fn preceding_siblings(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>>
+ ExactSizeIterator<Item = Node<'a>>
+ FusedIterator<Item = Node<'a>>
+ 'a
+ use<'a> {
) -> impl DoubleEndedIterator<Item = Node<'a>> + ExactSizeIterator + use<'a> {
let state = self.tree_state;
self.preceding_sibling_ids()
.map(move |id| state.node_by_id(id).unwrap())
}

pub fn preceding_filtered_siblings<F: Fn(&Node) -> FilterResult + 'a>(
pub fn preceding_filtered_siblings<F: Fn(&Node) -> FilterResult>(
&self,
filter: F,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + use<'a, F>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a, F> {
PrecedingFilteredSiblings::new(*self, filter)
}

Expand Down Expand Up @@ -726,10 +699,7 @@ fn descendant_label_filter(node: &Node) -> FilterResult {
}

impl<'a> Node<'a> {
pub fn labelled_by(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + 'a + use<'a>
{
pub fn labelled_by(&self) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a> {
let explicit = &self.state.data.labelled_by();
if explicit.is_empty()
&& matches!(
Expand Down Expand Up @@ -967,10 +937,7 @@ impl<'a> Node<'a> {
)
}

pub fn controls(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + 'a + use<'a>
{
pub fn controls(&self) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a> {
let state = self.tree_state;
let id = self.id;
let data = &self.state.data;
Expand Down Expand Up @@ -1066,11 +1033,10 @@ impl<'a> Node<'a> {
})
}

pub fn items<F: Fn(&Node) -> FilterResult + 'a>(
pub fn items<F: Fn(&Node) -> FilterResult>(
&self,
filter: F,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + use<'a, F>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a, F> {
self.filtered_children(move |child| match filter(child) {
FilterResult::Include if child.is_item_like() => FilterResult::Include,
FilterResult::Include => FilterResult::ExcludeNode,
Expand Down
13 changes: 4 additions & 9 deletions consumer/src/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use accesskit::{
TextPosition as WeakPosition, TextSelection, VerticalOffset,
};
use alloc::{string::String, vec::Vec};
use core::{cmp::Ordering, fmt, iter::FusedIterator};
use core::{cmp::Ordering, fmt};

use crate::{FilterResult, Node, TreeState, node::NodeId};

Expand Down Expand Up @@ -1378,28 +1378,23 @@ impl<'a> Node<'a> {
// TODO: more attributes
}

pub(crate) fn text_runs(
&self,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + 'a + use<'a>
{
pub(crate) fn text_runs(&self) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a> {
let id = self.id();
self.filtered_children(move |node| text_node_filter(id, node))
}

fn following_text_runs(
&self,
root_node: &Node,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + 'a + use<'a>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a> {
let id = root_node.id();
self.following_filtered_siblings(move |node| text_node_filter(id, node))
}

fn preceding_text_runs(
&self,
root_node: &Node,
) -> impl DoubleEndedIterator<Item = Node<'a>> + FusedIterator<Item = Node<'a>> + 'a + use<'a>
{
) -> impl DoubleEndedIterator<Item = Node<'a>> + use<'a> {
let id = root_node.id();
self.preceding_filtered_siblings(move |node| text_node_filter(id, node))
}
Expand Down
5 changes: 1 addition & 4 deletions platforms/atspi-common/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use atspi_common::{
use std::{
collections::HashMap,
hash::{Hash, Hasher},
iter::FusedIterator,
sync::{Arc, RwLock, RwLockReadGuard, Weak},
};

Expand Down Expand Up @@ -56,9 +55,7 @@ impl NodeWrapper<'_> {
self.0.id()
}

fn filtered_child_ids(
&self,
) -> impl DoubleEndedIterator<Item = NodeId> + FusedIterator<Item = NodeId> + '_ {
fn filtered_child_ids(&self) -> impl DoubleEndedIterator<Item = NodeId> {
self.0.filtered_children(&filter).map(|child| child.id())
}

Expand Down