@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 954 B
JavaScript
import*as Platform from"../platform/platform.js";export class Segment{begin;end;data;constructor(e,n,t){if(e>n)throw new Error("Invalid segment");this.begin=e,this.end=n,this.data=t}intersects(e){return this.begin<e.end&&e.begin<this.end}}export class SegmentedRange{#e;#n;constructor(e){this.#e=[],this.#n=e}append(e){let n=Platform.ArrayUtilities.lowerBound(this.#e,e,((e,n)=>e.begin-n.begin)),t=n,s=null;if(n>0){const t=this.#e[n-1];s=this.tryMerge(t,e),s?(--n,e=s):this.#e[n-1].end>=e.begin&&(e.end<t.end&&this.#e.splice(n,0,new Segment(e.end,t.end,t.data)),t.end=e.begin)}for(;t<this.#e.length&&this.#e[t].end<=e.end;)++t;t<this.#e.length&&(s=this.tryMerge(e,this.#e[t]),s?(t++,e=s):e.intersects(this.#e[t])&&(this.#e[t].begin=e.end)),this.#e.splice(n,t-n,e)}appendRange(e){e.segments().forEach((e=>this.append(e)))}segments(){return this.#e}tryMerge(e,n){const t=this.#n&&this.#n(e,n);return t?(t.begin=e.begin,t.end=Math.max(e.end,n.end),t):null}}