Visualize a tree: Difference between revisions

Content added Content deleted
m (→‎Functional composition: Adjusted type comments (Node contents don't have to be strings))
Line 534: Line 534:
`-- (null)</pre>
`-- (null)</pre>
=={{header|Elena}}==
=={{header|Elena}}==
ELENA 3.4 :
ELENA 4.x :
<lang elena>/// a program to produce a visual representation of some tree.
<lang elena>import system'routines.

import extensions.
import system'routines;
import extensions;


class Node
class Node
{
{
object theValue.
string theValue;
object theChildren.
Node[] theChildren;
constructor name : value children:children
constructor new(string value, Node[] children)
[
{
theValue := value.
theValue := value;
theChildren := (children ?? Array min) toArray.
theChildren := children;
]
}
constructor name : value
constructor new(string value)
<= name:value children:nil.
<= new(value, new Node[](0));
constructor children:children
constructor new(Node[] children)
<= name:emptyLiteral children:children.
<= new(emptyString, children);
get() = theValue;
constructor name : value child:child
<= name:value children(Array single:child).
get = theValue.
children = theChildren.
Children = theChildren;
}
}


extension treeOp
extension treeOp
{
{
writeTree(node,prefix)
writeTree(node, prefix)
[
{
var children := node children.
var children := node.Children;
var length := children length.
var length := children.Length;
children zip(RangeEnumerator from:1 to:length) forEach(:child:index)
children.zipForEach(new Range(1, length), (child,index)
[
{
self printLine(prefix,"|").
self.printLine(prefix,"|");
self printLine(prefix,"+---",child get).
self.printLine(prefix,"+---",child.get());
var nodeLine := prefix + (index==length)iif(" ","| ").
var nodeLine := prefix + (index==length).iif(" ","| ");
self writeTree(child,nodeLine).
self.writeTree(child,nodeLine);
].
});
^ self.
^ self
]
}
writeTree(node)
writeTree(node)
= self~treeOp writeTree(node,"").
= self.writeTree(node,"");
}
}


public program
public program()
{
[
var tree := Node children:
var tree := Node.new(
(
new Node[]{
Node name:"a" children:
Node.new("a", new Node[]
(
{
Node name:"b" child:(Node name:"c"),
Node.new("b", new Node[]{Node.new("c")}),
Node name:"d"
Node.new("d")
),
}),
Node name:"e"
Node.new("e")
).
});
console writeTree(tree); readChar.
console.writeTree(tree).readChar()
]</lang>
}</lang>
{{out}}
{{out}}
<pre>
<pre>