function generateKeyBetween(a, b, digits) {
if (a !== null) {
validateOrderKey(a)
}
if (b !== null) {
validateOrderKey(b)
}
if (a !== null && b !== null && a >= b) {
throw new Error(a + ' >= ' + b)
}
if (a === null && b === null) {
return INTEGER_ZERO
}
if (a === null) {
const ib = getIntegerPart(b)
const fb = b.slice(ib.length)
if (ib === SMALLEST_INTEGER) {
return ib + midpoint('', fb, digits)
}
return ib < b ? ib : decrementInteger(ib, digits)
}
if (b === null) {
const ia = getIntegerPart(a)
const fa = a.slice(ia.length)
const i = incrementInteger(ia, digits)
return i === null ? ia + midpoint(fa, null, digits) : i
}
const ia = getIntegerPart(a)
const fa = a.slice(ia.length)
const ib = getIntegerPart(b)
const fb = b.slice(ib.length)
if (ia === ib) {
return ia + midpoint(fa, fb, digits)
}
const i = incrementInteger(ia, digits)
return i < b ? i : ia + midpoint(fa, null, digits)
}