gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 4.3 kB
JavaScript
/*! Copyright 2023-2024 the gnablib contributors MPL-1.1 */
import{sNum as t}from"../safe/safe.js";const s=Symbol.for("nodejs.util.inspect.custom"),n="WindowStr",r=-1,i=[" ","\t","\n","\r","\v","\f"];export class WindowStr{constructor(t,s,n){this._src=t,this._start=s,this._len=n}get length(){return this._len}get empty(){return 0==this._len}toString(){return this._src.substring(this._start,this._start+this._len)}get[Symbol.toStringTag](){return n}[s](){return`${n}(${this._src.toString()}, ${this._start}, ${this._len})`}debug(){return`${n}(${this._src.toString()}, ${this._start}, ${this._len})`}charAt(s){t("idx",s).unsigned().lt(this.length).throwNot();const n=this._src.codePointAt(s+this._start);return String.fromCodePoint(n)}codePointAt(s){return t("idx",s).unsigned().lt(this.length).throwNot(),this._src.codePointAt(s+this._start)}endsWith(t){return this._src.endsWith(t,this._start+this._len)}indexOf(s,n){n?t("start",n).unsigned().atMost(this._len).throwNot():n=0;let i=this._src.indexOf(s,this._start+n);return i<0?r:(i-=this._start,i<=this._len-s.length?i:r)}indexOfAny(s,n){n?t("start",n).unsigned().atMost(this._len).throwNot():n=0;const i=this._start+this._len;let e=i;for(const t of s){const s=this._src.indexOf(t,this._start+n);s<0||(s+t.length>i||s<e&&(e=s))}return e==i?r:(e-=this._start,e)}lastIndexOf(s,n){null==n?n=this._len:t("length",n).unsigned().atMost(this._len).throwNot();const i=this._start+n-s.length;if(i<0)return r;let e=this._src.lastIndexOf(s,i);return e-=this._start,e<0?r:e}lastIndexOfAny(s,n){null==n?n=this._len:(t("length",n).unsigned().atMost(this._len).throwNot(),n+=this._start);let i=this._start-1;for(const t of s){const s=this._src.lastIndexOf(t,n-t.length);s<i||(i=s)}return i==this._start-1?r:(i-=this._start,i)}left(s){return t("length",s).unsigned().atMost(this.length).throwNot(),new WindowStr(this._src,this._start,s)}match(t){return this._src.substring(this._start,this._start+this._len).match(t)}peerOf(t){return this._src===t._src}getReset(){const t=this._start,s=this._len;return()=>{const n=this._start-t,r=this._len+this._start;return this._start=t,this._len=s,[n,r]}}right(s){t("length",s).unsigned().atMost(this.length).throwNot();const n=this._start+this._len-s;return new WindowStr(this._src,n,s)}shrink(s,n){return s?t("startBy",s).unsigned().atMost(this._len).throwNot():s=0,n?t("lengthBy",n).unsigned().atMost(this._len-s).throwNot():n=0,this._start+=s,this._len=this._len-s-n,this}span(s,n){return t("start",s).unsigned().atMost(this._len).throwNot(),null==n?n=this._len-s:t("length",n).unsigned().atMost(this._len-s).throwNot(),new WindowStr(this._src,this._start+s,n)}split(t,s){const n=[];if(0===s||0===t.length)return n;if(1===s)return[this.span(0)];s||(s=Number.MAX_SAFE_INTEGER),s-=1;let r=0,i=this.indexOf(t);for(;i>=0&&(n.push(this.span(r,i-r)),r=i+t.length,n.length!==s);)i=this.indexOf(t,r);return n.push(this.span(r)),n}startsWith(t){return this._src.startsWith(t,this._start)}substring(t,s){return s||(s=this._len),this._src.substring(this._start+t,this._start+s)}test(t){return t.test(this._src.substring(this._start,this._start+this._len))}trim(t){t||(t=i);t:for(;this._len>0;){for(const s of t)if(this._src.startsWith(s,this._start)){this._start+=s.length,this._len-=s.length;continue t}break}t:for(;this._len>0;){for(const s of t)if(this._src.endsWith(s,this._start+this._len)){this._len-=s.length;continue t}break}return this}trimEnd(t,s=0){t||(t=i);t:for(;this._len>0;){for(const n of t)if(this._src.endsWith(n,this._start+this._len)){if(this._len-=n.length,0==--s)break t;continue t}break}return this}trimStart(t,s=0){t||(t=i);t:for(;this._len>0;){for(const n of t)if(this._src.startsWith(n,this._start)){if(this._start+=n.length,this._len-=n.length,0==--s)break t;continue t}break}return this}[Symbol.iterator](){let t=this._start;const s=this._src,n=this._start+this._len;return{next:function(){if(t<n){const n=s.codePointAt(t++);return n>65535&&t++,{done:!1,value:String.fromCodePoint(n)}}return{done:!0,value:void 0}}}}static new(s,n,r){return s||(s=""),n?t("start",n).unsigned().atMost(s.length).throwNot():n=0,null==r?r=s.length-n:t("length",r).unsigned().atMost(s.length-n).throwNot(),new WindowStr(new String(s),n,r)}static coerce(t){return t instanceof WindowStr?t:new WindowStr(new String(t),0,t.length)}}