private static T _assemble <T>(IEnumerable <Tuple <NodeIndex, T> > dic, Action <T, T> addAction) { var seq = dic.OrderBy(x => x.Item1, Tree.NodeIndex.GetPostorderComparer()); var vst = new ElementScroller <Tuple <NodeIndex, T> >(seq); foreach (var tr in vst.GetSequence()) { vst.MoveTo(tr) .MaybeNext(x => tr.Item1.CurrentDepth > x.Item1.CurrentDepth) .TrueOrNot(r => addAction(r.Current.Item2, tr.Item2)); } return(vst.Current.Item2); }
private static U convert <T, U>(T self, Func <T, U> generator, Action <U, U> addAction) where T : IReadOnlyTreeNode <T> { if (generator == null) { throw new ArgumentNullException("generator"); } if (addAction == null) { throw new ArgumentNullException("addAction"); } var t = self.Postorder().Select(x => Tuple.Create(x, generator(x))); var vst = new ElementScroller <Tuple <T, U> >(t); foreach (var tr in vst.GetSequence()) { vst.MoveTo(tr) .MaybeNext(x => x.Item1.Children.Contains(tr.Item1)) .TrueOrNot(r => addAction(r.Current.Item2, tr.Item2)); } return(vst.Current.Item2); }