diff options
Diffstat (limited to 'node_modules/fbjs/lib/PromiseMap.js.flow')
-rw-r--r-- | node_modules/fbjs/lib/PromiseMap.js.flow | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/fbjs/lib/PromiseMap.js.flow b/node_modules/fbjs/lib/PromiseMap.js.flow new file mode 100644 index 000000000..d87f1ceb9 --- /dev/null +++ b/node_modules/fbjs/lib/PromiseMap.js.flow @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule PromiseMap + * @flow + */ + +'use strict'; + +const Deferred = require('./Deferred'); + +const invariant = require('./invariant'); + +/** + * A map of asynchronous values that can be get or set in any order. Unlike a + * normal map, setting the value for a particular key more than once throws. + * Also unlike a normal map, a key can either be resolved or rejected. + */ +class PromiseMap<Tvalue, Treason> { + _deferred: { [key: string]: Deferred<any, any> }; + + constructor() { + this._deferred = {}; + } + + get(key: string): Promise<any> { + return getDeferred(this._deferred, key).getPromise(); + } + + resolveKey(key: string, value: Tvalue): void { + const entry = getDeferred(this._deferred, key); + invariant(!entry.isSettled(), 'PromiseMap: Already settled `%s`.', key); + entry.resolve(value); + } + + rejectKey(key: string, reason: Treason): void { + const entry = getDeferred(this._deferred, key); + invariant(!entry.isSettled(), 'PromiseMap: Already settled `%s`.', key); + entry.reject(reason); + } +} + +function getDeferred(entries: { [key: string]: Deferred<any, any> }, key: string): Deferred<any, any> { + if (!entries.hasOwnProperty(key)) { + entries[key] = new Deferred(); + } + return entries[key]; +} + +module.exports = PromiseMap;
\ No newline at end of file |