A `Filename root` is anchored in `root`. We use a `data` type so that Idris can easily infer `root` when passing a `FileName` around. We do not use a `record` because we do not want to allow users to manufacture their own `FileName`. To get an absolute path, we need to append said filename to the root. Totality: total Constructor:
A `Tree root` is the representation of a directory tree anchored in `root`. Each directory contains a list of files and a list of subtrees waiting to be explored. The fact these subtrees are IO-bound means the subtrees will be lazily constructed on demand. Totality: total
Display a tree by printing it procedurally. Note that because directory trees contain suspended computations corresponding to their subtrees this has to be an `IO` function. We make it return Unit rather than a String because we do not want to assume that the tree is finite.