Ejemplo n.º 1
0
 public P_TreeNodeTransformState(TSource source)
 {
     if (source == null)
     {
         throw new ArgumentNullException(paramName: nameof(source));
     }
     //
     Parent                    = null;
     Source                    = source;
     SourceChildren            = null;
     TransformedSourceChildren = new List <TResult>();
 }
Ejemplo n.º 2
0
 public P_TreeNodeTransformState(P_TreeNodeTransformState <TSource, TResult> parent, TSource source)
 {
     parent.EnsureNotNull(nameof(parent));
     if (source == null)
     {
         throw new ArgumentNullException(paramName: nameof(source));
     }
     //
     Parent                    = parent;
     Source                    = source;
     SourceChildren            = null;
     TransformedSourceChildren = new List <TResult>();
 }
Ejemplo n.º 3
0
        public static TResult Transform <TSource, TResult>(this SingleTreeNodeUtilitiesHandle <TSource> hnd, Func <TSource, IEnumerable <TSource> > childrenSelector, Func <TSource, IEnumerable <TResult>, TResult> transform)
        {
            childrenSelector.EnsureNotNull(nameof(childrenSelector));
            transform.EnsureNotNull(nameof(transform));
            //
            var root           = new P_TreeNodeTransformState <TSource, TResult>(hnd.Source);
            var traversalStack = new Stack <P_TreeNodeTransformState <TSource, TResult> >(root.Sequence());

            for (; traversalStack.Count > 0;)
            {
                var currentTraversalEntry = traversalStack.Peek();
                //
                var initialSizeOfTraversalStack = traversalStack.Count;
                if (currentTraversalEntry.SourceChildren == null)
                {
                    currentTraversalEntry.SourceChildren =
                        childrenSelector(currentTraversalEntry.Source)
                        .EmptyIfNull()
                        .ToArray();
                    for (var i = currentTraversalEntry.SourceChildren.Length - 1; i > -1; i--)
                    {
                        traversalStack
                        .Push(
                            new P_TreeNodeTransformState <TSource, TResult>(
                                currentTraversalEntry,
                                currentTraversalEntry.SourceChildren[i]));
                    }
                }
                //
                if (initialSizeOfTraversalStack == traversalStack.Count)
                {
                    traversalStack.Pop();
                    if (!ReferenceEquals(currentTraversalEntry, root))
                    {
                        currentTraversalEntry
                        .Parent
                        .TransformedSourceChildren
                        .Add(transform(currentTraversalEntry.Source, currentTraversalEntry.TransformedSourceChildren));
                    }
                }
            }
            return(transform(root.Source, root.TransformedSourceChildren));
        }