diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
commit | de98e0b232509d5f40c135d540a70e415272ff85 (patch) | |
tree | a79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/fbjs/lib/PromiseMap.js.flow | |
parent | e0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff) |
node_modules
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 |