Skip to content

Instantly share code, notes, and snippets.

@sklppr
Last active May 16, 2019 20:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sklppr/6f26be0cdead71402f3303f6c6a5090a to your computer and use it in GitHub Desktop.
Save sklppr/6f26be0cdead71402f3303f6c6a5090a to your computer and use it in GitHub Desktop.
module Tree0 {
type Tree<T> = Empty | Node<T>;
class Empty {
public toString(): string {
return "Empty";
}
}
class Node<T> {
constructor(
public readonly value: T,
public readonly left: Tree<T>,
public readonly right: Tree<T>
) {}
public toString(): string {
return `Node(${this.value}, ${this.left.toString()}, ${this.right.toString()})`;
}
}
const tree: Tree<number> = new Node(
42,
new Node(
0,
new Empty(),
new Empty()
),
new Empty()
);
console.log(tree.toString()); // Node(42, Node(0, Empty, Empty), Empty)
}
module Tree1 {
type Tree<T> = Empty | Node<T>;
class Empty {}
class Node<T> {
constructor(
public readonly value: T,
public readonly left: Tree<T>,
public readonly right: Tree<T>,
) {}
}
function stringify(tree: Tree<unknown>): string {
if (tree instanceof Empty) return "Empty";
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
const tree: Tree<number> = new Node(
42,
new Node(
0,
new Empty(),
new Empty()
),
new Empty()
);
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
module Tree2 {
type Tree<T> = Empty | Node<T>;
enum NodeType {
Empty,
Node
}
interface Empty {
type: NodeType.Empty;
}
interface Node<T> {
type: NodeType.Node;
value: T;
left: Tree<T>;
right: Tree<T>;
}
export function stringify(tree: Tree<unknown>): string {
switch (tree.type) {
case NodeType.Empty:
return "Empty";
case NodeType.Node:
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
}
const tree: Tree<number> = {
type: NodeType.Node,
value: 42,
left: {
type: NodeType.Node,
value: 0,
left: { type: NodeType.Empty },
right: { type: NodeType.Empty },
},
right: { type: NodeType.Empty },
};
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
// Does not compile!
module Tree2B {
type Tree<T> = Empty | Node<T>;
interface Empty {}
interface Node<T> {
value: T;
left: Tree<T>;
right: Tree<T>;
}
export function stringify(tree: Tree<unknown>): string {
switch (typeof tree) {
case Empty:
return "Empty";
case Node:
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
}
const tree: Tree<number> = {
value: 42,
left: {
value: 0,
left: {},
right: {},
},
right: {},
};
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
module Tree3 {
type Tree<T> = Empty | Node<T>;
type Empty = undefined;
interface Node<T> {
value: T;
left: Tree<T>;
right: Tree<T>;
}
function stringify(tree: Tree<unknown>): string {
if (typeof tree === "undefined") return 'Empty';
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
const tree: Tree<number> = {
value: 42,
left: {
value: 0,
left: undefined,
right: undefined,
},
right: undefined
};
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
// Does not compile!
module Tree3B {
type Tree<T> = Empty | Node<T>;
type Empty = undefined;
interface Node<T> {
value: T;
left: Tree<T>;
right: Tree<T>;
}
function stringify(tree: Empty): string {
return "Empty";
}
function stringify(tree: Node<unknown>): string {
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
const tree: Tree<number> = {
value: 42,
left: {
value: 0,
left: undefined,
right: undefined,
},
right: undefined,
};
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
module Tree4 {
type Tree<T> = Empty | {
value: T;
left: Tree<T>;
right: Tree<T>;
};
type Empty = undefined;
function isEmpty(tree: Tree<unknown>): tree is Empty {
return tree === undefined;
}
export function stringify(tree: Tree<unknown>): string {
if (isEmpty(tree)) {
return "Empty";
}
return `Node(${tree.value}, ${stringify(tree.left)}, ${stringify(tree.right)})`;
}
const tree: Tree<number> = {
value: 42,
left: {
value: 0,
left: undefined,
right: undefined,
},
right: undefined,
};
console.log(stringify(tree)); // Node(42, Node(0, Empty, Empty), Empty)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment