UNPKG

mingo

Version:

MongoDB query language for in-memory objects

40 lines (39 loc) 1.17 kB
import { computeValue } from "../../../core/_internal"; import { assert, isArray, isInteger, isNil } from "../../../util"; import { errExpectArray, errExpectNumber, INT_OPTS } from "../_internal"; const $slice = (obj, expr, options) => { assert( isArray(expr) && expr.length > 1 && expr.length < 4, "$slice expects array(3)" ); const foe = options.failOnError; const args = computeValue(obj, expr, null, options); const arr = args[0]; let skip = args[1]; let limit = args[2]; if (!isArray(arr)) return errExpectArray(foe, "$slice arg1 <array>"); if (!isInteger(skip)) return errExpectNumber(foe, "$slice arg2 <n>", INT_OPTS.int); if (!isNil(limit) && !isInteger(limit)) return errExpectNumber(foe, "$slice arg3 <n>", INT_OPTS.int); if (isNil(limit)) { if (skip < 0) { skip = Math.max(0, arr.length + skip); } else { limit = skip; skip = 0; } } else { if (skip < 0) { skip = Math.max(0, arr.length + skip); } if (limit < 1) { return errExpectNumber(foe, "$slice arg3 <n>", INT_OPTS.pos); } limit += skip; } return arr.slice(skip, limit); }; export { $slice };