2/ Experiment (not yet sure if I like it):
type CTree = CTreeNode | CEmptyTree;
class CTreeNode {
left: CTree;
right: CTree;
value: string;
}
class CEmptyTree {}
// DU version:
type DUTree = DUTreeNode | DUEmptyTree;
type DUTreeNode = {
kind: 'DUTreeNode',
left: DUTree,
right: DUTree,
value: string,
};
type DUEmptyTree = {
kind: 'DUEmptyTree',
};