jsfiddle-console example
https://github.com/eu81273/jsfiddle-console
by dimitrs_papadimitriou
HTML
<div id="display">
</div>
TypeScript
var log=m=>{var target = document.querySelector("#display");
var p = document.createElement('p');
p.innerText = m;
target.appendChild(p);};
abstract class Tree<T>
{
abstract MatchWith<T1>(pattern: ({ leaf: (v:T) => T1, node: (left: Tree<T>, v: T, right: Tree<T>) => T1 })): T1;
Show(): string {
return this.MatchWith({
leaf: (v) => `(${v})`,
node: (l, v, r) => `(${l.Show()},${v},${r.Show()})`
});
}
Reverse(): Tree<T> {
return this.MatchWith({
leaf: (v) => new Leaf(v),
node: (l, v, r) => new Node1(r.Reverse(), v, l.Reverse())
});
}
}
class Node1<T> extends Tree<T> {
Left: Tree<T>;
Value: T;
Right: Tree<T>;
constructor(left: Tree<T>, value: T, right: Tree<T>) {
super();
this.Left = left;
this.Value = value;
this.Right = right;
}
MatchWith<T1>(pattern: { leaf: (v: T) => T1; node: (left: Tree<T>, v: T, right: Tree<T>) => T1; }): T1 {
return pattern.node(this.Left, this.Value, this.Right);
}
}
class Leaf<T> extends Tree<T> {
Value: T;
constructor(value: T) {
super();
this.Value = value;
}
MatchWith<T1>(pattern: { leaf: (v: T) => T1; node: (left: Tree<T>, v: T, right: Tree<T>) => T1; }): T1 {
return pattern.leaf(this.Value);
}
}
var treeee = new Node1(new Node1(new Leaf(1), 2, new Leaf(3)), 4, new Node1(new Leaf(5), 6, new Leaf(7)));
log(treeee.Show());
log(treeee.Reverse().Show());