Skip to content

Instantly share code, notes, and snippets.

@oisdk
Last active August 29, 2015 14:25
Show Gist options
  • Save oisdk/a4e40a7c0838cb8bcab0 to your computer and use it in GitHub Desktop.
Save oisdk/a4e40a7c0838cb8bcab0 to your computer and use it in GitHub Desktop.
// You could just order the elements into an array, and then return that array's generator
extension Tree {
func inOrder() -> [Element] {
switch self {
case let .Node(_,l,e,r): return l.inOrder() + [e] + r.inOrder()
case .Empty: return []
}
}
}
// You can still do it lazily with generators, though.
extension Tree : SequenceType {
func generate() -> AnyGenerator<Element> {
switch self {
case .Empty: return anyGenerator { nil }
case let .Node(_, l, e, r):
var (g, crossed) = (l.generate(), false)
return anyGenerator {
if let next = g.next() { return next }
if crossed { return nil }
(g, crossed) = (r.generate(), true)
return e
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment