text: /**
   * Copyright (c) Facebook, Inc. and its affiliates.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   *
   * 
   * @format
   */
  
  'use strict';
  
  
  
  
  
  
  
  
  
  /**
                 * A promise-like object that only creates the underlying value lazily
                 * when requested.
                 */
  exports.LazyPromise = class LazyPromise {
  
  
    constructor(factory) {
      //$FlowIssue #16209141
      Object.defineProperty(this, '_promise', {
        configurable: true,
        enumerable: true,
        get: () => this._promise = factory(),
        set: value => Object.defineProperty(this, '_promise', { value }) });
  
    }
  
    then(
    fulfilled,
    rejected)
    {
      return this._promise.then(fulfilled, rejected);
    }
  
    catch(rejected) {
      return this._promise.catch(rejected);
    }};
  
  
  /**
         * A promise-like object that allows only one `.then()` handler to access
         * the wrapped value simultaneously. Can be used to lock resources that do
         * asynchronous work.
         */
  exports.LockingPromise = class LockingPromise {
  
  
  
    constructor(promise) {
      this._gate = this._promise = promise;
    }
  
    then(
    fulfilled,
    rejected)
    {
      const whenUnlocked = () => {
        const promise = this._promise.then(fulfilled, rejected);
        this._gate = promise.then(empty); // avoid retaining the result of promise
        return promise;
      };
  
      return this._gate.then(whenUnlocked, whenUnlocked);
    }
  
    catch(rejected) {
      return this._promise.catch(rejected);
    }};
  
  
  function empty() {}