public static IEnumerable <KeyValuePair <TSource, TResult> > TraverseBreadthFirstWithParent <TSource, TResult>(
this TSource self,
Func <TSource, TResult> valueSelector,
Func <TSource, IEnumerable <TSource> > childrenSelector)
{
Check.Self(self);
Check.ValueSelector(valueSelector);
Check.ChildrenSelector(childrenSelector);
return(CreateTraverseBreadthFirstWithParentIterator(self, valueSelector, childrenSelector));
}