Skip to main content

NodeLabelsLender

Trait NodeLabelsLender 

Source
pub trait NodeLabelsLender<'lend, __ImplBound: ImplBound = Ref<'lend, Self>>: Lender + Lending<'lend, __ImplBound, Lend = (usize, Self::IntoIterator)> {
    type Label;
    type IntoIterator: IntoIterator<Item = Self::Label>;

    // Provided methods
    fn into_labeled_pairs<'a>(self) -> IntoLabeledPairs<'a, Self> 
       where Self: Sized + for<'b> NodeLabelsLender<'b, Label: Pair<Left = usize>> { ... }
    fn into_pairs<'a>(self) -> IntoPairs<'a, Self> 
       where Self: Sized + for<'b> NodeLabelsLender<'b, Label = usize> { ... }
}
Expand description

Iteration on nodes and associated labels.

This trait is a Lender returning pairs given by a usize (a node of the graph) and an IntoIterator, specified by the associated type IntoIterator, over the labels associated with that node, specified by the associated type Label (which is forced to be identical to the associated type Item of the IntoIterator).

For those types we provide convenience type aliases LenderIntoIterator, LenderIntoIter, and LenderLabel.

§Flattening Facilities

The methods into_pairs and into_labeled_pairs convert a NodeLabelsLender into an iterator of pairs (usize, usize) or labeled pairs ((usize, usize), Label), respectively. These are convenience methods that delegate to From trait implementations for IntoPairs and IntoLabeledPairs.

§Extension of Lender Methods

Methods defined on Lender, such as Lender::zip, normally would return a Lender, but not a NodeLabelsLender. However, the module lenders contains implementations that automatically turn such as a Lender into a NodeLabelsLender whenever it makes sense.

Thus, for example, one can take two graphs and merge easily the first half of the first one and the second half of the second one:

use webgraph::prelude::*;
use webgraph::graphs::random::ErdosRenyi;
use lender::*;
use itertools::Itertools;

// First random graph
let g = ErdosRenyi::new(100, 0.1, 0);
// Second random graph
let h = ErdosRenyi::new(100, 0.1, 1);
let mut v = VecGraph::new();
// Put first half of the first random graph in v
v.add_lender(g.iter().take(50));
// Put second half of the second random graph in v
v.add_lender(h.iter().skip(50));

let mut iter = v.iter();
for i in 0..50 {
    itertools::assert_equal(v.successors(i), iter.next().unwrap().1);
}
let mut iter = h.iter().skip(50);
for i in 50..100 {
    itertools::assert_equal(v.successors(i), iter.next().unwrap().1);
}

VecGraph::add_lender takes a NodeLabelsLender as an argument, but the implementations in the module lenders makes the result of Lender::take and Lender::skip a NodeLabelsLender.

§Propagation of implicit bounds

The definition of this trait emerged from a discussion on the Rust language forum. The purpose of the trait is to propagate the implicit bound appearing in the definition Lender to the iterator returned by the associated type IntoIterator. In this way, one can return iterators depending on the internal state of the labeling. Without this additional trait, it would be possible to return iterators whose state depends on the state of the lender, but not on the state of the labeling.

ArcListGraph is the main motivation for this trait.

Required Associated Types§

Provided Methods§

Source

fn into_labeled_pairs<'a>(self) -> IntoLabeledPairs<'a, Self>
where Self: Sized + for<'b> NodeLabelsLender<'b, Label: Pair<Left = usize>>,

Converts this lender into an iterator of labeled pairs of type ((usize, usize), Label), provided that the label type implements Pair with Left = usize.

Typically, this method is used to convert a lender on a labeled graph into an iterator of labeled arcs.

This is a convenience method that delegates to the From trait implementation.

Source

fn into_pairs<'a>(self) -> IntoPairs<'a, Self>
where Self: Sized + for<'b> NodeLabelsLender<'b, Label = usize>,

Converts this lender into an iterator of pairs, provided that the label type is usize.

Typically, this method is used to convert a lender on a graph into an iterator of arcs expressed as pairs.

This is a convenience method that delegates to the From trait implementation.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'lend, A, B> NodeLabelsLender<'lend> for Chain<A, B>
where A: Lender + for<'next> NodeLabelsLender<'next>, B: Lender + for<'next> NodeLabelsLender<'next, Label = <A as NodeLabelsLender<'next>>::Label, IntoIterator = <A as NodeLabelsLender<'next>>::IntoIterator>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Cycle<L>
where L: Clone + Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Fuse<L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Peekable<'_, L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Rev<L>
where L: Lender + DoubleEndedLender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Skip<L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for StepBy<L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L> NodeLabelsLender<'lend> for Take<L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L, F> NodeLabelsLender<'lend> for Inspect<L, F>
where F: for<'next> FnMut(&Lend<'next, L>), L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L, F> NodeLabelsLender<'lend> for Mutate<L, F>
where F: FnMut(&mut Lend<'_, L>), L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L, P> NodeLabelsLender<'lend> for Filter<L, P>
where P: for<'next> FnMut(&(usize, <L as NodeLabelsLender<'next>>::IntoIterator)) -> bool, L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'lend, L, P> NodeLabelsLender<'lend> for SkipWhile<L, P>
where L: Lender + for<'next> NodeLabelsLender<'next>, P: for<'next> FnMut(&Lend<'next, L>) -> bool,

Source§

impl<'lend, L, P> NodeLabelsLender<'lend> for TakeWhile<L, P>
where L: Lender + for<'next> NodeLabelsLender<'next>, P: FnMut(&Lend<'_, L>) -> bool,

Source§

impl<'lend, LL, L> NodeLabelsLender<'lend> for Flatten<'_, LL>
where LL: Lender<Lend = L>, L: Lender + for<'next> NodeLabelsLender<'next> + 'lend,

Source§

impl<'lend, LL, L, F> NodeLabelsLender<'lend> for FlatMap<'_, LL, F>
where LL: Lender, L: Lender + for<'next> NodeLabelsLender<'next> + 'lend, F: for<'all> FnMutHKA<'all, Lend<'all, LL>, B = L>,

Source§

impl<'lend, T> NodeLabelsLender<'lend> for Chunk<'_, T>
where T: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<A, B, II> NodeLabelsLender<'_> for Zip<A, B>
where A: Lender + for<'next> Lending<'next, Lend = usize>, B: Lender + for<'next> Lending<'next, Lend = II>, II: IntoIterator,

Source§

impl<I, J> NodeLabelsLender<'_> for FromIter<I>
where I: Iterator<Item = (usize, J)>, J: IntoIterator,

Source§

impl<L, F, II> NodeLabelsLender<'_> for FilterMap<L, F>
where II: IntoIterator, F: for<'all> FnMutHKAOpt<'all, Lend<'all, L>, B = (usize, II)>, L: Lender,

Source§

impl<L, F, II> NodeLabelsLender<'_> for Map<L, F>
where F: for<'all> FnMutHKA<'all, Lend<'all, L>, B = (usize, II)>, II: IntoIterator, L: Lender,

Source§

impl<L, P, II> NodeLabelsLender<'_> for MapWhile<L, P>
where P: for<'all> FnMutHKAOpt<'all, Lend<'all, L>, B = (usize, II)>, II: IntoIterator, L: Lender,

Source§

impl<L, St, F, II> NodeLabelsLender<'_> for Scan<L, St, F>
where for<'all> F: FnMutHKAOpt<'all, (&'all mut St, Lend<'all, L>), B = (usize, II)>, L: Lender, II: IntoIterator,

Source§

impl<Label, II, L> NodeLabelsLender<'_> for Enumerate<L>
where L: Lender + for<'all> Lending<'all, Lend = II>, II: IntoIterator<Item = Label>,

Source§

type Label = Label

Source§

type IntoIterator = II

Source§

impl<S, F, J> NodeLabelsLender<'_> for FromFn<S, F>
where F: for<'all> FnMutHKAOpt<'all, &'all mut S, B = (usize, J)>, J: IntoIterator,

Implementors§

Source§

impl<'lend, L> NodeLabelsLender<'lend> for AssumeSortedLender<L>
where L: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'succ, D: Decode> NodeLabelsLender<'succ> for webgraph::graphs::bvgraph::sequential::NodeLabels<D>

Source§

impl<'succ, E: Endianness, BR: BitRead<E> + BitSeek, D: BitDeserializer<E, BR>, O: Offsets> NodeLabelsLender<'succ> for webgraph::labels::bitstream::NodeLabels<'_, '_, E, BR, D, O>

Source§

type Label = <D as BitDeserializer<E, BR>>::DeserType

Source§

type IntoIterator = SeqLabels<'succ, E, BR, D>

Source§

impl<'succ, G: RandomAccessLabeling> NodeLabelsLender<'succ> for LenderImpl<'_, G>

Source§

impl<'succ, I, D> NodeLabelsLender<'succ> for LenderSortedImpl<I, D>
where I: Iterator<Item = usize>, D: Iterator<Item = usize>,

Source§

impl<'succ, I, D> NodeLabelsLender<'succ> for webgraph::graphs::csr_graph::NodeLabels<I, D>
where I: Iterator<Item = usize>, D: Iterator<Item = usize>,

Source§

impl<'succ, I: Lender + for<'next> NodeLabelsLender<'next, Label = usize>> NodeLabelsLender<'succ> for webgraph::graphs::no_selfloops_graph::NodeLabels<I>

Source§

impl<'succ, I: Lender + for<'next> NodeLabelsLender<'next, Label = usize>, P: SliceByValue<Value = usize>> NodeLabelsLender<'succ> for webgraph::graphs::permuted_graph::NodeLabels<'_, I, P>

Source§

impl<'succ, L> NodeLabelsLender<'succ> for LeftIterator<L>
where L: Lender + for<'next> NodeLabelsLender<'next>, for<'next> LenderLabel<'next, L>: Pair,

Source§

impl<'succ, L> NodeLabelsLender<'succ> for RightIterator<L>
where L: Lender + for<'next> NodeLabelsLender<'next>, for<'next> LenderLabel<'next, L>: Pair,

Source§

impl<'succ, L, R> NodeLabelsLender<'succ> for webgraph::labels::zip::NodeLabels<L, R>
where L: Lender + for<'next> NodeLabelsLender<'next>, R: Lender + for<'next> NodeLabelsLender<'next>,

Source§

impl<'succ, L: Clone + 'static, I: Iterator<Item = ((usize, usize), L)>> NodeLabelsLender<'succ> for webgraph::graphs::arc_list_graph::NodeLabels<L, I>

Source§

type Label = (usize, L)

Source§

type IntoIterator = Succ<'succ, L, I>