blob: a91598b4611619d49c6e633df19b3b06f6be1616 [file] [log] [blame]
// Like Object.values but with a stronger return type.
export function values<T extends {[key: string]: any}, K extends keyof T>(
o: T
): Required<T>[K][] {
return Object.values(o);
}
// Like Object.entries but with a stronger return type.
export function entries<T extends {[key: string]: any}, K extends keyof T>(
o: T
): [keyof T, Required<T>[K]][] {
return Object.entries(o);
}
// Wraps text to the given maximum width, preserving existing newlines.
export function wordWrap(text: string, width: number): string {
function wrap(line: string): string {
const words = line.split(' ');
let lineLength = 0;
const withNewlines = words.map(w => {
lineLength += w.length + 1;
if (lineLength > width) {
lineLength = w.length;
return '\n' + w;
}
return w;
});
return withNewlines.join(' ');
}
const lines = text.split('\n');
return lines.map(wrap).join('\n');
}
// A type for timeout IDs.
export type Timeout = ReturnType<typeof setTimeout>;
// Wraps a promise with a timeout, in milliseconds.
export function withTimeout<T>(
ms: number,
errMsg: string,
promise: Promise<T>
): Promise<T> {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
reject(new Error(errMsg));
}, ms);
promise.then(
(res: T) => {
clearTimeout(timeout);
resolve(res);
},
err => {
clearTimeout(timeout);
reject(err);
}
);
});
}