using System;
using System.Collections.Generic;
using System.Text;
public class Test
{
public static void Main()
{
var fileMenu = new Tree<string>("File")
.AddChild("Open")
.AddChild("Edit")
.AddChild(
new Tree<string>("Recent Files")
.AddChild("foo.txt")
.AddChild("bar.txt"))
.AddChild("Exit");
Console.WriteLine(fileMenu.ToString());
}
class Tree<T>
{
private readonly T value;
private readonly List<Tree<T>> children = new List<Tree<T>>();
public Tree(T value)
{
this.value = value;
}
public IEnumerable<Tree<T>> Children
{
get { return this.children; }
}
public T Value
{
get { return this.value; }
}
public Tree<T> AddChild(Tree<T> tree)
{
this.children.Add(tree);
return this;
}
public Tree<T> AddChild(T value)
{
return this.AddChild(new Tree<T>(value));
}
public override string ToString()
{
var sb = new StringBuilder();
ToStringHelper(sb, 1);
return sb.ToString();
}
private void ToStringHelper(StringBuilder sb, int depth)
{
sb.AppendLine(this.value.ToString());
foreach (var child in this.children)
{
sb.Append('-', depth);
child.ToStringHelper(sb, depth + 1);
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQ7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICAgdmFyIGZpbGVNZW51ID0gbmV3IFRyZWU8c3RyaW5nPigiRmlsZSIpCgkgICAgICAgIC5BZGRDaGlsZCgiT3BlbiIpCgkgICAgICAgIC5BZGRDaGlsZCgiRWRpdCIpCgkgICAgICAgIC5BZGRDaGlsZCgKCSAgICAgICAgICAgIG5ldyBUcmVlPHN0cmluZz4oIlJlY2VudCBGaWxlcyIpCgkgICAgICAgICAgICAgICAgLkFkZENoaWxkKCJmb28udHh0IikKCSAgICAgICAgICAgICAgICAuQWRkQ2hpbGQoImJhci50eHQiKSkKCSAgICAgICAgLkFkZENoaWxkKCJFeGl0Iik7CgkgICAgQ29uc29sZS5Xcml0ZUxpbmUoZmlsZU1lbnUuVG9TdHJpbmcoKSk7Cgl9CgkKCWNsYXNzIFRyZWU8VD4KCXsKCSAgICBwcml2YXRlIHJlYWRvbmx5IFQgdmFsdWU7CgkgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PFRyZWU8VD4+IGNoaWxkcmVuID0gbmV3IExpc3Q8VHJlZTxUPj4oKTsKCSAgICAKCSAgICBwdWJsaWMgVHJlZShUIHZhbHVlKQoJICAgIHsKCSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwoJICAgIH0KCSAgICAKCSAgICBwdWJsaWMgSUVudW1lcmFibGU8VHJlZTxUPj4gQ2hpbGRyZW4KCSAgICB7CgkgICAgICAgIGdldCB7IHJldHVybiB0aGlzLmNoaWxkcmVuOyB9CgkgICAgfQoJICAgIAoJICAgIHB1YmxpYyBUIFZhbHVlCgkgICAgewoJICAgIAlnZXQgeyByZXR1cm4gdGhpcy52YWx1ZTsgfQoJICAgIH0KCSAgICAKCSAgICBwdWJsaWMgVHJlZTxUPiBBZGRDaGlsZChUcmVlPFQ+IHRyZWUpCgkgICAgewoJICAgICAgICB0aGlzLmNoaWxkcmVuLkFkZCh0cmVlKTsKCSAgICAgICAgcmV0dXJuIHRoaXM7CgkgICAgfQoJICAgIAoJICAgIHB1YmxpYyBUcmVlPFQ+IEFkZENoaWxkKFQgdmFsdWUpCgkgICAgewoJICAgICAgICByZXR1cm4gdGhpcy5BZGRDaGlsZChuZXcgVHJlZTxUPih2YWx1ZSkpOwoJICAgIH0KCSAgICAKCSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKCSAgICB7CgkgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgkgICAgICAgIFRvU3RyaW5nSGVscGVyKHNiLCAxKTsKCSAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CgkgICAgfQoJICAgIAoJICAgIHByaXZhdGUgdm9pZCBUb1N0cmluZ0hlbHBlcihTdHJpbmdCdWlsZGVyIHNiLCBpbnQgZGVwdGgpCgkgICAgewoJICAgICAgICBzYi5BcHBlbmRMaW5lKHRoaXMudmFsdWUuVG9TdHJpbmcoKSk7CgkgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiB0aGlzLmNoaWxkcmVuKQoJICAgICAgICB7CgkgICAgICAgICAgICBzYi5BcHBlbmQoJy0nLCBkZXB0aCk7CgkgICAgICAgICAgICBjaGlsZC5Ub1N0cmluZ0hlbHBlcihzYiwgZGVwdGggKyAxKTsKCSAgICAgICAgfQoJICAgIH0KCX0KfQ==