/******************************************************************************** * 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. ********************************************************************************/ //@flow type Defer = { promise: Promise, resolve: (T) => void, reject: (any) => void, }; export function defer(): 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 export function splitPath(path: string): number[] { 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 export function eachSeries(arr: A[], fun: (A) => Promise<*>): Promise<*> { return arr.reduce((p, e) => p.then(() => fun(e)), Promise.resolve()); } export function foreach( arr: T[], callback: (T, number) => Promise ): Promise { 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, [])); } export function doIf( condition: boolean, callback: () => any | Promise ): Promise { return Promise.resolve().then(() => { if (condition) { return callback(); } }); } export function asyncWhile( predicate: () => boolean, callback: () => Promise ): Promise> { function iterate(result) { if (!predicate()) { return result; } else { return callback().then((res) => { result.push(res); return iterate(result); }); } } return Promise.resolve([]).then(iterate); }