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());