Skip to content

Instantly share code, notes, and snippets.

@kittinunf
Created July 19, 2016 16:37
Show Gist options
  • Save kittinunf/5a487c87fb09662987bc4445108bf9c4 to your computer and use it in GitHub Desktop.
Save kittinunf/5a487c87fb09662987bc4445108bf9c4 to your computer and use it in GitHub Desktop.
struct Parent {
let id: Int
let children: [Int]
}
struct Node {
let id: Int
let parent: Int
let children: [Int]
}
func getNodes(id: Int) -> Observable<Node> {
switch id {
case 1:
return Observable.just(Node(id: 1, parent: 100, children: [3,4]))
case 2:
return Observable.just(Node(id: 2, parent: 100, children: [5,6]))
case 3:
return Observable.just(Node(id: 3, parent: 1, children: []))
case 4:
return Observable.just(Node(id: 4, parent: 1, children: []))
case 5:
return Observable.just(Node(id: 5, parent: 2, children: []))
case 6:
return Observable.just(Node(id: 6, parent: 2, children: [7]))
case 7:
return Observable.just(Node(id: 7, parent: 6, children: []))
default:
assert(true)
}
return Observable.just(Node(id: 0, parent: 0, children: []))
}
func getInnerNodes(n: Node) -> Observable<Node> {
if n.children.count > 0 {
return Observable.of(
Observable.just(n),
n.children.toObservable().flatMap(getNodes).flatMap(getInnerNodes)
).merge()
}
return Observable.just(n)
}
let parent = Parent(id: 100, children: [1,2])
parent.children.toObservable().flatMap(getNodes).flatMap(getInnerNodes).subscribeNext {
print($0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment