{"version":3,"sources":["jsdelivr-header.js","/npm/@occami/gaps-islands@0.2.3/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OCSO,SAAS,aAAc,EAAQ,GACpC,MAAM,EAAS,EACZ,KAAI,EAAG,QAAO,MAAK,gBACJ,IAAV,EACK,CAAE,QAAO,OAEX,CAAE,QAAO,MAAK,WAEtB,KAAK,iBACF,EAAU,GAChB,IAAI,EAAS,EAAO,QACpB,QAAe,IAAX,EACF,OAAO,EAET,IAAK,MAAM,KAAS,EACd,EAAM,OAAS,EAAO,KACD,mBAAZ,IACT,EAAO,MAAQ,EAAQ,EAAQ,IAE7B,EAAO,IAAM,EAAM,MACrB,EAAO,IAAM,EAAM,OAGrB,EAAQ,KAAK,GACb,EAAS,GAIb,OADA,EAAQ,KAAK,GACN,CACT,CAUA,MAAM,OAAS,CAAC,EAAM,IAAkC,iBAAT,EAAoB,GAAK,EAAE,GAAwB,mBAAT,EAAsB,EAAO,SAQ/G,SAAS,YAAa,EAAQ,EAAU,CAAC,GAC9C,MAAM,EAA4B,OAAlB,EAAQ,MAClB,EAAc,OAAO,EAAQ,OAAO,GAAK,EAAE,QAC3C,EAAY,OAAO,EAAQ,KAAK,GAAK,EAAE,MACvC,EAAc,OAAO,EAAQ,OAAO,GAAK,IAO/C,OAAO,aANc,EAAO,KAAI,IAAK,CACnC,MAAO,EAAY,GACnB,IAAK,EAAU,GACf,MAAO,OAAU,EAAY,CAAC,EAAY,QAExB,OAAU,EAAY,CAAC,EAAQ,IAAW,EAAO,MAAM,OAAO,EAAO,OAE3F,QAQO,SAAS,SAAU,GACxB,MAAM,EAAM,aAAa,GACzB,GAAI,EAAI,OAAS,EAAG,MAAO,GAC3B,MAAM,EAAM,GACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,EAAI,KAAK,CACP,MAAO,EAAI,EAAI,GAAG,IAClB,IAAK,EAAI,GAAG,QAGhB,OAAO,CACT,CASA,SAAS,gBAAiB,EAAG,GAC3B,OAAI,EAAE,QAAU,EAAE,MAAc,EAAE,MAAQ,EAAE,MAAQ,GAAK,EACrD,EAAE,MAAQ,EAAE,IAAY,EAAE,IAAM,EAAE,IAAM,GAAK,EAC1C,CACT","file":"/npm/@occami/gaps-islands@0.2.3/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@occami/gaps-islands@0.2.3/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @typedef RangeType\n * @property {number|Date} start begining of the range\n * @property {number|Date} end end of the range\n * @property {any} [value] optional data property\n */\n/** @typedef {Object.<string, any> & RangeType} Range */\n\n/**\n * Discovers gaps and islands in an array or ranges.\n * A range has a *start*, *end* and optionally a *value* property.\n * @param {Range[]} ranges array of ranges\n * @param {Function} [reducer] reduces the value property of ranges that get merged into islands\n * @returns {Range[]}\n */\nexport function mergeIslands (ranges, reducer) {\n  const sorted = ranges\n    .map(({ start, end, value }) => {\n      if (value === undefined) {\n        return { start, end }\n      }\n      return { start, end, value }\n    })\n    .sort(startComperator)\n  const results = []\n  let island = sorted.shift()\n  if (island === undefined) {\n    return results\n  }\n  for (const range of sorted) {\n    if (range.start <= island.end) {\n      if (typeof reducer === 'function') {\n        island.value = reducer(island, range)\n      }\n      if (island.end < range.end) {\n        island.end = range.end\n      }\n    } else {\n      results.push(island)\n      island = range\n    }\n  }\n  results.push(island)\n  return results\n}\n\n/**\n * @typedef RangePicker\n * @property {string|function():number|Date} [start]\n * @property {string|function():number|Date} [end]\n * @property {string|null|function():any} [value]\n */\n\n/** Allows findIsland options to be a string, a function or undefined.  */\nconst picker = (prop, defaultPicker) => typeof prop === 'string' ? x => x[prop] : typeof prop === 'function' ? prop : defaultPicker\n\n/**\n * Finds islands of overlapping ranges, storing the original range data in the islands value property. \n * @param {any[]} ranges \n * @param {RangePicker} [options]\n * @returns {Range[]}\n */\nexport function findIslands (ranges, options = {}) {\n  const noValue = options.value === null\n  const startPicker = picker(options.start, x => x.start)\n  const endPicker = picker(options.end, x => x.end)\n  const valuePicker = picker(options.value, x => x)\n  const mappedRanges = ranges.map(r => ({\n    start: startPicker(r),\n    end: endPicker(r),\n    value: noValue ? undefined : [valuePicker(r)]\n  }))\n  const concatenate = noValue ? undefined : (range1, range2) => range1.value.concat(range2.value)\n  return mergeIslands(mappedRanges, concatenate)\n}\n\n/**\n * Lists gaps between ranges\n * @param {Range[]} ranges array of ranges\n * @returns {Range[]} the gaps between ranges.\n * Gaps don't have value properties\n */\nexport function findGaps (ranges) {\n  const isl = mergeIslands(ranges)\n  if (isl.length < 2) return []\n  const res = []\n  for (let i = 1; i < isl.length; i++) {\n    res.push({\n      start: isl[i - 1].end,\n      end: isl[i].start\n    })\n  }\n  return res\n}\n\n/**\n * Sort comperator acting on the start property of a range object.\n * If both start values are identical, the end values are compared.\n * @param {Range} a\n * @param {Range} b\n * @returns {number}\n */\nfunction startComperator (a, b) {\n  if (a.start !== b.start) return a.start > b.start ? 1 : -1\n  if (a.end !== b.end) return a.end > b.end ? 1 : -1\n  return 0\n}\n"]}