| 283 | } |
| 284 | |
| 285 | export function createObservable<T>() { |
| 286 | const onDidChange = new EventEmitter<T>(); |
| 287 | const promise = createDeferred<void>(); |
| 288 | // No dangling promises. |
| 289 | promise.promise.catch(noop); |
| 290 | return { |
| 291 | get onDidChange() { |
| 292 | return onDidChange.event; |
| 293 | }, |
| 294 | get done() { |
| 295 | return promise.promise; |
| 296 | }, |
| 297 | resolve: promise.resolve.bind(promise), |
| 298 | reject: promise.reject.bind(promise), |
| 299 | fire: onDidChange.fire.bind(onDidChange), |
| 300 | dispose: () => { |
| 301 | onDidChange.dispose(); |
| 302 | } |
| 303 | }; |
| 304 | } |