---
children:
  - label: 'I have one existing Observable, and'
    children:
    - label: I want to change each emitted value
      children:
      - label: to be a constant value
        children:
        - label: mapTo
      - label: to be a value calculated through a formula
        children:
        - label: map
    - label: I want to pick a property off each emitted value
      children:
      - label: pluck
    - label: I want to spy the values being emitted without affecting them
      children:
      - label: do
    - label: I want to allow some values to pass
      children:
      - label: based on custom logic
        children:
        - label: filter
      - label: if they are at the start of the Observable
        children:
        - label: and only the first value
          children:
          - label: first
        - label: based on a given amount
          children:
          - label: take
        - label: based on custom logic
          children:
          - label: takeWhile
      - label: if they are exactly the n-th emission
        children:
        - label: elementAt
      - label: if they are at the end of the Observable
        children:
        - label: and only the last value
          children:
          - label: last
        - label: based on a given amount
          children:
          - label: takeLast
      - label: until another Observable emits a value
        children:
        - label: takeUntil
    - label: I want to ignore values
      children:
      - label: altogether
        children:
        - label: ignoreElements
      - label: from the start of the Observable
        children:
        - label: based on a given amount
          children:
          - label: skip
        - label: based on custom logic
          children:
          - label: skipWhile
      - label: from the end of the Observable
        children:
        - label: skipLast
      - label: until another Observable emits a value
        children:
        - label: skipUntil
      - label: that match some previous value
        children:
        - label: according to value equality
          children:
          - label: emitted just before the current value
            children:
            - label: distinctUntilChanged
          - label: emitted some time in the past
            children:
            - label: distinct
        - label: according to a key or object property
          children:
          - label: emitted just before the current value
            children:
            - label: distinctUntilKeyChanged
      - label: that occur too frequently
        children:
        - label: by emitting the first value in each time window
          children:
          - label: "where time windows are determined by another Observable's emissions"
            children:
            - label: throttle
          - label: where time windows are determined by a time duration
            children:
            - label: throttleTime
        - label: by emitting the last value in each time window
          children:
          - label: "where time windows are determined by another Observable's emissions"
            children:
            - label: audit
          - label: where time windows are determined by a time duration
            children:
            - label: auditTime
        - label: by emitting the last value as soon as enough silence has occured
          children:
          - label: where the silence duration threshold is determined by another Observable"
            children:
            - label: debounce
          - label: where the silence duration threshold is determined by a time duration
            children:
            - label: debounceTime
    - label: I want to compute a formula using all values emitted
      children:
      - label: and only output the final computed value
        children:
        - label: reduce
      - label: and output the computed values when the source emits a value
        children:
        - label: scan
      - label: and output the computed values as a nested Observable when the source emits a value
        children:
        - label: mergeScan
    - label: I want to wrap its messages with metadata
      children:
      - label: that describes each notification (next, error, or complete)
        children:
        - label: materialize
      - label: that includes the time past since the last emitted value
        children:
        - label: timeInterval
    - label: after a period of inactivity
      children:
      - label: I want to throw an error
        children:
        - label: timeout
      - label: I want to switch to another Observable
        children:
        - label: timeoutWith
    - label: I want to ensure there is only one value
      children:
      - label: single
    - label: I want to know how many values it emits
      children:
      - label: count
    - label: I want to prepend one value
      children:
      - label: startWith
    - label: I want to delay the emissions
      children:
      - label: based on a given amount of time
        children:
        - label: delay
      - label: based on the emissions of another Observable
        children:
        - label: delayWhen
    - label: I want to group the values
      children:
      - label: until the Observable completes
        children:
        - label: and convert to an array
          children:
          - label: toArray
        - label: and convert to a Promise
          children:
          - label: toPromise
      - label: consecutively in pairs, as arrays
        children:
        - label: pairwise
      - label: 'based on a criterion, and output two Observables: those that match the criterion and those that do not'
        children:
        - label: partition
      - label: in batches of a particular size
        children:
        - label: and emit the group as an array
          children:
          - label: bufferCount
        - label: and emit the group as a nested Observable
          children:
          - label: windowCount
      - label: based on time
        children:
        - label: and emit the group as an array
          children:
          - label: bufferTime
        - label: and emit the group as a nested Observable
          children:
          - label: windowTime
      - label: until another Observable emits
        children:
        - label: and emit the group as an array
          children:
          - label: buffer
        - label: and emit the group as a nested Observable
          children:
          - label: window
      - label: based on the emissions of an Observable created on-demand
        children:
        - label: and emit the group as an array
          children:
          - label: bufferWhen
        - label: and emit the group as a nested Observable
          children:
          - label: windowWhen
      - label: based on another Observable for opening a group, and an Observable for closing a group
        children:
        - label: and emit the group as an array
          children:
          - label: bufferToggle
        - label: and emit the group as a nested Observable
          children:
          - label: windowToggle
      - label: based on a key calculated from the emitted values
        children:
        - label: groupBy
    - label: I want to start a new Observable for each value
      children:
      - label: and emit the values from all nested Observables in parallel
        children:
        - label: where the nested Observable is the same for every value
          children:
          - label: mergeMapTo
        - label: where the nested Observable is calculated for each value
          children:
          - label: mergeMap
      - label: and emit the values from each nested Observable in order
        children:
        - label: where the nested Observable is the same for every value
          children:
          - label: concatMapTo
        - label: where the nested Observable is calculated for each value
          children:
          - label: concatMap
      - label: and cancel the previous nested Observable when a new value arrives
        children:
        - label: where the nested Observable is the same for every value
          children:
          - label: switchMapTo
        - label: where the nested Observable is calculated for each value
          children:
          - label: switchMap
      - label: and ignore incoming values while the current nested Observable has not yet completed
        children:
        - label: exhaustMap
      - label: and recursively start a new Observable for each new value
        children:
        - label: expand
    - label: I want to perform custom operations without breaking the chained calls API
      children:
      - label: let
    - label: I want to share a subscription between multiple subscribers
      children:
      - label: using a conventional Subject
        children:
        - label: and start it as soon as the first subscriber arrives
          children:
          - label: share
        - label: and start it manually or imperatively
          children:
          - label: publish
      - label: using a BehaviorSubject
        children:
        - label: publishBehavior
      - label: using a ReplaySubject
        children:
        - label: publishReplay
      - label: using an AsyncSubject
        children:
        - label: publishLast
      - label: using a specific subject implementation
        children:
        - label: multicast
      - label: and make it behave like a cache
        children:
        - label: cache
    - label: when an error occurs
      children:
      - label: I want to start a new Observable
        children:
        - label: catch
      - label: I want to re-subscribe
        children:
        - label: immediately
          children:
          - label: retry
        - label: when another Observable emits
          children:
          - label: retryWhen
    - label: when it completes
      children:
      - label: I want to re-subscribe
        children:
          - label: immediately
            children:
            - label: repeat
          - label: when another Observable emits
            children:
            - label: repeatWhen
      - label: I want to start a new Observable
        children:
        - label: concat
    - label: when it completes, errors or unsubscribes, I want to execute a function
      children:
      - label: finally
    - label: I want to change the scheduler
      children:
      - label: that routes calls to subscribe
        children:
        - label: subscribeOn
      - label: that routes values to observers
        children:
        - label: observeOn
    - label: I want to combine this Observable with others, and
      children:
      - label: I want to receive values only from the Observable that emits a value first
        children:
        - label: race
      - label: I want to output the values from either of them
        children:
        - label: merge
      - label: I want to output a value computed from values of the source Observables
        children:
        - label: using the latest value of each source whenever any source emits
          children:
          - label: combineLatest
        - label: using the latest value of each source only when the primary Observable emits
          children:
          - label: withLatestFrom
        - label: using each source value only once
          children:
          - label: zip
  - label: 'I have some Observables to combine together as one Observable, and'
    children:
    - label: I want to receive values only from the Observable that emits a value first
      children:
      - label: Observable.race
    - label: I want to be notified when all of them have completed
      children:
      - label: Observable.forkJoin
    - label: I want to output the values from either of them
      children:
      - label: Observable.merge
    - label: I want to output a value computed from values of the source Observables
      children:
      - label: using the latest value of each source whenever any source emits
        children:
        - label: Observable.combineLatest
      - label: using each source value only once
        children:
        - label: Observable.zip
    - label: I want to subscribe to each in order
      children:
      - label: Observable.concat
  - label: 'I have no Observables yet, and'
    children:
    - label: I want to create a new Observable
      children:
      - label: using custom logic
        children:
        - label: Observable.create
      - label: using a state machine similar to a for loop
        children:
        - label: Observable.generate
      - label: that throws an error
        children:
        - label: Observable.throw
      - label: that just completes, without emitting values
        children:
        - label: Observable.empty
      - label: that never emits anything
        children:
        - label: Observable.never
      - label: from an existing source of events
        children:
        - label: coming from the DOM or Node.js or similar
          children:
          - label: Observable.fromEvent
        - label: that uses an API to add and remove event handlers
          children:
          - label: Observable.fromEventPattern
      - label: from an ES6 Promise
        children:
        - label: Observable.fromPromise
      - label: from a Promise or an event source or an array
        children:
        - label: Observable.from
      - label: that iterates
        children:
        - label: over the values in an array
          children:
          - label: Observable.fromArray
        - label: over values in a numeric range
          children:
          - label: Observable.range
        - label: over prefined values given as arguments
          children:
          - label: Observable.of
      - label: that emits values on a timer
        children:
        - label: regularly
          children:
          - label: Observable.interval
        - label: with an optional initial delay
          children:
          - label: Observable.timer
      - label: which is built on demand when subscribed
        children:
        - label: Observable.defer
    - label: I want to convert a callback to an Observable
      children:
      - label: supporting a conventional callback API
        children:
        - label: Observable.bindCallback
      - label: supporting Node.js callback style API
        children:
        - label: Observable.bindNodeCallback
