class DepthFirstIterator implements Iterator<FileSystemItem> {
private stack = new Stack<FileSystemItem>()
constructor(root: Directroy) {
this.stack.push(root)
}
hasNext() {
return !stack.isEmpty()
}
next() {
if (!this.hasNext()) return
const current = this.stack.pop()
if (current instanceof Directory) {
const contents = current.getContents()
contents.reverse().forEach((item) => {
this.stack.push(item)
})
}
return current
}
}
class BreadthFirstIterator implements Iterator<FileSystemItem> {
private queue = new Queue<FileSystemItem>()
constructor(root: Directory) {
this.queue.offer(root)
}
hasNext() {
return !this.queue.isEmpty()
}
next() {
if (!this.hasNext()) return
const current = queue.poll()
if (current instanceof Directory) {
this.queue.addAll(current.getContents())
}
return current
}
}