text: "use strict";
  
  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  exports.defer = defer;
  exports.splitPath = splitPath;
  exports.eachSeries = eachSeries;
  exports.foreach = foreach;
  exports.doIf = doIf;
  exports.asyncWhile = asyncWhile;
  exports.decodeVarint = decodeVarint;
  
  /********************************************************************************
   *   Ledger Node JS API
   *   (c) 2016-2017 Ledger
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   ********************************************************************************/
  function defer() {
    let resolve, reject;
    let promise = new Promise(function (success, failure) {
      resolve = success;
      reject = failure;
    });
    if (!resolve || !reject) throw "defer() error"; // this never happens and is just to make flow happy
  
    return {
      promise,
      resolve,
      reject
    };
  } // TODO use bip32-path library
  
  
  function splitPath(path) {
    let result = [];
    let components = path.split("/");
    components.forEach(element => {
      let number = parseInt(element, 10);
  
      if (isNaN(number)) {
        return; // FIXME shouldn't it throws instead?
      }
  
      if (element.length > 1 && element[element.length - 1] === "'") {
        number += 0x80000000;
      }
  
      result.push(number);
    });
    return result;
  } // TODO use async await
  
  
  function eachSeries(arr, fun) {
    return arr.reduce((p, e) => p.then(() => fun(e)), Promise.resolve());
  }
  
  function foreach(arr, callback) {
    function iterate(index, array, result) {
      if (index >= array.length) {
        return result;
      } else return callback(array[index], index).then(function (res) {
        result.push(res);
        return iterate(index + 1, array, result);
      });
    }
  
    return Promise.resolve().then(() => iterate(0, arr, []));
  }
  
  function doIf(condition, callback) {
    return Promise.resolve().then(() => {
      if (condition) {
        return callback();
      }
    });
  }
  
  function asyncWhile(predicate, callback) {
    function iterate(result) {
      if (!predicate()) {
        return result;
      } else {
        return callback().then(res => {
          result.push(res);
          return iterate(result);
        });
      }
    }
  
    return Promise.resolve([]).then(iterate);
  }
  
  function decodeVarint(stream, index) {
    let result = 0;
    let shift = 0;
    let pos = index; // eslint-disable-next-line no-constant-condition
  
    while (shift < 64) {
      const b = stream[pos];
      result |= (b & 0x7f) << shift;
      pos += 1;
  
      if (!(b & 0x80)) {
        result &= 0xffffffff;
        return {
          value: result,
          pos
        };
      }
  
      shift += 7;
    }
  
    throw new Error("Too many bytes when decoding varint.");
  }
  //# sourceMappingURL=utils.js.map