TreeTraversal.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using QuestPDF.Infrastructure;
  4. namespace QuestPDF.Drawing.Proxy;
  5. internal class TreeNode<T>
  6. {
  7. public T Value { get; }
  8. public ICollection<TreeNode<T>> Children { get; } = new List<TreeNode<T>>();
  9. public TreeNode(T Value)
  10. {
  11. this.Value = Value;
  12. }
  13. }
  14. internal static class TreeTraversal
  15. {
  16. public static TreeNode<T> ExtractProxyOfType<T>(this Element root) where T : ElementProxy
  17. {
  18. return Traverse(root).FirstOrDefault();
  19. IEnumerable<TreeNode<T>> Traverse(Element element)
  20. {
  21. if (element is T proxy)
  22. {
  23. var result = new TreeNode<T>(proxy);
  24. foreach (var treeNode in proxy.Child!.GetChildren().SelectMany(Traverse))
  25. result.Children.Add(treeNode);
  26. yield return result;
  27. }
  28. else
  29. {
  30. foreach (var treeNode in element.GetChildren().SelectMany(Traverse))
  31. yield return treeNode;
  32. }
  33. }
  34. }
  35. }