import {Color, TreeNode} from "./Node"; import {NodeFactory, RedBlackTree} from "./RedBlackTree"; import {TreeLevel} from "./TreeLevel"; export class TreeBuilder { private readonly nodeFactory: NodeFactory; private readonly tree: RedBlackTree; constructor(nodeFactory: NodeFactory, comparator: (o1: T, o2: T) => number) { this.tree = new RedBlackTree(nodeFactory, comparator); this.nodeFactory = nodeFactory; } static empty(nodeFactory: NodeFactory, comparator: (o1: T, o2: T) => number): TreeBuilder { return new TreeBuilder(nodeFactory, comparator); } setRootNode(value: T, levelBuilder?: (level: TreeLevel) => void): TreeBuilder { const node = new TreeNode(value, Color.BLACK); this.tree.setRoot(node); if(levelBuilder != null) { levelBuilder(new TreeLevel(node, this.nodeFactory)); } return this; } build(): RedBlackTree { return this.tree; } }