2020-02-17 23:21:07 -08:00
|
|
|
/// a program to produce a visual representation of some tree.
|
|
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
import system'routines;
|
|
|
|
|
import extensions;
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
class Node
|
2016-12-05 22:15:40 +01:00
|
|
|
{
|
2019-09-12 10:33:56 -07:00
|
|
|
string theValue;
|
|
|
|
|
Node[] theChildren;
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
constructor new(string value, Node[] children)
|
|
|
|
|
{
|
|
|
|
|
theValue := value;
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
theChildren := children;
|
|
|
|
|
}
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
constructor new(string value)
|
|
|
|
|
<= new(value, new Node[](0));
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
constructor new(Node[] children)
|
|
|
|
|
<= new(emptyString, children);
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
get() = theValue;
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
Children = theChildren;
|
2016-12-05 22:15:40 +01:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
extension treeOp
|
2016-12-05 22:15:40 +01:00
|
|
|
{
|
2019-09-12 10:33:56 -07:00
|
|
|
writeTree(node, prefix)
|
|
|
|
|
{
|
|
|
|
|
var children := node.Children;
|
|
|
|
|
var length := children.Length;
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
children.zipForEach(new Range(1, length), (child,index)
|
|
|
|
|
{
|
|
|
|
|
self.printLine(prefix,"|");
|
|
|
|
|
self.printLine(prefix,"+---",child.get());
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
var nodeLine := prefix + (index==length).iif(" ","| ");
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
self.writeTree(child,nodeLine);
|
|
|
|
|
});
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
^ self
|
|
|
|
|
}
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
writeTree(node)
|
|
|
|
|
= self.writeTree(node,"");
|
2016-12-05 22:15:40 +01:00
|
|
|
}
|
|
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
public program()
|
|
|
|
|
{
|
|
|
|
|
var tree := Node.new(
|
2020-02-17 23:21:07 -08:00
|
|
|
new Node[]::(
|
|
|
|
|
Node.new("a", new Node[]::
|
|
|
|
|
(
|
|
|
|
|
Node.new("b", new Node[]::(Node.new("c"))),
|
2019-09-12 10:33:56 -07:00
|
|
|
Node.new("d")
|
2020-02-17 23:21:07 -08:00
|
|
|
)),
|
2019-09-12 10:33:56 -07:00
|
|
|
Node.new("e")
|
2020-02-17 23:21:07 -08:00
|
|
|
));
|
2019-09-12 10:33:56 -07:00
|
|
|
|
|
|
|
|
console.writeTree(tree).readChar()
|
|
|
|
|
}
|