Couldn't this be rewritten to use a `lazy val`? Here's an attempt:

```
lazy val uf: UnionFind[Symbol] = linkSymbols(new UnionFind(), allSymbols, new HashSet[Symbol]())
```

You'd need to add the disjoint-set as a parameter and return the initialized one from `linkSymbol`, but the details of safe initialization are handled by the language. WDYT?