async function retryP<L, R> (
fn: () => Promise<Either<L, R>>,
wait = 2000,
retries = 2
): Promise<Either<L, R>> {
const either = await fn();
const retry = either.isLeft() && retries > 0;
if (retry) {
return new Promise(resolve => setTimeout(resolve, wait))
.then(() => retryP(fn, wait, retries - 1));
}
return either;
}