Skip to content

Instantly share code, notes, and snippets.

@oisdk
Created August 22, 2015 01:36
Show Gist options
  • Save oisdk/c4174a6520eb42359e57 to your computer and use it in GitHub Desktop.
Save oisdk/c4174a6520eb42359e57 to your computer and use it in GitHub Desktop.
extension Tree : SequenceType {
public func generate() -> AnyGenerator<Element> {
var stack: [Tree<Element>] = []
var curr = self
return anyGenerator {
while case let .Node(_, l, _, _) = curr {
stack.append(curr)
curr = l
}
if case let .Node(_, _, x, r)? = stack.popLast() {
curr = r
return x
}
return nil
}
}
}
public struct TreeGenerator<Element : Comparable> : GeneratorType {
private var (stack, curr): ([Tree<Element>], Tree<Element>)
public mutating func next() -> Element? {
while case let .Node(_, l, x, r) = curr {
if case .Empty = l {
curr = r
return x
}
stack.append(curr)
curr = l
}
if case let .Node(_, _, x, r)? = stack.popLast() {
curr = r
return x
}
return nil
}
}
extension Tree : SequenceType {
func generate() -> TreeGenerator<Element> {
return TreeGenerator(stack: [], curr: self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment