vscroll 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +17 -16
- package/dist/bundles/vscroll.esm5.js +107 -103
- package/dist/bundles/vscroll.esm5.js.map +1 -1
- package/dist/bundles/vscroll.esm5.min.js +2 -2
- package/dist/bundles/vscroll.esm5.min.js.map +1 -1
- package/dist/bundles/vscroll.esm6.js +104 -103
- package/dist/bundles/vscroll.esm6.js.map +1 -1
- package/dist/bundles/vscroll.esm6.min.js +2 -2
- package/dist/bundles/vscroll.esm6.min.js.map +1 -1
- package/dist/bundles/vscroll.umd.js +108 -104
- package/dist/bundles/vscroll.umd.js.map +1 -1
- package/dist/bundles/vscroll.umd.min.js +2 -2
- package/dist/bundles/vscroll.umd.min.js.map +1 -1
- package/dist/esm2015/classes/domRoutines.js +82 -69
- package/dist/esm2015/classes/domRoutines.js.map +1 -1
- package/dist/esm2015/classes/logger.js +2 -2
- package/dist/esm2015/classes/logger.js.map +1 -1
- package/dist/esm2015/classes/paddings.js +5 -5
- package/dist/esm2015/classes/paddings.js.map +1 -1
- package/dist/esm2015/classes/viewport.js +9 -21
- package/dist/esm2015/classes/viewport.js.map +1 -1
- package/dist/esm2015/interfaces/index.js.map +1 -1
- package/dist/esm2015/interfaces/routines.js +2 -0
- package/dist/esm2015/interfaces/routines.js.map +1 -0
- package/dist/esm2015/scroller.js +3 -3
- package/dist/esm2015/scroller.js.map +1 -1
- package/dist/esm2015/version.js +1 -1
- package/dist/esm2015/version.js.map +1 -1
- package/dist/esm2015/workflow.js +2 -2
- package/dist/esm2015/workflow.js.map +1 -1
- package/dist/esm5/classes/domRoutines.js +85 -69
- package/dist/esm5/classes/domRoutines.js.map +1 -1
- package/dist/esm5/classes/logger.js +2 -2
- package/dist/esm5/classes/logger.js.map +1 -1
- package/dist/esm5/classes/paddings.js +5 -5
- package/dist/esm5/classes/paddings.js.map +1 -1
- package/dist/esm5/classes/viewport.js +9 -21
- package/dist/esm5/classes/viewport.js.map +1 -1
- package/dist/esm5/interfaces/index.js.map +1 -1
- package/dist/esm5/interfaces/routines.js +2 -0
- package/dist/esm5/interfaces/routines.js.map +1 -0
- package/dist/esm5/scroller.js +3 -3
- package/dist/esm5/scroller.js.map +1 -1
- package/dist/esm5/version.js +1 -1
- package/dist/esm5/version.js.map +1 -1
- package/dist/esm5/workflow.js +2 -2
- package/dist/esm5/workflow.js.map +1 -1
- package/dist/typings/classes/domRoutines.d.ts +21 -19
- package/dist/typings/classes/logger.d.ts +1 -1
- package/dist/typings/classes/paddings.d.ts +2 -2
- package/dist/typings/classes/viewport.d.ts +1 -4
- package/dist/typings/interfaces/index.d.ts +2 -1
- package/dist/typings/interfaces/routines.d.ts +154 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll |
|
|
2
|
+
* vscroll (FESM2015) by Denis Hilt | https://github.com/dhilt/vscroll | 2022-01-22T00:43:21.975Z | MIT license
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
class e{constructor(e,t){this.id=0,void 0!==e&&(this.value=e,this.initialValue=e),this.options=t||{},this.subscriptions=new Map}set(e){if(this.value!==e||this.options.emitEqual){this.value=e;for(const[,t]of this.subscriptions)if(t.emit(e),this.value!==e)break}}get(){return this.value}on(e){const t=this.id++,s={emit:e,off:()=>{s.emit=()=>null,this.subscriptions.delete(t)}};return this.subscriptions.set(t,s),this.options.emitOnSubscribe&&s.emit(this.value),()=>s.off()}once(e){const t=this.on((s=>{t(),e(s)}));return t}reset(){this.set(this.initialValue)}dispose(){this.subscriptions.forEach((e=>e.off()))}}var t,s;!function(e){e.id="id",e.mock="mock",e.augmented="augmented",e.version="version",e.init="init",e.init$="init$",e.packageInfo="packageInfo",e.itemsCount="itemsCount",e.bufferInfo="bufferInfo",e.isLoading="isLoading",e.isLoading$="isLoading$",e.loopPending="loopPending",e.loopPending$="loopPending$",e.firstVisible="firstVisible",e.firstVisible$="firstVisible$",e.lastVisible="lastVisible",e.lastVisible$="lastVisible$",e.bof="bof",e.bof$="bof$",e.eof="eof",e.eof$="eof$",e.reset="reset",e.reload="reload",e.append="append",e.prepend="prepend",e.check="check",e.remove="remove",e.clip="clip",e.insert="insert",e.replace="replace",e.update="update",e.fix="fix",e.relax="relax",e.showLog="showLog"}(t||(t={})),function(e){e[e.Scalar=0]="Scalar",e[e.Reactive=1]="Reactive",e[e.WorkflowRunner=2]="WorkflowRunner",e[e.Function=3]="Function"}(s||(s={}));const i=t,r=s,n=()=>null,o={immediate:!0,success:!0,details:"Adapter is not initialized"},a=()=>Promise.resolve(o),l={core:{name:"",version:""},consumer:{name:"",version:""}},c={firstIndex:NaN,lastIndex:NaN,minIndex:NaN,maxIndex:NaN,absMinIndex:-1/0,absMaxIndex:1/0,defaultSize:NaN},d={data:{},element:{}},h=()=>[{type:r.Scalar,name:i.id,value:0,permanent:!0},{type:r.Scalar,name:i.mock,value:!0,permanent:!0},{type:r.Scalar,name:i.augmented,value:!1,permanent:!0},{type:r.Scalar,name:i.version,value:"",permanent:!0},{type:r.Scalar,name:i.init,value:!1,reactive:i.init$},{type:r.Scalar,name:i.packageInfo,value:l,onDemand:!0},{type:r.Scalar,name:i.itemsCount,value:0,onDemand:!0},{type:r.Scalar,name:i.bufferInfo,value:c,onDemand:!0},{type:r.Scalar,name:i.isLoading,value:!1,reactive:i.isLoading$},{type:r.Scalar,name:i.loopPending,value:!1,reactive:i.loopPending$},{type:r.Scalar,name:i.firstVisible,value:d,reactive:i.firstVisible$,wanted:!0},{type:r.Scalar,name:i.lastVisible,value:d,reactive:i.lastVisible$,wanted:!0},{type:r.Scalar,name:i.bof,value:!1,reactive:i.bof$},{type:r.Scalar,name:i.eof,value:!1,reactive:i.eof$},{type:r.WorkflowRunner,name:i.reset,value:a},{type:r.WorkflowRunner,name:i.reload,value:a},{type:r.WorkflowRunner,name:i.append,value:a},{type:r.WorkflowRunner,name:i.prepend,value:a},{type:r.WorkflowRunner,name:i.check,value:a},{type:r.WorkflowRunner,name:i.remove,value:a},{type:r.WorkflowRunner,name:i.clip,value:a},{type:r.WorkflowRunner,name:i.insert,value:a},{type:r.WorkflowRunner,name:i.replace,value:a},{type:r.WorkflowRunner,name:i.update,value:a},{type:r.WorkflowRunner,name:i.fix,value:a},{type:r.Function,name:i.relax,value:n},{type:r.Function,name:i.showLog,value:n},{type:r.Reactive,name:i.init$,value:new e},{type:r.Reactive,name:i.isLoading$,value:new e},{type:r.Reactive,name:i.loopPending$,value:new e},{type:r.Reactive,name:i.firstVisible$,value:new e(d,{emitOnSubscribe:!0})},{type:r.Reactive,name:i.lastVisible$,value:new e(d,{emitOnSubscribe:!0})},{type:r.Reactive,name:i.bof$,value:new e},{type:r.Reactive,name:i.eof$,value:new e}],u=new Map;var f={name:"vscroll",version:"1.4.3"};let p=0;class g{constructor(e){const{mock:i,reactive:r}=e,n=++p,o={configurable:!0},a={};Object.defineProperty(this,t.id,Object.assign({get:()=>n},o)),Object.defineProperty(this,t.mock,Object.assign({get:()=>i},o)),Object.defineProperty(this,t.augmented,Object.assign({get:()=>!1},o)),Object.defineProperty(this,t.version,Object.assign({get:()=>f.version},o)),h().filter((({permanent:e})=>!e)).forEach((({name:e,value:t,type:i})=>{if(r&&i===s.Reactive){const s=r[e];s&&(a[e]=Object.assign(Object.assign({},s),{default:t}),t=s.source)}Object.defineProperty(this,e,Object.assign({get:()=>t},o))})),r&&u.set(n,a)}}class m{constructor(e,t){this.get=e.get,e.settings&&(this.settings=e.settings),e.devSettings&&(this.devSettings=e.devSettings);const s=new g(t||{mock:!1});this.adapter=s}dispose(){u.delete(this.adapter.id)}}const x=e=>class extends m{constructor(t){super(t,"function"==typeof e?e():void 0)}},b=x();var I,w,v;!function(e){e.forward="forward",e.backward="backward"}(I||(I={})),function(e){e.Average="average",e.Constant="constant",e.Frequent="frequent"}(w||(w={})),function(e){e.number="must be a number",e.integer="must be an integer",e.integerUnlimited="must be an integer or infinity",e.moreOrEqual="must be a number greater than (or equal to) {arg1}",e.itemList="must be an array of items {arg1}",e.boolean="must be a boolean",e.object="must be an object",e.element="must be an html element",e.function="must be a function",e.funcOfxArguments="must have {arg1} argument(s)",e.funcOfxAndMoreArguments="must have at least {arg1} argument(s)",e.funcOfXToYArguments="must have {arg1} to {arg2} arguments",e.oneOfCan="can be present as only one item of {arg1} list",e.oneOfMust="must be present as only one item of {arg1} list",e.or="must satisfy at least 1 validator from {arg1} list",e.enum="must belong to {arg1} list"}(v||(v={}));const y=(e,t)=>(t||[""]).reduce(((e,t,s)=>e.replace(`{arg${s+1}}`,t)),e),S=e=>"number"==typeof e||"string"==typeof e&&""!==e?Number(e):NaN,z=e=>{const t=S(e),s=[];return Number.isNaN(t)&&s.push(v.number),{value:t,isSet:!0,isValid:!s.length,errors:s}},k=(e,t)=>s=>{const i=z(s);if(!i.isValid)return i;let r=i.value;const n=[];return r<e&&(t?r=e:n.push(y(v.moreOrEqual,[String(e)]))),{value:r,isSet:!0,isValid:!n.length,errors:n}},$=e=>{const t=[];return"function"!=typeof e&&t.push(v.function),{value:e,isSet:!0,isValid:!t.length,errors:t}},E=(e,t)=>s=>{const i=$(s);if(!i.isValid)return i;const r=[];return((s=i.value).length<e||s.length>t)&&r.push(y(v.funcOfXToYArguments,[String(e),String(t)])),{value:s,isSet:!0,isValid:!r.length,errors:r}},M=(e,t)=>(s,i)=>{const r=[],n=void 0!==s;let o=!n;const a=t?v.oneOfMust:v.oneOfCan;if(Array.isArray(e)&&e.length){for(let t=e.length-1;t>=0;t--){const s=e[t];if("string"!=typeof s){r.push(y(a,[e.join('", "')])+" (non-string token)");break}const l=i&&Object.prototype.hasOwnProperty.call(i,s);if(n&&l){r.push(y(a,[e.join('", "')])+` (${s} is present)`);break}o&&l&&(o=!1)}t&&o&&r.push(y(a,[e.join('", "')]))}else r.push(y(a,["undefined"]));return{value:s,isSet:n,isValid:!r.length,errors:r}},N=e=>t=>{const s=[],i=Object.keys(e).filter((e=>isNaN(Number(e)))).map((t=>e[t]));return i.some((e=>e===t))||s.push(y(v.enum,["["+i.join(",")+"]"])),{value:t,isSet:!0,isValid:!s.length,errors:s}},V={NUMBER:{type:v.number,method:z},INTEGER:{type:v.integer,method:e=>{const t=[];e=S(e);const s=parseInt(String(e),10);return e!==s&&t.push(v.integer),{value:s,isSet:!0,isValid:!t.length,errors:t}}},INTEGER_UNLIMITED:{type:v.integerUnlimited,method:e=>{let t=e;const s=[];return e=S(e),t=Number.isFinite(e)?parseInt(String(e),10):e,e!==t&&s.push(v.integerUnlimited),{value:t,isSet:!0,isValid:!s.length,errors:s}}},MORE_OR_EQUAL:(e,t)=>({type:v.moreOrEqual,method:k(e,t)}),BOOLEAN:{type:v.boolean,method:e=>{const t=[];let s=e;return"true"===e?s=!0:"false"===e&&(s=!1),"boolean"!=typeof s&&t.push(v.boolean),{value:s,isSet:!0,isValid:!t.length,errors:t}}},OBJECT:{type:v.object,method:e=>{const t=[];return"[object Object]"!==Object.prototype.toString.call(e)&&t.push(v.object),{value:e,isSet:!0,isValid:!t.length,errors:t}}},ITEM_LIST:{type:v.itemList,method:e=>{let t=e;const s=[];if(Array.isArray(e))if(e.length){if(e.length>1){const t=typeof e[0];for(let i=e.length-1;i>=0;i--)if(typeof e[i]!==t){s.push(y(v.itemList,["of items of the same type"]));break}}}else s.push(y(v.itemList,["with at least 1 item"]));else s.push(v.itemList),t=[];return{value:t,isSet:!0,isValid:!s.length,errors:s}}},ELEMENT:{type:v.element,method:e=>{const t=[];return e instanceof Element||e instanceof HTMLDocument||t.push(v.element),{value:e,isSet:!0,isValid:!t.length,errors:t}}},FUNC:{type:v.function,method:$},FUNC_WITH_X_ARGUMENTS:e=>{return{type:v.funcOfxArguments,method:(t=e,e=>{const s=$(e);if(!s.isValid)return s;const i=[];return(e=s.value).length!==t&&i.push(y(v.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_AND_MORE_ARGUMENTS:e=>{return{type:v.funcOfxAndMoreArguments,method:(t=e,e=>{const s=$(e);if(!s.isValid)return s;const i=[];return(e=s.value).length<t&&i.push(y(v.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_TO_Y_ARGUMENTS:(e,t)=>({type:v.funcOfXToYArguments,method:E(e,t)}),ONE_OF_CAN:e=>({type:v.oneOfCan,method:M(e,!1)}),ONE_OF_MUST:e=>({type:v.oneOfMust,method:M(e,!0)}),OR:e=>{return{type:v.or,method:(t=e,e=>{const s=[];return t.every((t=>!t.method(e).isValid))&&s.push(t.map((e=>e.type)).join(" OR ")),{value:e,isSet:!0,isValid:!s.length,errors:s}})};var t},ENUM:e=>({type:v.enum,method:N(e)})};class O{constructor(e){this.params={},this.contextErrors=[],this.errors=[],this.isValid=!0,this.setContext(e)}setContext(e){e&&"[object Object]"===Object.prototype.toString.call(e)?this.isValidContext=!0:(this.setCommonError("context is not an object"),this.isValidContext=!1),this.context=e}setValidity(){this.errors=Object.keys(this.params).reduce(((e,t)=>[...e,...this.params[t].errors]),[]),this.isValid=!this.errors.length}setCommonError(e){this.contextErrors.push(e),this.errors.push(e),this.isValid=!1}setParam(e,t){t.isValid||(t.errors=t.isSet?t.errors.map((t=>`"${e}" ${t}`)):[`"${e}" must be set`]),this.params[e]=t,this.setValidity()}showErrors(){return this.errors.length?"validation failed: "+this.errors.join(", "):""}}const A=(e,t,s)=>{const{value:i,errors:r}=e,n=t.method(i,s),o=[...r,...n.errors];return{value:n.value,isSet:n.isSet,isValid:!o.length,errors:o}},R=(e,t)=>{const s=void 0===e,i=!t.mandatory&&void 0!==t.defaultValue;return{value:s?i?t.defaultValue:void 0:e,isSet:!s||i,isValid:!s||!t.mandatory,errors:[]}},P=(e,t,s)=>{const i=R(e[t],s);if(i.isSet)for(const t of Object.values(s.validators)){const r=A(i,t,e);if(!r.isValid&&void 0!==s.defaultValue)return{value:s.defaultValue,isSet:!0,isValid:!0,errors:[]};Object.assign(i,r)}else{const t=s.validators.find((e=>e.type===v.oneOfMust));if(t)return A(i,t,e)}return i},C=(e,t)=>{const s=new O(e);return Object.entries(t).forEach((([e,t])=>s.setParam(e,s.isValidContext?P(s.context,e,t):R(void 0,t)))),s},{OBJECT:T,FUNC_WITH_X_AND_MORE_ARGUMENTS:F}=V;var B;!function(e){e.get="get",e.settings="settings",e.devSettings="devSettings"}(B||(B={}));const L={[B.get]:{validators:[F(2)],mandatory:!0},[B.settings]:{validators:[T]},[B.devSettings]:{validators:[T]}},{NUMBER:D,INTEGER:j,INTEGER_UNLIMITED:_,MORE_OR_EQUAL:U,BOOLEAN:W,ELEMENT:q,FUNC:H,OR:G,ENUM:X}=V;var Y,J;!function(e){e.adapter="adapter",e.startIndex="startIndex",e.minIndex="minIndex",e.maxIndex="maxIndex",e.itemSize="itemSize",e.bufferSize="bufferSize",e.padding="padding",e.infinite="infinite",e.horizontal="horizontal",e.windowViewport="windowViewport",e.viewportElement="viewportElement",e.inverse="inverse",e.onBeforeClip="onBeforeClip",e.sizeStrategy="sizeStrategy"}(Y||(Y={})),function(e){e.debug="debug",e.immediateLog="immediateLog",e.logProcessRun="logProcessRun",e.logTime="logTime",e.throttle="throttle",e.initDelay="initDelay",e.initWindowDelay="initWindowDelay",e.cacheData="cacheData",e.cacheOnReload="cacheOnReload",e.dismissOverflowAnchor="dismissOverflowAnchor",e.directionPriority="directionPriority"}(J||(J={}));const Q={[Y.itemSize]:1,[Y.bufferSize]:1,[Y.padding]:.01,[J.throttle]:0,[J.initDelay]:0,[J.initWindowDelay]:0},Z={[Y.adapter]:{validators:[W],defaultValue:!1},[Y.startIndex]:{validators:[j],defaultValue:1},[Y.minIndex]:{validators:[_],defaultValue:-1/0},[Y.maxIndex]:{validators:[_],defaultValue:1/0},[Y.itemSize]:{validators:[j,U(Q[Y.itemSize],!0)],defaultValue:NaN},[Y.bufferSize]:{validators:[j,U(Q[Y.bufferSize],!0)],defaultValue:5},[Y.padding]:{validators:[D,U(Q[Y.padding],!0)],defaultValue:.5},[Y.infinite]:{validators:[W],defaultValue:!1},[Y.horizontal]:{validators:[W],defaultValue:!1},[Y.windowViewport]:{validators:[W],defaultValue:!1},[Y.viewportElement]:{validators:[G([q,H])],defaultValue:null},[Y.inverse]:{validators:[W],defaultValue:!1},[Y.onBeforeClip]:{validators:[H],defaultValue:null},[Y.sizeStrategy]:{validators:[X(w)],defaultValue:w.Average}},K={[J.debug]:{validators:[W],defaultValue:!1},[J.immediateLog]:{validators:[W],defaultValue:!0},[J.logProcessRun]:{validators:[W],defaultValue:!1},[J.logTime]:{validators:[W],defaultValue:!1},[J.throttle]:{validators:[j,U(Q[J.throttle],!0)],defaultValue:40},[J.initDelay]:{validators:[j,U(Q[J.initDelay],!0)],defaultValue:1},[J.initWindowDelay]:{validators:[j,U(Q[J.initWindowDelay],!0)],defaultValue:40},[J.cacheData]:{validators:[W],defaultValue:!1},[J.cacheOnReload]:{validators:[W],defaultValue:!1},[J.dismissOverflowAnchor]:{validators:[W],defaultValue:!0},[J.directionPriority]:{validators:[X(I)],defaultValue:I.backward}};var ee,te,se;!function(e){e.init="init",e.scroll="scroll",e.start="start",e.preFetch="preFetch",e.fetch="fetch",e.postFetch="postFetch",e.render="render",e.preClip="preClip",e.clip="clip",e.adjust="adjust",e.end="end"}(ee||(ee={})),function(e){e.reset="adapter.reset",e.reload="adapter.reload",e.append="adapter.append",e.prepend="adapter.prepend",e.check="adapter.check",e.remove="adapter.remove",e.replace="adapter.replace",e.update="adapter.update",e.clip="adapter.clip",e.insert="adapter.insert",e.fix="adapter.fix"}(te||(te={})),function(e){e.start="start",e.next="next",e.done="done",e.error="error"}(se||(se={}));const{INTEGER:ie,INTEGER_UNLIMITED:re,BOOLEAN:ne,OBJECT:oe,ITEM_LIST:ae,FUNC_WITH_X_ARGUMENTS:le,FUNC_WITH_X_AND_MORE_ARGUMENTS:ce,FUNC_WITH_X_TO_Y_ARGUMENTS:de,ONE_OF_MUST:he,ONE_OF_CAN:ue,OR:fe}=V;var pe;pe||(pe={});const ge={[B.get]:{validators:[ce(2)]},[B.settings]:{validators:[oe]},[B.devSettings]:{validators:[oe]}};var me;!function(e){e.reloadIndex="reloadIndex"}(me||(me={}));const xe={[me.reloadIndex]:{validators:[ie]}};var be;!function(e){e.items="items",e.bof="bof",e.increase="increase"}(be||(be={}));const Ie={[be.items]:{validators:[ae],mandatory:!0},[be.bof]:{validators:[ne],defaultValue:!1},[be.increase]:{validators:[ne],defaultValue:!1}};var we;!function(e){e.items="items",e.eof="eof",e.decrease="decrease"}(we||(we={}));const ve={[we.items]:{validators:[ae],mandatory:!0},[we.eof]:{validators:[ne],defaultValue:!1},[we.decrease]:{validators:[ne],defaultValue:!1}};var ye;!function(e){e.predicate="predicate",e.indexes="indexes",e.increase="increase"}(ye||(ye={}));const Se={[ye.predicate]:{validators:[le(1),he([ye.indexes])]},[ye.indexes]:{validators:[ae,he([ye.predicate])]},[ye.increase]:{validators:[ne],defaultValue:!1}};var ze;!function(e){e.backwardOnly="backwardOnly",e.forwardOnly="forwardOnly"}(ze||(ze={}));const ke={[ze.backwardOnly]:{validators:[ne,ue([ze.forwardOnly])],defaultValue:!1},[ze.forwardOnly]:{validators:[ne,ue([ze.backwardOnly])],defaultValue:!1}};var $e;!function(e){e.items="items",e.before="before",e.after="after",e.beforeIndex="beforeIndex",e.afterIndex="afterIndex",e.decrease="decrease"}($e||($e={}));const Ee={[$e.items]:{validators:[ae],mandatory:!0},[$e.before]:{validators:[le(1),he([$e.after,$e.beforeIndex,$e.afterIndex])]},[$e.after]:{validators:[le(1),he([$e.before,$e.beforeIndex,$e.afterIndex])]},[$e.beforeIndex]:{validators:[ie,he([$e.before,$e.after,$e.afterIndex])]},[$e.afterIndex]:{validators:[ie,he([$e.before,$e.after,$e.beforeIndex])]},[$e.decrease]:{validators:[ne],defaultValue:!1}};var Me;!function(e){e.items="items",e.predicate="predicate",e.fixRight="fixRight"}(Me||(Me={}));const Ne={[$e.items]:{validators:[ae],mandatory:!0},[Me.predicate]:{validators:[le(1)],mandatory:!0},[Me.fixRight]:{validators:[ne],defaultValue:!1}};var Ve;!function(e){e.predicate="predicate",e.fixRight="fixRight"}(Ve||(Ve={}));const Oe={[Ve.predicate]:{validators:[le(1)],mandatory:!0},[Ve.fixRight]:{validators:[ne],defaultValue:!1}};var Ae;!function(e){e.scrollPosition="scrollPosition",e.minIndex="minIndex",e.maxIndex="maxIndex",e.updater="updater",e.scrollToItem="scrollToItem",e.scrollToItemOpt="scrollToItemOpt"}(Ae||(Ae={}));const Re={[Ae.scrollPosition]:{validators:[re]},[Ae.minIndex]:{validators:[re]},[Ae.maxIndex]:{validators:[re]},[Ae.updater]:{validators:[de(1,2)]},[Ae.scrollToItem]:{validators:[le(1)]},[Ae.scrollToItemOpt]:{validators:[fe([ne,oe])]}},Pe={[te.reset]:B,[te.reload]:me,[te.prepend]:be,[te.append]:we,[te.check]:pe,[te.remove]:ye,[te.clip]:ze,[te.insert]:$e,[te.replace]:Me,[te.update]:Ve,[te.fix]:Ae},Ce={[te.reset]:ge,[te.reload]:xe,[te.prepend]:Ie,[te.append]:ve,[te.check]:{},[te.remove]:Se,[te.clip]:ke,[te.insert]:Ee,[te.replace]:Ne,[te.update]:Oe,[te.fix]:Re};class Te{constructor(e,t,s){this.parseInput(e,Z),this.parseInput(t,K),this.instanceIndex=s,this.initializeDelay=this.getInitializeDelay(),this.viewport=this.getViewport()}parseInput(e,t){const s=C(e,t);if(!s.isValid)throw new Error("Invalid settings");Object.entries(s.params).forEach((([e,t])=>Object.assign(this,{[e]:t.value})))}getInitializeDelay(){let e=0;return this.windowViewport&&this.initWindowDelay&&!("scrollRestoration"in history)&&(e=this.initWindowDelay),this.initDelay>0&&(e=Math.max(e,this.initDelay)),e}getViewport(){if("function"!=typeof this.viewportElement)return this.viewportElement;const e=this.viewportElement(),t=P({value:e},"value",{validators:[V.ELEMENT]});return t.isValid?t.value:null}}const Fe=e=>{var t;return(t=class{}).process=e,t},Be=e=>{var t;return(t=class extends(Fe(e)){static parseInput(t,s,i=!1,r){const n={data:C(s,Ce[r||e])};return n.data.isValid?n.params=Object.entries(n.data.params).reduce(((e,[t,{value:s}])=>Object.assign(Object.assign({},e),{[t]:s})),{}):(t.logger.log((()=>n.data.showErrors())),i||t.workflow.call({process:e,status:se.error,payload:{error:`Wrong argument of the "${e}" method call`}})),n}}).process=e,t},Le=[ee.init,te.reset,te.reload];class De extends(Fe(ee.init)){static run(e,t){const{state:s,workflow:i}=e,r=Le.includes(t);e.logger.logCycle(!0),s.startWorkflowCycle(r,t),i.call({process:De.process,status:se.next})}}class je extends(Fe(ee.scroll)){static run(e,t){const{workflow:s,viewport:i}=e,r=i.scrollPosition;je.onSynthetic(e,r)||je.onThrottle(e,r,(()=>je.onScroll(e,s)))}static onSynthetic(e,t){const{scroll:s}=e.state,i=s.syntheticPosition;if(null!==i){if(s.syntheticFulfill&&(s.syntheticPosition=null),!s.syntheticFulfill||i===t)return e.logger.log((()=>["skipping scroll",t,`[${s.syntheticFulfill?"":"pre-"}synthetic]`])),!0;e.logger.log((()=>["synthetic scroll has been fulfilled:",t,t<i?"<":">",i]))}return!1}static onThrottle(e,t,s){const{state:{scroll:i},settings:{throttle:r},logger:n}=e;i.current=je.getScrollEvent(t,i.previous);const{direction:o,time:a}=i.current,l=i.previous?a-i.previous.time:1/0,c=r-l,d=isFinite(c)&&c>0,h=!!i.scrollTimer;if(n.log((()=>[o===I.backward?"⤴":"⤵",t,d?l+"ms":"0ms",d?h?"delayed":`/ ${c}ms delay`:""])),!d)return i.scrollTimer&&(clearTimeout(i.scrollTimer),i.scrollTimer=null),void s();h||(i.scrollTimer=setTimeout((()=>{n.log((()=>{const s=je.getScrollEvent(e.viewport.scrollPosition,i.current);return[s.direction===I.backward?"⤴":"⤵",s.position,s.time-a+"ms","triggered by timer set on",t]})),i.scrollTimer=null,s()}),c))}static getScrollEvent(e,t){const s=Number(new Date);let i=I.forward;return t&&(e===t.position?i=t.direction:e<t.position&&(i=I.backward)),{position:e,direction:i,time:s}}static onScroll(e,t){const{state:{scroll:s,cycle:i}}=e;s.previous=Object.assign({},s.current),s.current=null,i.busy.get()?e.logger.log((()=>["skipping scroll",s.previous.position,"[pending]"])):t.call({process:je.process,status:se.next})}}class _e extends(Be(te.reset)){static run(e,t){const{datasource:s,buffer:i,viewport:{paddings:r},state:{cycle:n}}=e;if(t){const{data:i}=_e.parseInput(e,t);if(!i.isValid)return;const r=t instanceof b;Object.keys(B).forEach((e=>{const t=i.params[e],n=s;(t.isSet||r&&n[e])&&(n[e]=t.value)}))}i.reset(!0),r.backward.reset(),r.forward.reset();const o={datasource:s};n.busy.get()&&(o.finalize=!0,n.interrupter=_e.process),e.workflow.call({process:_e.process,status:se.next,payload:o})}}class Ue extends(Be(te.reload)){static run(e,t){const{viewport:s,state:i,buffer:r}=e,{params:n}=Ue.parseInput(e,{reloadIndex:t},!0);r.reset(!1,n?n.reloadIndex:void 0),s.reset(r.startIndex);const o={};i.cycle.busy.get()&&(i.scroll.stop(),o.finalize=!0,i.cycle.interrupter=Ue.process),e.workflow.call({process:Ue.process,status:se.next,payload:o})}}class We{constructor(e,t,s){this.container={$index:e,data:t},this.nodeId=String(e),this.routines=s,this.invisible=!0,this.toRemove=!1,this.toInsert=!1}get $index(){return this.container.$index}set $index(e){this.container.$index=e}get data(){return this.container.data}set data(e){this.container.data=e}get element(){return this.container.element}set element(e){this.container.element=e}dispose(){delete this.container.element}setSize(e=0){this.preSize=e,this.element&&(this.size=this.routines.getSize(this.element))}makeVisible(){this.routines.makeElementVisible(this.element),this.invisible=!1}hide(){this.element&&this.routines.hideElement(this.element)}scrollTo(e){this.element&&this.routines.scrollTo(this.element,e)}updateIndex(e){this.$index=e,this.nodeId=String(e)}get(){return this.container}}class qe extends(Be(te.update)){static run(e,t){const{params:s}=qe.parseInput(e,t);if(!s)return;const i=qe.doUpdate(e,s);e.workflow.call({process:qe.process,status:i?se.next:se.done})}static doUpdate(e,t){const{buffer:s,viewport:i,state:{fetch:r},routines:n,logger:o}=e;if(!s.items)return o.log((()=>"no items in Buffer")),!1;const{item:a,index:l,diff:c}=i.getEdgeVisibleItem(s.items,I.backward),{trackedIndex:d,toRemove:h}=s.updateItems(t.predicate,((e,t)=>new We(e,t,n)),l,!!t.fixRight);let u=0;const f=s.get(d);a&&a===f&&(u=-s.getSizeByIndex(d)+c),h.forEach((e=>e.hide())),o.log((()=>h.length?"items to remove: ["+h.map((({$index:e})=>e)).join(",")+"]":"no items to remove")),h.length&&s.checkDefaultSize();const p=s.items.filter((({toInsert:e})=>e));return o.log((()=>p.length?"items to render: ["+p.map((({$index:e})=>e)).join(",")+"]":"no items to render")),r.update(d,u,p,h),!!h.length||!!p.length}}class He extends(Be(te.insert)){static run(e,t){const{params:s}=He.parseInput(e,t);if(!s)return;const i=He.doInsert(e,s);e.workflow.call({process:He.process,status:i?se.next:se.done})}static doInsert(e,t){return!!(He.insertEmpty(e,t)||He.insertInBuffer(e,t)||He.insertVirtually(e,t))}static insertEmpty(e,t){const{buffer:s,routines:i,state:{fetch:r}}=e;if(s.size)return!1;const{beforeIndex:n,afterIndex:o,items:a,decrease:l}=t;return!!s.fillEmpty(a,n,o,!!l,((e,t)=>new We(e,t,i)))&&(r.fill(s.items,s.startIndex),!0)}static insertInBuffer(e,t){const{before:s,after:i,beforeIndex:r,afterIndex:n,items:o,decrease:a}=t,l=e.buffer.getIndexToInsert(s||i,r,n);if(isNaN(l))return!1;const c=Number.isInteger(r)||s,d={predicate:({$index:e,data:t})=>l!==e||(c?[...o,t]:[t,...o]),fixRight:a};return qe.doUpdate(e,d)}static insertVirtually(e,t){const{beforeIndex:s,afterIndex:i,items:r,decrease:n}=t,{buffer:o,state:{fetch:a},viewport:l}=e,c=Number.isInteger(s)?I.backward:I.forward,d=c===I.backward?s:i;if(!o.insertVirtually(r,d,c,!!n))return!1;const{index:h,diff:u}=l.getEdgeVisibleItem(o.items,I.backward);return a.firstVisible.index=h,isNaN(h)||(a.simulate=!0,a.firstVisible.delta=-o.getSizeByIndex(h)+u),!0}}class Ge extends(Be(te.append)){static run(e,{process:t,options:s}){const{params:i}=Ge.parseInput(e,s,!1,t);if(!i)return;const r=Ge.doAppend(e,t,i);e.workflow.call({process:Ge.process,status:r?se.next:se.done})}static doAppend(e,t,s){const{bof:i,eof:r,increase:n,decrease:o}=s,{buffer:a}=e,l=t===te.prepend,c=l?!n:o;let d,h,u=s.items;return l?(d=(i?a.absMinIndex:a.minIndex)+(a.size?0:1),u=[...u].reverse()):h=(r?a.absMaxIndex:a.maxIndex)-(a.size||c?0:1),He.doInsert(e,{items:u,beforeIndex:d,afterIndex:h,decrease:c})}}class Xe extends(Be(te.check)){static run(e){const{workflow:t,buffer:s,state:{fetch:i},viewport:r}=e;let n=1/0,o=-1/0;if(s.items.forEach((e=>{const t=e.size;e.setSize(),e.size!==t&&(s.cacheItem(e),n=Math.min(n,e.$index),o=Math.max(o,e.$index))})),Number.isFinite(n)){i.first.indexBuffer=s.firstIndex,i.last.indexBuffer=s.lastIndex;const{index:e,diff:t}=r.getEdgeVisibleItem(s.items,I.backward);i.firstVisible.index=e,isNaN(e)||(i.firstVisible.delta=-s.getSizeByIndex(e)+t),i.check(s.items.filter((e=>e.$index>=n&&e.$index<=o)))}e.logger.stat("check"),t.call({process:Xe.process,status:Number.isFinite(n)?se.next:se.done})}}class Ye extends(Be(te.remove)){static run(e,t){const{params:s}=Ye.parseInput(e,t);if(!s)return;const i=Ye.doRemove(e,s);e.workflow.call({process:Ye.process,status:i?se.next:se.done})}static doRemove(e,t){const{fetch:s}=e.state;s.firstVisible.index=NaN;const i=Ye.removeBufferedItems(e,t),r=i.length>0;if(r&&(t.indexes&&t.indexes.length&&(t.indexes=t.indexes.filter((e=>!i.includes(e)))),t.indexes&&t.indexes.length)){const e=(t.increase?1:0)*i.length,s=(t.increase?0:-1)*i.length;t.indexes=t.indexes.map((t=>t+(t<i[0]?e:s)))}const n=Ye.removeVirtualItems(e,t);return!(!r&&!n)&&(e.logger.stat("after remove"),!0)}static removeBufferedItems(e,t){const{predicate:s,indexes:i,increase:r}=t;if(!s&&!i)return[];const n=e=>s&&s(e)||!!i&&i.includes(e.$index),o=e.buffer.items.reduce(((e,t)=>n(t)?[...e,t.$index]:e),[]),a={predicate:e=>!n(e),fixRight:r};return qe.doUpdate(e,a),o}static removeVirtualItems(e,t){const{indexes:s,increase:i}=t;if(!s||!s.length)return!1;const{buffer:r,viewport:n,state:{fetch:o}}=e,{finiteAbsMinIndex:a,firstIndex:l,finiteAbsMaxIndex:c,lastIndex:d}=r,h=[];for(let e=0,t=s.length;e<t;e++){const t=s[e];if(t>=a&&!isNaN(l)&&t<l)h.push(t);else{if(!(t<=c&&!isNaN(d)&&t>d))continue;h.push(t)}}if(!h.length)return!1;if(isNaN(o.firstVisible.index)){const{index:e,diff:t}=n.getEdgeVisibleItem(r.items,I.backward);o.firstVisible.index=e,isNaN(e)||(o.firstVisible.delta=-r.getSizeByIndex(e)+t)}return e.logger.log((()=>`going to remove ${h.length} item(s) virtually`)),r.removeVirtually(h,!!i),r.checkDefaultSize(),Ye.shiftFirstVisibleIndex(e,h,!!i),!0}static shiftFirstVisibleIndex(e,t,s){const{firstVisible:i}=e.state.fetch;if(isNaN(i.index))return;const r=t.reduce(((e,t)=>e+(s&&t>i.index||!s&&t<i.index?1:0)),0);i.index=i.index+(s?r:-r)}}class Je extends(Be(te.clip)){static run(e,t){const{params:s}=Je.parseInput(e,t);e.state.clip.forceForward=!(s&&s.backwardOnly),e.state.clip.forceBackward=!(s&&s.forwardOnly),e.workflow.call({process:Je.process,status:se.next})}}class Qe extends(Be(te.replace)){static run(e,t){const{params:s}=Qe.parseInput(e,t);if(!s)return;const i=Qe.doReplace(e,s);e.workflow.call({process:Qe.process,status:i?se.next:se.done})}static doReplace(e,t){const s=e.buffer.items.filter((e=>t.predicate(e))).map((e=>e.$index));if(!s.length)return e.logger.log("no items to be replaced"),!1;let i=!1;const r={predicate:({$index:e})=>!s.includes(e)||!i&&(i=!0,t.items),fixRight:t.fixRight};return qe.doUpdate(e,r)}}const{[te.fix]:Ze}=Pe;class Ke extends(Be(te.fix)){static run(e,t){const{workflow:s}=e,{data:i,params:r}=Ke.parseInput(e,t);r&&(Object.entries(i.params).forEach((([t,s])=>{s.isSet&&s.isValid&&Ke.runByType(e,t,s.value,i)})),s.call({process:Ke.process,status:se.done}))}static runByType(e,t,s,i){switch(t){case Ze.scrollPosition:return Ke.setScrollPosition(e,s);case Ze.minIndex:return Ke.setMinIndex(e,s);case Ze.maxIndex:return Ke.setMaxIndex(e,s);case Ze.updater:return Ke.updateItems(e,s);case Ze.scrollToItem:if(i.params){const t=i.params[Ze.scrollToItemOpt],r=t?t.value:void 0;return Ke.scrollToItem(e,s,r)}return;case Ze.scrollToItemOpt:return}}static setScrollPosition({viewport:e},t){let s=t;t===-1/0?s=0:t===1/0&&(s=e.getScrollableSize()),e.setPosition(s)}static setMinIndex({buffer:e,settings:t},s){t.minIndex=s,e.absMinIndex=s}static setMaxIndex({buffer:e,settings:t},s){t.maxIndex=s,e.absMaxIndex=s}static updateItems({buffer:e,logger:t},s){let i=!1;const r=()=>i=!0;e.items.forEach((e=>s(e.get(),r))),i&&(t.log((()=>"update Buffer.items reference")),e.items=[...e.items])}static scrollToItem(e,t,s){const i=e.buffer.items.find((e=>t(e.get())));i?i.scrollTo(s):e.logger.log((()=>"scrollToItem cancelled, item not found"))}}class et extends(Fe(ee.start)){static run(e){const t=e.state.startInnerLoop();e.workflow.call({process:et.process,status:se.next,payload:t})}}class tt extends(Fe(ee.preFetch)){static run(e){const{workflow:t,buffer:s,state:{fetch:i,cycle:r}}=e;i.minIndex=s.minIndex,tt.setPositionsAndIndexes(e),tt.skipBufferedItems(e),e.settings.infinite&&tt.checkBufferGaps(e),tt.checkFetchPackSize(e),tt.setFetchDirection(e),t.call({process:tt.process,status:tt.getStatus(e),payload:{process:r.initiator}})}static setPositionsAndIndexes(e){tt.setPositions(e),tt.setFirstIndex(e),tt.setLastIndex(e),e.logger.fetch()}static setPositions(e){const{state:{fetch:{positions:t}},viewport:s}=e,i=s.getBufferPadding();t.before=s.scrollPosition,t.startDelta=tt.getStartDelta(e),t.relative=t.before-t.startDelta,t.start=t.relative-i,t.end=t.relative+s.getSize()+i}static getStartDelta(e){const{buffer:t,viewport:{offset:s}}=e;let i=0;if(s&&(i+=s),!t.defaultSize)return i;for(let e=t.finiteAbsMinIndex;e<t.startIndex;e++)i+=t.getSizeByIndex(e);return e.logger.log((()=>[`start delta is ${i}`,...s?[` (+${s} offset)`]:[]])),i}static setFirstIndex(e){const{state:t,buffer:s}=e,{positions:{start:i},first:r}=t.fetch;let n=s.startIndex,o=0;if(t.cycle.innerLoop.isInitial)e.logger.log("skipping fetch backward direction [initial loop]");else if(s.defaultSize){let e=o,t=n;for(;;){if(i>=0){const r=s.getSizeByIndex(t);if(e+r-i>0){n=t,o=e;break}if(e+=r,t++,t<s.absMinIndex)break}if(i<0){if(t--,t<s.absMinIndex)break;e-=s.getSizeByIndex(t);if(n=t,o=e,e-i<=0)break}}}else e.logger.log("skipping fetch backward direction [no item size]");r.index=r.indexBuffer=Math.max(n,s.absMinIndex),r.position=o}static setLastIndex(e){const{state:{fetch:t,cycle:s},buffer:i,settings:r}=e,{firstVisible:n,positions:{relative:o,end:a},first:l,last:c}=t;let d;if(i.defaultSize){let e=l.indexBuffer,t=l.position;for(d=e;;){d=e;const r=i.getSizeByIndex(e);if(t+=r,isNaN(n.index)&&t>o&&(n.index=e,s.innerLoop.isInitial||(n.delta=t-r-o)),t>=a)break;if(e++>i.absMaxIndex)break}}else d=i.startIndex+r.bufferSize-1,e.logger.log("forcing fetch forward direction [no item size]");c.index=c.indexBuffer=Math.min(d,i.absMaxIndex)}static skipBufferedItems(e){const{buffer:t}=e;if(!t.size)return;const{fetch:s}=e.state,i=s.first.index,r=s.last.index,n=[[]];let o=0;for(let e=i;e<=r;e++)t.get(e)?n[o].length&&(n[++o]=[]):n[o].push(e);let a=n[0];n[0].length&&n[1]&&n[1].length&&(s.hasAnotherPack=!0,n[1].length>=n[0].length&&(a=n[1])),s.first.index=Math.max(a[0],t.absMinIndex),s.last.index=Math.min(a[a.length-1],t.absMaxIndex),s.first.index===i&&s.last.index===r||e.logger.fetch("after Buffer flushing")}static checkBufferGaps(e){const{buffer:t,state:{fetch:s}}=e;if(!t.size)return;const i=s.first.index,r=t.lastIndex;i>r&&(s.first.index=s.first.indexBuffer=r+1);const n=t.firstIndex,o=s.last.index;o<n&&(s.last.index=s.last.indexBuffer=n-1),s.first.index===i&&s.last.index===o||e.logger.fetch("after Buffer filling (no clip case)")}static checkFetchPackSize(e){const{buffer:t,state:{fetch:s}}=e;if(!s.shouldFetch)return;const i=s.first.index,r=s.last.index,n=e.settings.bufferSize-(r-i+1);if(!(n<=0)){if(!t.size||r>t.items[0].$index){const e=Math.min(r+n,t.absMaxIndex);e>r&&(s.last.index=s.last.indexBuffer=e)}else{const e=Math.max(i-n,t.absMinIndex);e<i&&(s.first.index=s.first.indexBuffer=e)}s.first.index===i&&s.last.index===r||(e.logger.fetch("after bufferSize adjustment"),tt.skipBufferedItems(e))}}static setFetchDirection(e){const{buffer:t,state:{fetch:s}}=e;if(s.last.index){let i=I.forward;t.size&&(i=s.last.index<t.items[0].$index?I.backward:I.forward),s.direction=i,e.logger.log((()=>`fetch direction is "${i}"`))}}static getStatus(e){const{cycle:t,fetch:s}=e.state;return t.initiator===te.clip?(e.logger.log((()=>`going to skip fetch due to "${te.clip}" process`)),se.next):s.shouldFetch?(e.logger.log((()=>`going to fetch ${s.count} items started from index ${s.index}`)),se.next):se.done}}class st extends(Fe(ee.fetch)){static run(e){const{workflow:t}=e,s={success:s=>{e.logger.log((()=>`resolved ${s.length} items (index = ${e.state.fetch.index}, count = ${e.state.fetch.count})`)),e.state.fetch.newItemsData=s,t.call({process:st.process,status:se.next})},fail:e=>t.call({process:st.process,status:se.error,payload:{error:e}})},i=st.get(e);st.complete(e,s,i)}static complete(e,t,s){if(Object.prototype.hasOwnProperty.call(s,"data")){const{data:e,error:i,isError:r}=s;r?t.fail(i):t.success(e||[])}else{const{state:{scroll:i,fetch:r},viewport:n}=e;null===i.positionBeforeAsync&&(i.positionBeforeAsync=n.scrollPosition),r.cancel=()=>{t.success=()=>null,t.fail=()=>null},s.then((e=>t.success(e)),(e=>t.fail(e)))}}static get(e){const t=e.datasource.get,{index:s,count:i}=e.state.fetch;let r,n,o,a;const l=e=>{o?o(e):r=e||null},c=e=>{a?a(e):n=e||null},d=t(s,i,l,c);if(d&&"object"==typeof d&&null!==d){if("function"==typeof d.then)return d;if("function"==typeof d.subscribe){const e=d.subscribe(l,c,(()=>{e&&"object"==typeof e&&"function"==typeof e.unsubscribe&&e.unsubscribe()}))}}return r||n?{data:n?null:r||[],error:n,isError:!!n}:new Promise(((e,t)=>{o=e,a=t}))}}class it extends(Fe(ee.postFetch)){static run(e){const{workflow:t}=e;it.setItems(e)?(it.setBufferLimits(e),t.call({process:it.process,status:e.state.fetch.hasNewItems?se.next:se.done})):t.call({process:it.process,status:se.error,payload:{error:"Can't set buffer items"}})}static setBufferLimits(e){const{buffer:t,state:{fetch:s,cycle:{innerLoop:i}}}=e,{items:r,first:{index:n},last:{index:o}}=s;if(r.length){const e=r.length-1;n<r[0].$index&&(t.absMinIndex=r[0].$index),o>r[e].$index&&(t.absMaxIndex=r[e].$index)}else(o<t.minIndex||i.isInitial)&&(t.absMinIndex=t.minIndex),(n>t.maxIndex||i.isInitial)&&(t.absMaxIndex=t.maxIndex)}static setItems(e){const{buffer:t,state:{fetch:s,cycle:i}}=e,r=s.newItemsData;if(!r||!r.length)return!0;let n=s.index;return r.length<s.count&&(i.innerLoop.isInitial?n=t.startIndex:s.first.index<t.minIndex&&(n=t.minIndex-r.length)),s.items=r.map(((t,s)=>new We(n+s,t,e.routines))),t.setItems(s.items)}}class rt extends(Fe(ee.render)){static run(e){const{workflow:t,state:{cycle:s,render:i,scroll:r},viewport:n,routines:o}=e;e.logger.stat("before new items render"),null===r.positionBeforeAsync&&(r.positionBeforeAsync=n.scrollPosition),i.cancel=o.render((()=>{i.cancel=null,rt.doRender(e)?t.call({process:rt.process,status:i.noSize?se.done:se.next,payload:{process:s.initiator}}):t.call({process:rt.process,status:se.error,payload:{error:"Can't associate item with element"}})}))}static doRender(e){const{state:{fetch:t,render:s},viewport:i,buffer:r,logger:n}=e;return s.positionBefore=i.scrollPosition,!(!t.isCheck&&(s.sizeBefore=i.getScrollableSize(),!t.items.every((t=>rt.processElement(e,t)))))&&(r.checkDefaultSize(),s.sizeAfter=i.getScrollableSize(),n.stat("after new items render"),n.log((()=>s.noSize?"viewport size has not been changed":void 0)),!0)}static processElement(e,t){const{viewport:s,buffer:i}=e,r=s.findItemElementById(t.nodeId);return!!r&&(t.element=r,t.makeVisible(),t.setSize(i.getSizeByIndex(t.$index)),i.cacheItem(t),!0)}}const nt=({call:e})=>!!e.interrupted;class ot extends(Fe(ee.end)){static run(e,{error:t}={}){const{workflow:s,state:{cycle:{interrupter:i}}}=e;if(t||i||ot.calculateParams(e,s),nt(s))return void s.call({process:ot.process,status:se.done});const r=ot.shouldContinueRun(e,t);e.state.endInnerLoop(),s.call({process:ot.process,status:r?se.next:se.done,payload:Object.assign({},i?{process:i}:{})})}static calculateParams(e,t){const{adapter:s,viewport:i,buffer:{items:r}}=e;if(s.wanted.firstVisible){const{item:e}=i.getEdgeVisibleItem(r,I.backward);e&&e.element===s.firstVisible.element||(s.firstVisible=e?e.get():d)}if(s.wanted.lastVisible&&!nt(t)){const{item:e}=i.getEdgeVisibleItem(r,I.forward);e&&e.element===s.lastVisible.element||(s.lastVisible=e?e.get():d)}}static shouldContinueRun(e,t){const{cycle:s,fetch:i,render:r}=e.state;return!!s.interrupter||!t&&(!(!i.simulate||!i.isCheck||r.noSize)||(!(!i.simulate||!i.doRemove)||!(i.simulate||!(i.hasNewItems&&!r.noSize||i.hasAnotherPack))))}}class at extends(Fe(ee.adjust)){static run(e){const{workflow:t,viewport:s,state:{scroll:i}}=e;i.positionBeforeAdjust=s.scrollPosition,at.setPaddings(e),i.positionAfterAdjust=s.scrollPosition;const r=at.calculatePosition(e);at.setAdditionalForwardPadding(e,r),at.setPosition(e,r,(()=>t.call({process:at.process,status:se.done})))}static setPaddings(e){const{viewport:t,buffer:s,settings:{inverse:i},state:{fetch:r}}=e,n=s.getFirstVisibleItem(),o=s.getLastVisibleItem();let a,l;n&&o?(a=n.$index,l=o.$index):(a=isNaN(r.firstVisible.index)?s.startIndex:r.firstVisible.index,l=a-1);const{forward:c,backward:d}=t.paddings;let h,u=0,f=0;for(h=s.finiteAbsMinIndex;h<a;h++)u+=s.getSizeByIndex(h);for(h=l+1;h<=s.finiteAbsMaxIndex;h++)f+=s.getSizeByIndex(h);const p=u+(t.getScrollableSize()-c.size-d.size)+f,g=t.getSize()-p;g>0&&(i?u+=g:f+=g,e.logger.log((()=>i?"backward":`forward padding will be increased by ${g} to fill the viewport`))),d.size=u,c.size=f,e.logger.stat("after paddings adjustments")}static calculatePosition(e){const{viewport:t,buffer:s,state:{fetch:i,render:r,scroll:n}}=e;let o=t.paddings.backward.size;if(!isNaN(i.firstVisible.index)&&!isNaN(s.firstIndex)){e.logger.log(`first index = ${i.firstVisible.index}, delta = ${i.firstVisible.delta}`);const t=i.shouldCheckPreSizeExpectation(s.lastIndex);s.items.forEach((e=>{e.$index<i.firstVisible.index?o+=e.size:(e.$index===i.firstVisible.index&&i.firstVisible.delta&&(o-=i.firstVisible.delta),t&&e.preSize&&i.items.includes(e)&&(o+=e.size-e.preSize))}))}if(null!==n.positionBeforeAsync){const t=r.positionBefore-n.positionBeforeAsync;0!==t&&(e.logger.log(`shift position due to fetch-render difference (${t})`),o+=t)}return t.offset>0&&(o||i.positions.before)&&(o+=t.offset),Math.round(o)}static setAdditionalForwardPadding(e,t){const{viewport:s,buffer:i,state:{cycle:r}}=e;if(!r.isInitial||!ot.shouldContinueRun(e,null))return;const n=t-s.getMaxScrollPosition();if(n<=0)return;const o=i.getLastVisibleItem();if(!o)return;let a=0,l=o.$index+1;for(;a<=n&&l<=i.absMaxIndex;)a+=i.getSizeByIndex(l++);const c=Math.min(a,n);c&&(s.paddings.forward.size+=c,e.logger.log(`increase fwd padding due to lack of items (${n} -> ${c})`))}static setPosition(e,t,s){const{state:{scroll:i},viewport:r,routines:n}=e;if(!i.hasPositionChanged(t))return s();i.syntheticPosition=t,i.syntheticFulfill=!1,i.cancelAnimation=n.animate((()=>{i.cancelAnimation=null;const n=i.positionAfterAdjust-r.scrollPosition;let o="";n>0&&(t-=n,i.syntheticPosition=t,o=` (-${n})`),i.syntheticFulfill=!0,r.scrollPosition=t,e.logger.stat("after scroll adjustment"+o),s()}))}}class lt extends(Fe(ee.preClip)){static run(e){lt.prepareClip(e),e.workflow.call({process:lt.process,status:se.next,payload:{doClip:e.state.clip.doClip}})}static prepareClip(e){const{state:{fetch:t,clip:s}}=e;if(lt.shouldNotClip(e))return;const i=t.first.indexBuffer,r=t.last.indexBuffer;e.logger.log((()=>`looking for ${t.direction?"anti-"+t.direction+" ":""}items that are out of [${i}..${r}] range`)),lt.isBackward(e,i)&<.prepareClipByDirection(e,I.backward,i),lt.isForward(e,r)&<.prepareClipByDirection(e,I.forward,r),s.doClip||e.logger.log("skipping clip [no items to clip]")}static shouldNotClip(e){const{settings:t,buffer:s,state:i}=e;return t.infinite&&!i.clip.force?(e.logger.log("skipping clip [infinite mode]"),!0):s.size?!!i.cycle.isInitial&&(e.logger.log("skipping clip [initial cycle]"),!0):(e.logger.log("skipping clip [empty buffer]"),!0)}static isBackward(e,t){const{buffer:s,state:{clip:i,fetch:r}}=e;return i.force?i.forceBackward:r.direction!==I.backward&&t-1>=s.absMinIndex}static isForward(e,t){const{buffer:s,state:{clip:i,fetch:r}}=e;return i.force?i.forceForward:r.direction!==I.forward&&t+1<=s.absMaxIndex}static prepareClipByDirection(e,t,s){const i=t===I.forward;e.buffer.items.forEach((r=>{(!i&&r.$index<s||i&&r.$index>s)&&(r.toRemove=!0,r.removeDirection=t,e.state.clip.doClip=!0)}))}}class ct extends(Fe(ee.clip)){static run(e){const{workflow:t}=e;ct.doClip(e),t.call({process:ct.process,status:se.next})}static doClip(e){const{buffer:t,viewport:{paddings:s},state:{clip:i},logger:r}=e,n={[I.backward]:0,[I.forward]:0};r.stat(`before clip (${++i.callCount})`);const o=t.items.filter((e=>!!e.toRemove&&(e.hide(),n[e.removeDirection]+=e.size,!0)));o.length&&(n[I.backward]&&(s.byDirection(I.backward).size+=n[I.backward]),n[I.forward]&&(s.byDirection(I.forward).size+=n[I.forward]),e.settings.onBeforeClip&&e.settings.onBeforeClip(o.map((e=>e.get())))),t.clip(),r.log((()=>{const e=o.map((({$index:e})=>e));return e.length?[`clipped ${e.length} item(s) from Buffer`+(n.backward?`, +${n.backward} fwd px`:"")+(n.forward?`, +${n.forward} bwd px`:"")+`, range: [${e[0]}..${e[e.length-1]}]`]:"clipped 0 items from Buffer"})),r.stat("after clip")}}class dt{constructor(e,t,s){this.logs=[],this.logAdapterMethod=(e,t,s)=>{if(!this.debug)return;const i=(void 0===t?[]:Array.isArray(t)?t:[t]).map((e=>"function"==typeof e?"func":"object"==typeof e&&e?Array.isArray(e)?`[of ${e.length}]`:"{ "+Object.keys(e).join(", ")+" }":e)).join(", ");this.log(`adapter: ${e}(${i||""})${s||""}`)};const{settings:i}=e;this.debug=i.debug,this.immediateLog=i.immediateLog,this.logTime=i.logTime,this.getTime=()=>e.state&&` // time: ${e.state.time}`,this.getStat=()=>{const{buffer:t,viewport:s}=e,i=t.getFirstVisibleItem(),r=t.getLastVisibleItem();return"pos: "+s.scrollPosition+", size: "+s.getScrollableSize()+", bwd_p: "+s.paddings.backward.size+", fwd_p: "+s.paddings.forward.size+", default: "+(t.defaultSize||"no")+", items: "+t.getVisibleItemsCount()+", range: "+(i&&r?`[${i.$index}..${r.$index}]`:"no")},this.getFetchRange=()=>{const{first:{index:t},last:{index:s}}=e.state.fetch;return Number.isNaN(t)||Number.isNaN(s)?"no":`[${t}..${s}]`},this.getLoopId=()=>e.state.cycle.loopId,this.getLoopIdNext=()=>e.state.cycle.loopIdNext,this.getWorkflowCycleData=()=>`${i.instanceIndex}-${e.state.cycle.count}`,this.getScrollPosition=t=>e.routines.getScrollPosition(t),this.log((()=>`vscroll Workflow has been started, core: ${t.core.name} v${t.core.version}, consumer: ${t.consumer.name} v${t.consumer.version}, scroller instance: ${i.instanceIndex}, adapter `+(s?`instance: ${s.id}`:"is not instantiated")))}object(e,t,s){this.log((()=>[e,s?JSON.stringify(t,((e,t)=>Number.isNaN(t)?"NaN":t===1/0?"Infinity":t===-1/0?"-Infinity":t instanceof Element?"HTMLElement":t instanceof HTMLDocument?"HTMLDocument":"function"==typeof t?"Function":t)).replace(/"/g,"").replace(/(\{|:|,)/g,"$1 ").replace(/(\})/g," $1"):t]))}stat(e){if(this.debug){const t=["color: #888; border: dashed #888 0; border-bottom-width: 0px","color: #000; border-width: 0"];this.log((()=>["%cstat"+(e?` ${e}`:"")+",%c "+this.getStat(),...t]))}}fetch(e){if(this.debug){const t="fetch interval"+(e?` ${e}`:""),s=["color: #888","color: #000"];this.log((()=>[`%c${t}: %c${this.getFetchRange()}`,...s]))}}prepareForLog(e){return e instanceof Event&&e.target?this.getScrollPosition(e.target):e}logProcess(e){if(!this.debug)return;const{process:t,status:s,payload:i}=e,r=[];if(t===ee.init&&s===se.next)r.push(`%c---=== loop ${this.getLoopIdNext()} start`);else if(t===ee.end){r.push(`%c---=== loop ${this.getLoopId()} done`);const e=i&&i.process;s===se.next&&e!==te.reset&&e!==te.reload&&(r[0]+=`, loop ${this.getLoopIdNext()} start`)}r.length&&this.log((()=>[...r,"color: #006600;"]))}logCycle(e=!0){const t=this.getWorkflowCycleData(),s=`color: #0000aa; border: solid #555 1px; border-width: ${e?"1px 0 0 1px":"0 0 1px 1px"}; margin-left: -2px`;this.log((()=>[`%c ~~~ WF Cycle ${t} ${e?"STARTED":"FINALIZED"} ~~~ `,s]))}logError(e){if(this.debug){const t=["color: #a00;","color: #000"];this.log((()=>["error:%c"+(e?` ${e}`:"")+`%c (loop ${this.getLoopIdNext()})`,...t]))}}log(...e){if(this.debug){if("function"==typeof e[0]&&(e=e[0](),Array.isArray(e)||(e=[e])),e.every((e=>void 0===e)))return;this.logTime&&(e=[...e,this.getTime()]),e=e.map((e=>this.prepareForLog(e))),this.immediateLog?console.log.apply(this,e):this.logs.push(e)}}logForce(...e){this.debug&&(!this.immediateLog&&this.logs.length&&(this.logs.forEach((e=>console.log.apply(this,e))),this.logs=[]),e.length&&console.log.apply(this,e))}}class ht{constructor(e){this.horizontal=e.horizontal,this.window=e.windowViewport,this.viewport=e.viewport}checkElement(e){if(!e)throw new Error("HTML element is not defined")}getHostElement(e){if(this.window)return document.documentElement;if(this.viewport)return this.viewport;this.checkElement(e);const t=e.parentElement;return this.checkElement(t),t}getScrollEventReceiver(e){return this.window?window:this.getHostElement(e)}setupScrollRestoration(){"scrollRestoration"in history&&(history.scrollRestoration="manual")}dismissOverflowAnchor(e){this.checkElement(e),e.style.overflowAnchor="none"}findElementBySelector(e,t){return this.checkElement(e),e.querySelector(t)}findPaddingElement(e,t){return this.findElementBySelector(e,`[data-padding-${t}]`)}findItemElement(e,t){return this.findElementBySelector(e,`[data-sid="${t}"]`)}getScrollPosition(e){return this.window?window.pageYOffset:(this.checkElement(e),e[this.horizontal?"scrollLeft":"scrollTop"])}setScrollPosition(e,t){t=Math.max(0,t),this.window?this.horizontal?window.scrollTo(t,window.scrollY):window.scrollTo(window.scrollX,t):(this.checkElement(e),e[this.horizontal?"scrollLeft":"scrollTop"]=t)}getParams(e,t){if(this.checkElement(e),this.window&&t){const{clientWidth:t,clientHeight:s,clientLeft:i,clientTop:r}=e;return{height:s,width:t,top:r,bottom:r+s,left:i,right:i+t,x:i,y:r,toJSON:()=>null}}return e.getBoundingClientRect()}getSize(e,t){return this.getParams(e,t)[this.horizontal?"width":"height"]}getSizeStyle(e){this.checkElement(e);const t=e.style[this.horizontal?"width":"height"];return parseFloat(t)||0}setSizeStyle(e,t){this.checkElement(e),t=Math.max(0,Math.round(t)),e.style[this.horizontal?"width":"height"]=`${t}px`}getEdge(e,t,s){return this.getParams(e,s)[t===I.forward?this.horizontal?"right":"bottom":this.horizontal?"left":"top"]}getEdge2(e,t,s,i){return e.offsetTop-(s?s.scrollTop:0)+(t===(i?I.backward:I.forward)?this.getSize(e):0)}makeElementVisible(e){this.checkElement(e),e.style.left="",e.style.top="",e.style.position=""}hideElement(e){this.checkElement(e),e.style.display="none"}getOffset(e){return this.checkElement(e),(this.horizontal?e.offsetLeft:e.offsetTop)||0}scrollTo(e,t){this.checkElement(e),e.scrollIntoView(t)}render(e){const t=setTimeout((()=>e()));return()=>clearTimeout(t)}animate(e){const t=requestAnimationFrame((()=>e()));return()=>cancelAnimationFrame(t)}onScroll(e,t){return e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}}class ut{constructor(e,t,s){const i=s.findPaddingElement(e,t);s.checkElement(i),this.element=i,this.direction=t,this.routines=s}reset(e){this.size=e||0}get size(){return this.routines.getSizeStyle(this.element)}set size(e){this.routines.setSizeStyle(this.element,e)}}class ft{constructor(e,t,s){this.settings=s,this.forward=new ut(e,I.forward,t),this.backward=new ut(e,I.backward,t)}byDirection(e,t){return e===I.backward?t?this.forward:this.backward:t?this.backward:this.forward}reset(e,t,s){const i=this.getPositiveSize(t,e,s),r=this.getNegativeSize(t);if(this.settings.inverse){this.forward.reset(r),this.backward.reset(i);const t=e-this.backward.size-s;t>0&&(this.backward.size+=t,this.forward.size-=t)}else{this.forward.reset(i),this.backward.reset(r);const t=e-this.forward.size-s;t>0&&(this.backward.size-=t,this.forward.size+=t)}}getPositiveSize(e,t,s){const{settings:i}=this;let r=t;return isFinite(i.maxIndex)&&(r=(i.maxIndex-e+1)*i.itemSize),s&&(r=Math.max(r-s,0)),r}getNegativeSize(e){const{settings:t}=this;let s=0;return isFinite(t.minIndex)&&(s=(e-t.minIndex)*t.itemSize),s}}class pt{constructor(e,t,s,i,r){this.element=e,this.settings=t,this.routines=s,this.state=i,this.logger=r,this.hostElement=this.routines.getHostElement(this.element),this.scrollEventReceiver=this.routines.getScrollEventReceiver(this.element),t.windowViewport&&this.routines.setupScrollRestoration(),t.dismissOverflowAnchor&&this.routines.dismissOverflowAnchor(this.hostElement),this.paddings=new ft(this.element,this.routines,t)}reset(e){this.setOffset(),this.paddings.reset(this.getSize(),e,this.offset),this.scrollPosition=this.paddings.backward.size||0,this.state.scroll.reset()}setPosition(e){if(this.scrollPosition===e)return this.logger.log((()=>["setting scroll position at",e,"[cancelled]"])),e;this.routines.setScrollPosition(this.hostElement,e);const t=this.scrollPosition;return this.logger.log((()=>["setting scroll position at",t,...t!==e?[`(${e})`]:[]])),t}get scrollPosition(){return this.routines.getScrollPosition(this.hostElement)}set scrollPosition(e){this.setPosition(e)}getSize(){return this.routines.getSize(this.hostElement,!0)}getScrollableSize(){return this.routines.getSize(this.element)}getMaxScrollPosition(){return this.getScrollableSize()-this.getSize()}getBufferPadding(){return this.getSize()*this.settings.padding}getEdge(e){return this.routines.getEdge(this.hostElement,e,!0)}setOffset(){this.offset=this.routines.getOffset(this.element),this.settings.windowViewport||(this.offset-=this.routines.getOffset(this.hostElement))}findItemElementById(e){return this.routines.findItemElement(this.element,e)}getEdgeVisibleItem(e,t){const s=t===I.backward,i=s?I.forward:I.backward,r=this.getEdge(t);let n,o=0;for(let t=s?0:e.length-1;s?t<=e.length-1:t>=0;t+=s?1:-1){if(o=this.routines.getEdge(e[t].element,i)-r,s&&o>0||!s&&o<0){n=e[t];break}}return{item:n,index:n?n.$index:NaN,diff:o}}}class gt{constructor(){this.reset()}reset(){this.newItems=[],this.oldItems=[],this.removed=[]}}class mt{constructor(e,t){this.itemSize=e,this.sizeStrategy=t,this.sizeMap=new Map,this.recalculation=new gt}reset(e){e&&(this.constantSize=this.itemSize,this.frequentSize=this.itemSize,this.averageSize=this.itemSize,this.averageSizeFloat=this.itemSize,this.sizeMap.clear()),this.recalculation.reset()}get(){switch(this.sizeStrategy){case w.Average:return this.averageSize;case w.Frequent:return this.frequentSize;default:return this.constantSize}}recalculateAverageSize(e){const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(t.length){const i=t.reduce(((e,t)=>e+t.size),0),r=t.reduce(((e,t)=>e+t.newSize),0),n=this.averageSizeFloat||0;this.averageSizeFloat=n-(i-r)/(e-s.length)}if(s.length){const t=s.reduce(((e,t)=>e+t.size),0),i=this.averageSizeFloat||0;this.averageSizeFloat=((e-s.length)*i+t)/e}if(i.length){const t=i.reduce(((e,t)=>e+t.size),0),s=this.averageSizeFloat||0;this.averageSizeFloat=((e+i.length)*s-t)/e}this.averageSize=Math.round(this.averageSizeFloat)}recalculateFrequentSize(){const{oldItems:e,newItems:t,removed:s}=this.recalculation,i=this.sizeMap.get(this.frequentSize);t.length&&t.forEach((({size:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1))),e.length&&(e.forEach((({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0)))),e.forEach((({newSize:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1)))),s.length&&s.forEach((({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0))));const r=[...this.sizeMap.entries()].sort(((e,t)=>t[1]-e[1])),n=r[0][1],o=r.filter((e=>e[1]===n));o.length>1&&o.find((e=>e[0]===i))||(this.frequentSize=r[0][0])}recalculate(e){if(this.sizeStrategy===w.Constant)return!1;const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(!t.length&&!s.length&&!i.length)return!1;const r=this.get();return e?(this.sizeStrategy===w.Average?this.recalculateAverageSize(e):this.recalculateFrequentSize(),this.recalculation.reset()):this.reset(!0),this.get()!==r}setExisted(e,t){this.sizeStrategy!==w.Constant&&this.recalculation.oldItems.push({size:e,newSize:t})}setNew(e){this.sizeStrategy!==w.Constant?this.recalculation.newItems.push({size:e}):this.constantSize||(this.constantSize=e)}setRemoved(e){this.sizeStrategy!==w.Constant&&this.recalculation.removed.push({size:e})}}class xt{constructor(e,t){this.$index=e.$index,this.data=t?e.data:null,this.size=e.size}changeIndex(e){this.$index=e}}class bt{constructor({itemSize:e,cacheData:t,cacheOnReload:s,sizeStrategy:i},r){this.itemSize=e,this.saveData=t,this.cacheOnReload=s,this.sizeStrategy=i,this.logger=r,this.items=new Map,this.defaultSize=new mt(e,i),this.reset(!0)}reset(e){(e=e||!this.cacheOnReload)&&(this.minIndex=1/0,this.maxIndex=-1/0,this.items.clear()),this.defaultSize.reset(e)}get size(){return this.items.size}get(e){return this.items.get(e)}getSizeByIndex(e){const t=this.get(e);return t&&t.size||this.defaultSize.get()}getDefaultSize(){return this.defaultSize.get()}recalculateDefaultSize(){return!!this.defaultSize.recalculate(this.size)&&(this.logger.log((()=>`default size has been updated: ${this.defaultSize.get()}`)),!0)}add(e){let t=this.get(e.$index);return t?(this.saveData&&(t.data=e.data),t.size!==e.size&&(t.size?this.defaultSize.setExisted(t.size,e.size):this.defaultSize.setNew(e.size),t.size=e.size)):(t=new xt(e,this.saveData),this.items.set(e.$index,t),this.defaultSize.setNew(e.size)),e.$index<this.minIndex&&(this.minIndex=e.$index),e.$index>this.maxIndex&&(this.maxIndex=e.$index),t}insertItems(e,t,s,i){const r=new Map,n=e.length;let o=1/0,a=-1/0;const l=e=>{r.set(e.$index,e),o=e.$index<o?e.$index:o,a=e.$index>a?e.$index:a};this.items.forEach((e=>{let r=0;s===I.backward?e.$index<t&&i?r=-n:e.$index>=t&&!i&&(r=n):s===I.forward&&(e.$index<=t&&i?r=-n:e.$index>t&&!i&&(r=n)),r&&e.changeIndex(e.$index+r),l(e)})),this.saveData&&e.forEach(((e,r)=>{const o=t+r-(i?n:0)+(s===I.forward?1:0),a=new xt({$index:o,data:e},this.saveData);l(a)})),this.items=r,this.minIndex=o,this.maxIndex=a}removeItems(e,t){const s=new Map;let i=1/0,r=-1/0;this.items.forEach((n=>{if(e.some((e=>e===n.$index)))return void(n.size&&this.defaultSize.setRemoved(n.size));const o=t?e.reduce(((e,t)=>e+(n.$index<t?1:0)),0):e.reduce(((e,t)=>e-(n.$index>t?1:0)),0);n.changeIndex(n.$index+o),s.set(n.$index,n),i=n.$index<i?n.$index:i,r=n.$index>r?n.$index:r})),this.items=s,this.minIndex=i,this.maxIndex=r}updateSubset(e,t,s){if(!this.size||!e.length)return;const i=e[0].$index,r=e[e.length-1].$index;let n,o;if(t.length){const e=t[0].$index,s=t[t.length-1].$index;n=e-i,o=s-r}else n=s?r-i+1:0,o=s?0:i-r-1;const a=new Map;this.items.forEach((e=>e.$index<i?(e.changeIndex(e.$index+n),void a.set(e.$index,e)):e.$index>r?(e.changeIndex(e.$index+o),void a.set(e.$index,e)):void 0)),t.forEach((e=>a.set(e.$index,new xt(e,this.saveData)))),e.filter((e=>e.toRemove)).forEach((e=>this.defaultSize.setRemoved(e.size))),this.minIndex+=n,this.maxIndex+=o,this.items=a}shiftIndexes(e){const t=new Map;let s=1/0,i=-1/0;this.items.forEach((r=>{r.changeIndex(r.$index+e),t.set(r.$index,r),s=r.$index<s?r.$index:s,i=r.$index>i?r.$index:i})),this.items=t,this.minIndex=s,this.maxIndex=i}}class It{constructor(e,t){this.context=e,this.logger=t}fillEmpty(e,t,s){return e.length?Number.isInteger(t)||Number.isInteger(s)?(this.logger.log((()=>`going to fill the buffer with ${e.length} item(s)`)),!0):(this.logger.log("no items to fill the buffer; wrong indexes"),!1):(this.logger.log("no items to fill the buffer; empty list"),!1)}insertInBuffer(e,t,s){const i=Number.isInteger(t)?t:Number.isInteger(s)?s:NaN,r=this.context.items.find((t=>e&&e(t.get())||Number.isInteger(i)&&i===t.$index));return r?r.$index:(this.logger.log("no items to insert in buffer; empty predicate's result"),NaN)}insertVirtual(e,t,s){if(!e.length)return this.logger.log("no items to insert virtually; empty list"),!1;const{firstIndex:i,lastIndex:r,finiteAbsMinIndex:n,finiteAbsMaxIndex:o}=this.context;if(t<n||t>o)return this.logger.log((()=>`no items to insert virtually; selected index (${t}) does not match virtual area [${n}..${o}]`)),!1;const a=s===I.backward;return t<i+(a?1:0)||t>r-(a?0:1)?(this.logger.log((()=>`going to insert ${e.length} item(s) virtually`)),!0):(this.logger.log((()=>`no items to insert virtually; selected index (${t}) belongs Buffer [${i}..${r}]`)),!1)}}class wt{constructor(t,s,i){this._items=[],this.logger=i,this.changeItems=s,this.bof=new e(!1),this.eof=new e(!1),this.cache=new bt(t,i),this.checkCall=new It(this,i),this.startIndexUser=t.startIndex,this.minIndexUser=t.minIndex,this.maxIndexUser=t.maxIndex,this.reset(!0)}dispose(){this.bof.dispose(),this.eof.dispose(),this._items.forEach((e=>e.dispose())),this._items=[]}reset(e,t){this.items.forEach((e=>e.hide())),this.pristine=!0,this.items=[],this.cache.reset(e),this.absMinIndex=this.minIndexUser,this.absMaxIndex=this.maxIndexUser,this.setCurrentStartIndex(t),this.bof.set(!1),this.eof.set(!1),this.pristine=!1}setCurrentStartIndex(e){const t=this.minIndexUser,s=this.maxIndexUser,i=this.startIndexUser;let r=Number(e);Number.isNaN(r)&&(this.logger.log((()=>`fallback startIndex to settings.startIndex (${i})`)),r=i),r<t&&(this.logger.log((()=>`setting startIndex to settings.minIndex (${t}) because ${r} < ${t}`)),r=t),r>s&&(this.logger.log((()=>`setting startIndex to settings.maxIndex (${s}) because ${r} > ${s}`)),r=s),this.startIndex=r}set items(e){this._items=e,this.changeItems(e),this.pristine||(this.checkBOF(),this.checkEOF())}get items(){return this._items}set absMinIndex(e){this._absMinIndex!==e&&(this._absMinIndex=Number.isFinite(this._absMaxIndex)&&e>this._absMaxIndex?this._absMaxIndex:e),this.pristine||this.checkBOF()}get absMinIndex(){return this._absMinIndex}set absMaxIndex(e){this._absMaxIndex!==e&&(this._absMaxIndex=Number.isFinite(this._absMinIndex)&&e<this._absMinIndex?this._absMinIndex:e),this.pristine||this.checkEOF()}get absMaxIndex(){return this._absMaxIndex}checkBOF(){const e=this.items.length?this.items[0].$index===this.absMinIndex:isFinite(this.absMinIndex);this.bof.set(e)}checkEOF(){const e=this.items.length?this.items[this.items.length-1].$index===this.absMaxIndex:isFinite(this.absMaxIndex);this.eof.set(e)}get size(){return this._items.length}get cacheSize(){return this.cache.size}get defaultSize(){return this.cache.getDefaultSize()}get minIndex(){return isFinite(this.cache.minIndex)?this.cache.minIndex:this.startIndex}get maxIndex(){return isFinite(this.cache.maxIndex)?this.cache.maxIndex:this.startIndex}get firstIndex(){return this.items.length?this.items[0].$index:NaN}get lastIndex(){return this.items.length?this.items[this.items.length-1].$index:NaN}get finiteAbsMinIndex(){return isFinite(this.absMinIndex)?this.absMinIndex:this.minIndex}get finiteAbsMaxIndex(){return isFinite(this.absMaxIndex)?this.absMaxIndex:this.maxIndex}get(e){return this.items.find((t=>t.$index===e))}setItems(e){if(this.items.length)if(this.items[0].$index>e[e.length-1].$index)this.items=[...e,...this.items];else{if(!(e[0].$index>this.items[this.items.length-1].$index))return!1;this.items=[...this.items,...e]}else this.items=[...e];return!0}clip(){this.items=this.items.filter((({toRemove:e})=>!e))}getIndexToInsert(e,t,s){return this.checkCall.insertInBuffer(e,t,s)}shiftExtremum(e,t){t?(this.absMinIndex-=e,this.startIndex-=e):this.absMaxIndex+=e,this.startIndex>this.absMaxIndex?this.startIndex=this.absMaxIndex:this.startIndex<this.absMinIndex&&(this.startIndex=this.absMinIndex)}insertVirtually(e,t,s,i){if(!this.checkCall.insertVirtual(e,t,s))return!1;let r=0;return t<=this.firstIndex&&!i?r=e.length:t>=this.lastIndex&&i&&(r=-e.length),r&&(this.items.forEach((e=>e.updateIndex(e.$index+r))),this.cache.insertItems(e,t,s,i),this.items=[...this.items]),this.shiftExtremum(e.length,i),!0}removeVirtually(e,t){const s=this.items.length;let i=!1;for(let r=t?s-1:0;t?r>=0:r<s;t?r--:r++){const s=this.items[r],n=e.reduce(((e,i)=>e+(t?s.$index<i?1:0:s.$index>i?-1:0)),0);i=i||!!n,s.updateIndex(s.$index+n)}this.shiftExtremum(-e.length,t),i&&(this.items=[...this.items]),this.cache.removeItems(e,t)}fillEmpty(e,t,s,i,r){if(!this.checkCall.fillEmpty(e,t,s))return!1;const n=Number.isInteger(t),o=n?t:s,a=i?e.length:n?1:0;return this.items=e.map(((e,t)=>r(o+t+(n?0:1)-a,e))),this._absMinIndex=this.items[0].$index,this._absMaxIndex=this.items[this.size-1].$index,this.startIndex<=this.absMinIndex?this.startIndex=this.absMinIndex:this.startIndex>this.absMaxIndex&&(this.startIndex=this.absMaxIndex),!0}updateItems(e,t,s,i){if(!this.size||Number.isNaN(this.firstIndex))return{trackedIndex:NaN,toRemove:[]};let r=s,n=i?this.lastIndex:this.firstIndex;const o=[],a=i?-1:1,l=this.size-1,c=new Map,d=Array.prototype[i?"unshift":"push"];for(let h=i?l:0;i?h>=0:h<=l;h+=a){const l=this.items[h];c.set(l.$index,l);const u=e(l);if(!u||Array.isArray(u)&&!u.length){l.toRemove=!0,r+=l.$index>=s?i?1:0:i?0:-1,this.shiftExtremum(-1,i);continue}if(!Array.isArray(u)){l.updateIndex(n),d.call(o,l),n+=a;continue}l.$index<s?r+=i?0:u.length-1:l.$index>s&&(r+=i?1-u.length:0);let f=!0;const p=[];(i?[...u].reverse():u).forEach(((e,i)=>{let o;l.data===e?(s===l.$index&&(r=n+i*a),l.updateIndex(n+i*a),o=l,f=!1):(o=t(n+i*a,e),o.toInsert=!0),d.call(p,o)})),l.toRemove=f,d.call(o,...p),n+=a*u.length,u.length>1&&this.shiftExtremum(u.length-1,i)}const h=this.items.filter((e=>e.toRemove)),u=Array.from(c).map((([e,{size:t,toRemove:s}])=>({$index:e,size:t,toRemove:s}))).sort(((e,t)=>e.$index-t.$index));return this.items=o,this.cache.updateSubset(u,o,i),this.finiteAbsMinIndex===this.finiteAbsMaxIndex?r=NaN:r>this.finiteAbsMaxIndex?r=this.finiteAbsMaxIndex:r<this.finiteAbsMinIndex&&(r=this.finiteAbsMinIndex),{trackedIndex:r,toRemove:h}}cacheItem(e){this.cache.add(e)}getFirstVisibleItemIndex(){const e=this.items.length;for(let t=0;t<e;t++)if(!this.items[t].invisible)return t;return-1}getLastVisibleItemIndex(){for(let e=this.items.length-1;e>=0;e--)if(!this.items[e].invisible)return e;return-1}getFirstVisibleItem(){const e=this.getFirstVisibleItemIndex();if(e>=0)return this.items[e]}getLastVisibleItem(){const e=this.getLastVisibleItemIndex();if(e>=0)return this.items[e]}getEdgeVisibleItem(e,t){return e===(t?I.backward:I.forward)?this.getLastVisibleItem():this.getFirstVisibleItem()}getVisibleItemsCount(){return this.items.reduce(((e,t)=>e+(t.invisible?0:1)),0)}getSizeByIndex(e){return this.cache.getSizeByIndex(e)}checkDefaultSize(){return this.cache.recalculateDefaultSize()}}class vt{constructor(t){this.total=t,this.isInitial=!1,this.busy=new e(!1)}get first(){return 0===this.count}done(){this.isInitial=!1,this.count++,this.total++,this.busy.set(!1)}start(){this.busy.set(!0)}dispose(){this.busy.dispose()}}class yt{constructor(t,s){const i=s?s.count:1,r=s?s.innerLoop.count:0;this.instanceIndex=t,this.innerLoop=new vt(r),this.interrupter=null,this.busy=new e(!1),this.end(i)}get loopId(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total}`}get loopIdNext(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total+1}`}start(e,t){this.isInitial=e,this.initiator=t,this.innerLoop.isInitial=e,this.innerLoop.count=0,this.interrupter=null,this.busy.set(!0)}end(e){this.count=e,this.isInitial=!1,this.busy.set(!1)}dispose(e){e&&this.busy.dispose(),this.innerLoop.dispose()}}class St{constructor(){this.reset()}reset(){this.startDelta=0,this.before=0}}class zt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN,this.position=NaN}}class kt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN}}class $t{constructor(){this.reset()}reset(){this.index=NaN,this.delta=0}}class Et{constructor(e){this.directionPriority=e,this.callCount=0,this.positions=new St,this.first=new zt,this.last=new kt,this.firstVisible=new $t,this.reset()}reset(){this._newItemsData=null,this.items=[],this.positions.reset(),this.first.reset(),this.last.reset(),this.firstVisible.reset(),this.hasAnotherPack=!1,this.direction=null,this.cancel=null,this.simulate=!1,this.isCheck=!1,this.doRemove=!1}get newItemsData(){return this._newItemsData}set newItemsData(e){this._newItemsData=e,e&&e.length&&this.callCount++}get shouldFetch(){return!!this.count}get hasNewItems(){return!(!this._newItemsData||!this._newItemsData.length)}get index(){return this.first.index}get count(){return isNaN(this.first.index)||isNaN(this.last.index)?0:this.last.index-this.first.index+1}shouldCheckPreSizeExpectation(e){if(this.directionPriority===I.backward)return!1;const t=this.items[this.items.length-1];return t&&t.$index<e}startSimulate(e){this.simulate=!0,this._newItemsData=e.map((e=>e.data)),this.items=e,this.hasAnotherPack=!1}stopSimulate(){this.simulate=!1,this.isCheck=!1,this.doRemove=!1}fill(e,t){this.startSimulate(e),this.first.index=e[0].$index,this.last.index=e[e.length-1].$index,this.direction=I.forward,this.firstVisible.index=t,this.firstVisible.delta=0}check(e){this.startSimulate(e),this.last.index=e[0].$index,this.first.index=e[e.length-1].$index,this.isCheck=!0}update(e,t,s,i){this.startSimulate(s),this.firstVisible.index=e,this.firstVisible.delta=t,this.doRemove=i.length>0}}class Mt{constructor(){this.callCount=0,this.reset()}get force(){return this.forceForward||this.forceBackward}reset(e){this.doClip=!1,e||(this.forceForward=!1,this.forceBackward=!1)}}class Nt{constructor(){this.reset()}get noSize(){return this.sizeBefore===this.sizeAfter}reset(){this.sizeBefore=0,this.sizeAfter=0,this.positionBefore=0,this.cancel=null}}class Vt{constructor(){this.reset()}reset(){this.previous=null,this.current=null,this.syntheticPosition=null,this.syntheticFulfill=!1,this.positionBeforeAsync=null,this.positionBeforeAdjust=null,this.positionAfterAdjust=null,this.stop()}stop(){this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.cancelAnimation&&(this.cancelAnimation(),this.cancelAnimation=null)}hasPositionChanged(e){const t=this.positionBeforeAdjust,s=this.positionAfterAdjust;return null===t||t!==e||null===s||s!==e}}class Ot{constructor(e,t,s){this.packageInfo=e,this.settings=t,this.initTime=Number(new Date),this.cycle=new yt(this.settings.instanceIndex,s?s.cycle:void 0),this.fetch=new Et(t.directionPriority),this.clip=new Mt,this.render=new Nt,this.scroll=new Vt}get time(){return Number(new Date)-this.initTime}startWorkflowCycle(e,t){this.cycle.start(e,t)}endWorkflowCycle(e){this.cycle.end(e)}startInnerLoop(){const{cycle:e,scroll:t,fetch:s,render:i,clip:r}=this;return e.innerLoop.start(),t.positionBeforeAsync=null,s.simulate||s.reset(),r.reset(r.force),i.reset(),Object.assign({},e.innerLoop.first?{process:e.initiator,doRender:s.simulate&&s.items.length>0}:{})}endInnerLoop(){const{fetch:e,clip:t,render:s,cycle:i}=this;e.stopSimulate(),t.reset(!0),e.cancel&&(e.cancel(),e.cancel=null),s.cancel&&(s.cancel(),s.cancel=null),i.innerLoop.done()}dispose(){this.scroll.stop(),this.cycle.dispose(),this.endInnerLoop()}}const At=h(),Rt=(e,t)=>"object"==typeof e&&null!==e&&Object.prototype.hasOwnProperty.call(e,t),Pt=(e,t,s)=>{let i=t;if(!Rt(t,"items")){const r=Array.isArray(t)?t:[t];i=e?{items:r,bof:s}:{items:r,eof:s}}return i};class Ct{constructor(e,i,r){this.source={},this.box={},this.demand={},this.wanted={},this.getWorkflow=i,this.logger=r,this.relax$=null,this.relaxRun=null,this.reloadCounter=0;const n=e&&u.get(e.id)||{},o=e?At.map((t=>{let s=e[t.name];if(e.augmented){const e=n[t.name];e&&(s=e.default)}return Object.assign(Object.assign({},t),{value:s})})):h();Object.entries(n).forEach((([e,t])=>{const s=o.find((({name:t})=>t===e));s&&t&&(s.value=t.default)})),o.filter((({type:e,permanent:t})=>e===s.Scalar&&t)).forEach((({name:e,value:t})=>Object.defineProperty(this,e,{configurable:!0,get:()=>t}))),o.filter((e=>e.type===s.Reactive)).forEach((({name:e,value:t})=>{this.source[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>{const t=At.find((({wanted:t,reactive:s})=>t&&s===e));return t&&(this.wanted[t.name]=!0),this.source[e]}})})),o.filter((e=>e.type===s.Scalar&&!!e.reactive)).forEach((({name:e,value:t,reactive:s,wanted:i})=>{i&&(this.wanted[e]=!1),this.box[e]=t,Object.defineProperty(this,e,{configurable:!0,set:t=>{if(t!==this.box[e]){this.box[e]=t,this.source[s].set(t);const i=n[s];i&&i.emit(i.source,t)}},get:()=>(i&&(this.wanted[e]=!0),this.box[e])})})),o.filter((e=>e.type===s.Scalar&&e.onDemand)).forEach((({name:e,value:t})=>{this.demand[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.demand[e]})})),e&&(o.forEach((({name:i,type:r,value:o,permanent:a})=>{let l=this[i];r===s.Function?l=l.bind(this):r===s.WorkflowRunner?l=this.getPromisifiedMethod(l,o):r===s.Reactive&&n[i]?l=e[i]:i===t.augmented&&(l=!0),Object.defineProperty(e,i,{configurable:!0,get:()=>a||r!==s.Scalar?l:this[i]})})),this.externalContext=e)}get workflow(){return this.getWorkflow()}get reloadCount(){return this.reloadCounter}get reloadId(){return this.id+"."+this.reloadCounter}getPromisifiedMethod(e,t){return(...s)=>this.relax$?new Promise((t=>{this.relax$&&this.relax$.once((e=>t(e))),e.apply(this,s)})):t.apply(this,s)}initialize(s,i,r,n){if(Object.defineProperty(this.demand,t.itemsCount,{get:()=>s.getVisibleItemsCount()}),Object.defineProperty(this.demand,t.bufferInfo,{get:()=>({firstIndex:s.firstIndex,lastIndex:s.lastIndex,minIndex:s.minIndex,maxIndex:s.maxIndex,absMinIndex:s.absMinIndex,absMaxIndex:s.absMaxIndex,defaultSize:s.defaultSize})}),this.bof=s.bof.get(),s.bof.on((e=>this.bof=e)),this.eof=s.eof.get(),s.eof.on((e=>this.eof=e)),Object.defineProperty(this.demand,t.packageInfo,{get:()=>i.packageInfo}),this.loopPending=i.cycle.innerLoop.busy.get(),i.cycle.innerLoop.busy.on((e=>this.loopPending=e)),this.isLoading=i.cycle.busy.get(),i.cycle.busy.on((e=>this.isLoading=e)),this.logger=r,n){this.relax$||(this.relax$=new e);const t=this.relax$;n.on((({status:e,payload:s})=>{let i=()=>{};e===se.start?i=this.isLoading$.on((e=>{e||(i(),t.set({success:!0,immediate:!1,details:null}))})):e!==se.done&&e!==se.error||(i(),t.set({success:e!==se.error,immediate:!0,details:e===se.error&&s?String(s.error):null}))}))}this.init=!0}dispose(){this.relax$&&this.relax$.dispose(),this.externalContext&&this.resetContext(),Object.getOwnPropertyNames(this).forEach((e=>{delete this[e]}))}resetContext(){const e=u.get(this.externalContext.id);At.forEach((({type:t,permanent:i,name:r,value:n})=>{if(t===s.Reactive||i||Object.defineProperty(this.externalContext,r,{configurable:!0,get:()=>n}),t===s.Reactive&&e){const t=e[r];t&&(t.default.reset(),t.emit(t.source,t.default.get()))}}))}reset(e){this.reloadCounter++,this.logger.logAdapterMethod("reset",e,` of ${this.reloadId}`),this.workflow.call({process:te.reset,status:se.start,payload:{options:e}})}reload(e){this.reloadCounter++,this.logger.logAdapterMethod("reload",e,` of ${this.reloadId}`),this.workflow.call({process:te.reload,status:se.start,payload:{options:e}})}append(e,t){const s=Pt(!1,e,t);this.logger.logAdapterMethod("append",[s.items,s.eof]),this.workflow.call({process:te.append,status:se.start,payload:{options:s}})}prepend(e,t){const s=Pt(!0,e,t);this.logger.logAdapterMethod("prepend",[s.items,s.bof]),this.workflow.call({process:te.prepend,status:se.start,payload:{options:s}})}check(){this.logger.logAdapterMethod("check"),this.workflow.call({process:te.check,status:se.start})}remove(e){e=(e=>{Rt(e,"predicate")||Rt(e,"indexes")||(e={predicate:e});return e})(e),this.logger.logAdapterMethod("remove",e),this.workflow.call({process:te.remove,status:se.start,payload:{options:e}})}clip(e){this.logger.logAdapterMethod("clip",e),this.workflow.call({process:te.clip,status:se.start,payload:{options:e}})}insert(e){this.logger.logAdapterMethod("insert",e),this.workflow.call({process:te.insert,status:se.start,payload:{options:e}})}replace(e){this.logger.logAdapterMethod("replace",e),this.workflow.call({process:te.replace,status:se.start,payload:{options:e}})}update(e){this.logger.logAdapterMethod("update",e),this.workflow.call({process:te.update,status:se.start,payload:{options:e}})}fix(e){this.logger.logAdapterMethod("fix",e),this.workflow.call({process:te.fix,status:se.start,payload:{options:e}})}relaxUnchained(e,t){const s=()=>"function"==typeof e&&t===this.reloadId&&e();return this.isLoading||s(),new Promise((e=>{this.isLoading?this.isLoading$.once((()=>{s(),e(!1)})):e(!0)})).then((e=>{const s=t===this.reloadId;return this.logger.log((()=>s?void 0:`relax promise cancelled due to ${t} != ${this.reloadId}`)),{immediate:e,success:s,details:s?null:"Interrupted by reload or reset"}}))}relax(e){const t=this.reloadId;return this.logger.logAdapterMethod("relax",e,` of ${t}`),this.init?this.relaxRun=this.relaxRun?this.relaxRun.then((()=>this.relaxUnchained(e,t))):this.relaxUnchained(e,t).then((e=>(this.relaxRun=null,e))):Promise.resolve(o)}showLog(){this.logger.logAdapterMethod("showLog"),this.logger.logForce()}}const Tt="Invalid datasource:";let Ft=0;class Bt{constructor({datasource:e,consumer:t,element:s,workflow:i,scroller:r}){const{params:{get:n}}=C(e,L);if(!n.isValid)throw new Error(`Invalid datasource: ${n.errors[0]}`);const o=r?r.state.packageInfo:{consumer:t,core:f};s=r?r.viewport.element:s,i=r?r.workflow:i,this.workflow=i,this.settings=new Te(e.settings,e.devSettings,++Ft),this.logger=new dt(this,o,e.adapter),this.routines=new ht(this.settings),this.state=new Ot(o,this.settings,r?r.state:void 0),this.buffer=new wt(this.settings,i.onDataChanged,this.logger),this.viewport=new pt(s,this.settings,this.routines,this.state,this.logger),this.logger.object("vscroll settings object",this.settings,!0),this.initDatasource(e,r)}initDatasource(e,t){if(t)return this.datasource=e,void(this.adapter=t.adapter);const s=e instanceof m,i=!s&&!this.settings.adapter;if(s)this.datasource=e;else{const t=x((()=>({mock:i})));this.datasource=new t(e),this.settings.adapter&&(e.adapter=this.datasource.adapter)}const r=i?null:this.datasource.adapter;this.adapter=new Ct(r,(()=>this.workflow),this.logger)}init(e){this.viewport.reset(this.buffer.startIndex),this.logger.stat("initialization"),this.adapter.initialize(this.buffer,this.state,this.logger,e)}dispose(e){e&&this.adapter.dispose(),this.buffer.dispose(),this.state.dispose()}finalize(){}}class Lt{constructor({element:t,datasource:s,consumer:i,run:r}){this.isInitialized=!1,this.initTimer=null,this.adapterRun$=new e,this.cyclesDone=0,this.interruptionCount=0,this.errors=[],this.offScroll=()=>null,this.propagateChanges=r,this.stateMachineMethods={run:this.runProcess(),interrupt:this.interrupt.bind(this),done:this.done.bind(this),onError:this.onError.bind(this)},this.scroller=new Bt({element:t,datasource:s,consumer:i,workflow:this.getUpdater()}),this.scroller.settings.initializeDelay?this.initTimer=setTimeout((()=>{this.initTimer=null,this.init()}),this.scroller.settings.initializeDelay):this.init()}init(){this.scroller.init(this.adapterRun$),this.isInitialized=!0,this.callWorkflow({process:ee.init,status:se.start});const{viewport:{scrollEventReceiver:e},routines:t}=this.scroller;this.offScroll=t.onScroll(e,(e=>this.callWorkflow({process:ee.scroll,status:se.start,payload:{event:e}})))}changeItems(e){this.propagateChanges(e)}callWorkflow(e){if(!this.isInitialized)return;const{process:t,status:s}=e;t&&t.startsWith("adapter")&&s!==se.next&&this.adapterRun$.set(e),this.process(e)}getUpdater(){return{call:this.callWorkflow.bind(this),onDataChanged:this.changeItems.bind(this)}}process(e){const{status:t,process:s,payload:i}=e;this.scroller.settings.logProcessRun&&this.scroller.logger.log((()=>["%cfire%c","color: #cc7777;","color: #000000;",s,`"${t}"`,...void 0!==i?[i]:[]])),this.scroller.logger.logProcess(e),s===ee.end&&this.scroller.finalize(),(({input:{process:e,status:t,payload:s={}},methods:{run:i,interrupt:r,done:n,onError:o}})=>{if(t===se.error)return o(e,s),void(e.startsWith("adapter")||i(ot)(s));const{options:a}=s;switch(e){case ee.init:t===se.start&&i(De)(e),t===se.next&&i(et)();break;case ee.scroll:t===se.start&&i(je)(s),t===se.next&&i(De)(e);break;case te.reset:case te.reload:t===se.start&&(e===te.reset?i(_e)(a):i(Ue)(a)),t===se.next&&(r(Object.assign({process:e},s)),s.finalize?i(ot)():i(De)(e));break;case te.append:case te.prepend:t===se.start&&i(Ge)({process:e,options:a}),t===se.next&&i(De)(e);break;case te.check:t===se.start&&i(Xe)(),t===se.next&&i(De)(e);break;case te.remove:t===se.start&&i(Ye)(a),t===se.next&&i(De)(e);break;case te.clip:t===se.start&&i(Je)(a),t===se.next&&i(De)(e);break;case te.insert:t===se.start&&i(He)(a),t===se.next&&i(De)(e);break;case te.replace:t===se.start&&i(Qe)(a),t===se.next&&i(De)(e);break;case te.update:t===se.start&&i(qe)(a),t===se.next&&i(De)(e);break;case te.fix:t===se.start&&i(Ke)(a),t===se.next&&i(De)(e);break;case ee.start:switch(s.process){case te.append:case te.insert:case te.replace:case te.update:s.doRender?i(rt)():i(at)();break;case te.check:i(rt)();break;case te.remove:i(at)();break;default:i(tt)()}break;case ee.preFetch:t===se.next&&(s.process===te.clip?i(lt)():i(st)()),t===se.done&&i(ot)();break;case ee.fetch:i(it)();break;case ee.postFetch:t===se.next&&i(rt)(),t===se.done&&i(ot)();break;case ee.render:if(t===se.next)switch(s.process){case te.append:case te.check:case te.insert:case te.replace:case te.update:i(at)();break;default:i(lt)()}t===se.done&&i(ot)();break;case ee.preClip:s.doClip?i(ct)():i(at)();break;case ee.clip:i(at)();break;case ee.adjust:i(ot)();break;case ee.end:if(t===se.next)switch(s.process){case te.reset:case te.reload:n(),i(De)(s.process);break;default:i(et)()}t===se.done&&n()}})({input:e,methods:this.stateMachineMethods})}runProcess(){return({run:e,process:t,name:s})=>(...i)=>{this.scroller.settings.logProcessRun&&this.scroller.logger.log((()=>["%crun%c","color: #333399;","color: #000000;",t||s,...i])),e(this.scroller,...i)}}onError(e,t){const s=t&&String(t.error)||"",{time:i,cycle:r}=this.scroller.state;this.errors.push({process:e,message:s,time:i,loop:r.loopIdNext}),this.scroller.logger.logError(s)}interrupt({process:e,finalize:t,datasource:s}){if(t){const{workflow:t,logger:s}=this.scroller;t.call=e=>s.log("[skip wf call]"),t.call.interrupted=!0,this.scroller.workflow=this.getUpdater(),this.interruptionCount++,s.log((()=>`workflow had been interrupted by the ${e} process (${this.interruptionCount})`))}s&&this.scroller.adapter.relax((()=>{this.scroller.logger.log("new Scroller instantiation");const e=new Bt({datasource:s,scroller:this.scroller});this.scroller.dispose(),this.scroller=e,this.scroller.init()}))}done(){const{state:e,logger:t}=this.scroller;this.cyclesDone++,t.logCycle(!1),e.endWorkflowCycle(this.cyclesDone+1),this.finalize()}dispose(){this.initTimer&&clearTimeout(this.initTimer),this.offScroll(),this.adapterRun$.dispose(),this.scroller.dispose(!0),Object.getOwnPropertyNames(this).forEach((e=>{delete this[e]}))}finalize(){}}export{t as AdapterPropName,I as Direction,d as EMPTY_ITEM,Tt as INVALID_DATASOURCE_PREFIX,w as SizeStrategy,Lt as Workflow,h as getDefaultAdapterProps,x as makeDatasource,f as packageInfo};
|
|
5
|
+
class e{constructor(e,t){this.id=0,void 0!==e&&(this.value=e,this.initialValue=e),this.options=t||{},this.subscriptions=new Map}set(e){if(this.value!==e||this.options.emitEqual){this.value=e;for(const[,t]of this.subscriptions)if(t.emit(e),this.value!==e)break}}get(){return this.value}on(e){const t=this.id++,s={emit:e,off:()=>{s.emit=()=>null,this.subscriptions.delete(t)}};return this.subscriptions.set(t,s),this.options.emitOnSubscribe&&s.emit(this.value),()=>s.off()}once(e){const t=this.on((s=>{t(),e(s)}));return t}reset(){this.set(this.initialValue)}dispose(){this.subscriptions.forEach((e=>e.off()))}}var t,s;!function(e){e.id="id",e.mock="mock",e.augmented="augmented",e.version="version",e.init="init",e.init$="init$",e.packageInfo="packageInfo",e.itemsCount="itemsCount",e.bufferInfo="bufferInfo",e.isLoading="isLoading",e.isLoading$="isLoading$",e.loopPending="loopPending",e.loopPending$="loopPending$",e.firstVisible="firstVisible",e.firstVisible$="firstVisible$",e.lastVisible="lastVisible",e.lastVisible$="lastVisible$",e.bof="bof",e.bof$="bof$",e.eof="eof",e.eof$="eof$",e.reset="reset",e.reload="reload",e.append="append",e.prepend="prepend",e.check="check",e.remove="remove",e.clip="clip",e.insert="insert",e.replace="replace",e.update="update",e.fix="fix",e.relax="relax",e.showLog="showLog"}(t||(t={})),function(e){e[e.Scalar=0]="Scalar",e[e.Reactive=1]="Reactive",e[e.WorkflowRunner=2]="WorkflowRunner",e[e.Function=3]="Function"}(s||(s={}));const i=t,n=s,r=()=>null,o={immediate:!0,success:!0,details:"Adapter is not initialized"},a=()=>Promise.resolve(o),l={core:{name:"",version:""},consumer:{name:"",version:""}},c={firstIndex:NaN,lastIndex:NaN,minIndex:NaN,maxIndex:NaN,absMinIndex:-1/0,absMaxIndex:1/0,defaultSize:NaN},d={data:{},element:{}},h=()=>[{type:n.Scalar,name:i.id,value:0,permanent:!0},{type:n.Scalar,name:i.mock,value:!0,permanent:!0},{type:n.Scalar,name:i.augmented,value:!1,permanent:!0},{type:n.Scalar,name:i.version,value:"",permanent:!0},{type:n.Scalar,name:i.init,value:!1,reactive:i.init$},{type:n.Scalar,name:i.packageInfo,value:l,onDemand:!0},{type:n.Scalar,name:i.itemsCount,value:0,onDemand:!0},{type:n.Scalar,name:i.bufferInfo,value:c,onDemand:!0},{type:n.Scalar,name:i.isLoading,value:!1,reactive:i.isLoading$},{type:n.Scalar,name:i.loopPending,value:!1,reactive:i.loopPending$},{type:n.Scalar,name:i.firstVisible,value:d,reactive:i.firstVisible$,wanted:!0},{type:n.Scalar,name:i.lastVisible,value:d,reactive:i.lastVisible$,wanted:!0},{type:n.Scalar,name:i.bof,value:!1,reactive:i.bof$},{type:n.Scalar,name:i.eof,value:!1,reactive:i.eof$},{type:n.WorkflowRunner,name:i.reset,value:a},{type:n.WorkflowRunner,name:i.reload,value:a},{type:n.WorkflowRunner,name:i.append,value:a},{type:n.WorkflowRunner,name:i.prepend,value:a},{type:n.WorkflowRunner,name:i.check,value:a},{type:n.WorkflowRunner,name:i.remove,value:a},{type:n.WorkflowRunner,name:i.clip,value:a},{type:n.WorkflowRunner,name:i.insert,value:a},{type:n.WorkflowRunner,name:i.replace,value:a},{type:n.WorkflowRunner,name:i.update,value:a},{type:n.WorkflowRunner,name:i.fix,value:a},{type:n.Function,name:i.relax,value:r},{type:n.Function,name:i.showLog,value:r},{type:n.Reactive,name:i.init$,value:new e},{type:n.Reactive,name:i.isLoading$,value:new e},{type:n.Reactive,name:i.loopPending$,value:new e},{type:n.Reactive,name:i.firstVisible$,value:new e(d,{emitOnSubscribe:!0})},{type:n.Reactive,name:i.lastVisible$,value:new e(d,{emitOnSubscribe:!0})},{type:n.Reactive,name:i.bof$,value:new e},{type:n.Reactive,name:i.eof$,value:new e}],u=new Map;var f={name:"vscroll",version:"1.4.4"};let g=0;class p{constructor(e){const{mock:i,reactive:n}=e,r=++g,o={configurable:!0},a={};Object.defineProperty(this,t.id,Object.assign({get:()=>r},o)),Object.defineProperty(this,t.mock,Object.assign({get:()=>i},o)),Object.defineProperty(this,t.augmented,Object.assign({get:()=>!1},o)),Object.defineProperty(this,t.version,Object.assign({get:()=>f.version},o)),h().filter((({permanent:e})=>!e)).forEach((({name:e,value:t,type:i})=>{if(n&&i===s.Reactive){const s=n[e];s&&(a[e]=Object.assign(Object.assign({},s),{default:t}),t=s.source)}Object.defineProperty(this,e,Object.assign({get:()=>t},o))})),n&&u.set(r,a)}}class m{constructor(e,t){this.get=e.get,e.settings&&(this.settings=e.settings),e.devSettings&&(this.devSettings=e.devSettings);const s=new p(t||{mock:!1});this.adapter=s}dispose(){u.delete(this.adapter.id)}}const x=e=>class extends m{constructor(t){super(t,"function"==typeof e?e():void 0)}},b=x();var I,w,v;!function(e){e.forward="forward",e.backward="backward"}(I||(I={})),function(e){e.Average="average",e.Constant="constant",e.Frequent="frequent"}(w||(w={})),function(e){e.number="must be a number",e.integer="must be an integer",e.integerUnlimited="must be an integer or infinity",e.moreOrEqual="must be a number greater than (or equal to) {arg1}",e.itemList="must be an array of items {arg1}",e.boolean="must be a boolean",e.object="must be an object",e.element="must be an html element",e.function="must be a function",e.funcOfxArguments="must have {arg1} argument(s)",e.funcOfxAndMoreArguments="must have at least {arg1} argument(s)",e.funcOfXToYArguments="must have {arg1} to {arg2} arguments",e.oneOfCan="can be present as only one item of {arg1} list",e.oneOfMust="must be present as only one item of {arg1} list",e.or="must satisfy at least 1 validator from {arg1} list",e.enum="must belong to {arg1} list"}(v||(v={}));const y=(e,t)=>(t||[""]).reduce(((e,t,s)=>e.replace(`{arg${s+1}}`,t)),e),S=e=>"number"==typeof e||"string"==typeof e&&""!==e?Number(e):NaN,z=e=>{const t=S(e),s=[];return Number.isNaN(t)&&s.push(v.number),{value:t,isSet:!0,isValid:!s.length,errors:s}},k=(e,t)=>s=>{const i=z(s);if(!i.isValid)return i;let n=i.value;const r=[];return n<e&&(t?n=e:r.push(y(v.moreOrEqual,[String(e)]))),{value:n,isSet:!0,isValid:!r.length,errors:r}},$=e=>{const t=[];return"function"!=typeof e&&t.push(v.function),{value:e,isSet:!0,isValid:!t.length,errors:t}},E=(e,t)=>s=>{const i=$(s);if(!i.isValid)return i;const n=[];return((s=i.value).length<e||s.length>t)&&n.push(y(v.funcOfXToYArguments,[String(e),String(t)])),{value:s,isSet:!0,isValid:!n.length,errors:n}},M=(e,t)=>(s,i)=>{const n=[],r=void 0!==s;let o=!r;const a=t?v.oneOfMust:v.oneOfCan;if(Array.isArray(e)&&e.length){for(let t=e.length-1;t>=0;t--){const s=e[t];if("string"!=typeof s){n.push(y(a,[e.join('", "')])+" (non-string token)");break}const l=i&&Object.prototype.hasOwnProperty.call(i,s);if(r&&l){n.push(y(a,[e.join('", "')])+` (${s} is present)`);break}o&&l&&(o=!1)}t&&o&&n.push(y(a,[e.join('", "')]))}else n.push(y(a,["undefined"]));return{value:s,isSet:r,isValid:!n.length,errors:n}},V=e=>t=>{const s=[],i=Object.keys(e).filter((e=>isNaN(Number(e)))).map((t=>e[t]));return i.some((e=>e===t))||s.push(y(v.enum,["["+i.join(",")+"]"])),{value:t,isSet:!0,isValid:!s.length,errors:s}},N={NUMBER:{type:v.number,method:z},INTEGER:{type:v.integer,method:e=>{const t=[];e=S(e);const s=parseInt(String(e),10);return e!==s&&t.push(v.integer),{value:s,isSet:!0,isValid:!t.length,errors:t}}},INTEGER_UNLIMITED:{type:v.integerUnlimited,method:e=>{let t=e;const s=[];return e=S(e),t=Number.isFinite(e)?parseInt(String(e),10):e,e!==t&&s.push(v.integerUnlimited),{value:t,isSet:!0,isValid:!s.length,errors:s}}},MORE_OR_EQUAL:(e,t)=>({type:v.moreOrEqual,method:k(e,t)}),BOOLEAN:{type:v.boolean,method:e=>{const t=[];let s=e;return"true"===e?s=!0:"false"===e&&(s=!1),"boolean"!=typeof s&&t.push(v.boolean),{value:s,isSet:!0,isValid:!t.length,errors:t}}},OBJECT:{type:v.object,method:e=>{const t=[];return"[object Object]"!==Object.prototype.toString.call(e)&&t.push(v.object),{value:e,isSet:!0,isValid:!t.length,errors:t}}},ITEM_LIST:{type:v.itemList,method:e=>{let t=e;const s=[];if(Array.isArray(e))if(e.length){if(e.length>1){const t=typeof e[0];for(let i=e.length-1;i>=0;i--)if(typeof e[i]!==t){s.push(y(v.itemList,["of items of the same type"]));break}}}else s.push(y(v.itemList,["with at least 1 item"]));else s.push(v.itemList),t=[];return{value:t,isSet:!0,isValid:!s.length,errors:s}}},ELEMENT:{type:v.element,method:e=>{const t=[];return e instanceof Element||e instanceof HTMLDocument||t.push(v.element),{value:e,isSet:!0,isValid:!t.length,errors:t}}},FUNC:{type:v.function,method:$},FUNC_WITH_X_ARGUMENTS:e=>{return{type:v.funcOfxArguments,method:(t=e,e=>{const s=$(e);if(!s.isValid)return s;const i=[];return(e=s.value).length!==t&&i.push(y(v.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_AND_MORE_ARGUMENTS:e=>{return{type:v.funcOfxAndMoreArguments,method:(t=e,e=>{const s=$(e);if(!s.isValid)return s;const i=[];return(e=s.value).length<t&&i.push(y(v.funcOfxArguments,[String(t)])),{value:e,isSet:!0,isValid:!i.length,errors:i}})};var t},FUNC_WITH_X_TO_Y_ARGUMENTS:(e,t)=>({type:v.funcOfXToYArguments,method:E(e,t)}),ONE_OF_CAN:e=>({type:v.oneOfCan,method:M(e,!1)}),ONE_OF_MUST:e=>({type:v.oneOfMust,method:M(e,!0)}),OR:e=>{return{type:v.or,method:(t=e,e=>{const s=[];return t.every((t=>!t.method(e).isValid))&&s.push(t.map((e=>e.type)).join(" OR ")),{value:e,isSet:!0,isValid:!s.length,errors:s}})};var t},ENUM:e=>({type:v.enum,method:V(e)})};class O{constructor(e){this.params={},this.contextErrors=[],this.errors=[],this.isValid=!0,this.setContext(e)}setContext(e){e&&"[object Object]"===Object.prototype.toString.call(e)?this.isValidContext=!0:(this.setCommonError("context is not an object"),this.isValidContext=!1),this.context=e}setValidity(){this.errors=Object.keys(this.params).reduce(((e,t)=>[...e,...this.params[t].errors]),[]),this.isValid=!this.errors.length}setCommonError(e){this.contextErrors.push(e),this.errors.push(e),this.isValid=!1}setParam(e,t){t.isValid||(t.errors=t.isSet?t.errors.map((t=>`"${e}" ${t}`)):[`"${e}" must be set`]),this.params[e]=t,this.setValidity()}showErrors(){return this.errors.length?"validation failed: "+this.errors.join(", "):""}}const A=(e,t,s)=>{const{value:i,errors:n}=e,r=t.method(i,s),o=[...n,...r.errors];return{value:r.value,isSet:r.isSet,isValid:!o.length,errors:o}},P=(e,t)=>{const s=void 0===e,i=!t.mandatory&&void 0!==t.defaultValue;return{value:s?i?t.defaultValue:void 0:e,isSet:!s||i,isValid:!s||!t.mandatory,errors:[]}},R=(e,t,s)=>{const i=P(e[t],s);if(i.isSet)for(const t of Object.values(s.validators)){const n=A(i,t,e);if(!n.isValid&&void 0!==s.defaultValue)return{value:s.defaultValue,isSet:!0,isValid:!0,errors:[]};Object.assign(i,n)}else{const t=s.validators.find((e=>e.type===v.oneOfMust));if(t)return A(i,t,e)}return i},C=(e,t)=>{const s=new O(e);return Object.entries(t).forEach((([e,t])=>s.setParam(e,s.isValidContext?R(s.context,e,t):P(void 0,t)))),s},{OBJECT:T,FUNC_WITH_X_AND_MORE_ARGUMENTS:F}=N;var B;!function(e){e.get="get",e.settings="settings",e.devSettings="devSettings"}(B||(B={}));const L={[B.get]:{validators:[F(2)],mandatory:!0},[B.settings]:{validators:[T]},[B.devSettings]:{validators:[T]}},{NUMBER:D,INTEGER:j,INTEGER_UNLIMITED:_,MORE_OR_EQUAL:U,BOOLEAN:W,ELEMENT:q,FUNC:G,OR:H,ENUM:X}=N;var Y,J;!function(e){e.adapter="adapter",e.startIndex="startIndex",e.minIndex="minIndex",e.maxIndex="maxIndex",e.itemSize="itemSize",e.bufferSize="bufferSize",e.padding="padding",e.infinite="infinite",e.horizontal="horizontal",e.windowViewport="windowViewport",e.viewportElement="viewportElement",e.inverse="inverse",e.onBeforeClip="onBeforeClip",e.sizeStrategy="sizeStrategy"}(Y||(Y={})),function(e){e.debug="debug",e.immediateLog="immediateLog",e.logProcessRun="logProcessRun",e.logTime="logTime",e.throttle="throttle",e.initDelay="initDelay",e.initWindowDelay="initWindowDelay",e.cacheData="cacheData",e.cacheOnReload="cacheOnReload",e.dismissOverflowAnchor="dismissOverflowAnchor",e.directionPriority="directionPriority"}(J||(J={}));const Q={[Y.itemSize]:1,[Y.bufferSize]:1,[Y.padding]:.01,[J.throttle]:0,[J.initDelay]:0,[J.initWindowDelay]:0},Z={[Y.adapter]:{validators:[W],defaultValue:!1},[Y.startIndex]:{validators:[j],defaultValue:1},[Y.minIndex]:{validators:[_],defaultValue:-1/0},[Y.maxIndex]:{validators:[_],defaultValue:1/0},[Y.itemSize]:{validators:[j,U(Q[Y.itemSize],!0)],defaultValue:NaN},[Y.bufferSize]:{validators:[j,U(Q[Y.bufferSize],!0)],defaultValue:5},[Y.padding]:{validators:[D,U(Q[Y.padding],!0)],defaultValue:.5},[Y.infinite]:{validators:[W],defaultValue:!1},[Y.horizontal]:{validators:[W],defaultValue:!1},[Y.windowViewport]:{validators:[W],defaultValue:!1},[Y.viewportElement]:{validators:[H([q,G])],defaultValue:null},[Y.inverse]:{validators:[W],defaultValue:!1},[Y.onBeforeClip]:{validators:[G],defaultValue:null},[Y.sizeStrategy]:{validators:[X(w)],defaultValue:w.Average}},K={[J.debug]:{validators:[W],defaultValue:!1},[J.immediateLog]:{validators:[W],defaultValue:!0},[J.logProcessRun]:{validators:[W],defaultValue:!1},[J.logTime]:{validators:[W],defaultValue:!1},[J.throttle]:{validators:[j,U(Q[J.throttle],!0)],defaultValue:40},[J.initDelay]:{validators:[j,U(Q[J.initDelay],!0)],defaultValue:1},[J.initWindowDelay]:{validators:[j,U(Q[J.initWindowDelay],!0)],defaultValue:40},[J.cacheData]:{validators:[W],defaultValue:!1},[J.cacheOnReload]:{validators:[W],defaultValue:!1},[J.dismissOverflowAnchor]:{validators:[W],defaultValue:!0},[J.directionPriority]:{validators:[X(I)],defaultValue:I.backward}};var ee,te,se;!function(e){e.init="init",e.scroll="scroll",e.start="start",e.preFetch="preFetch",e.fetch="fetch",e.postFetch="postFetch",e.render="render",e.preClip="preClip",e.clip="clip",e.adjust="adjust",e.end="end"}(ee||(ee={})),function(e){e.reset="adapter.reset",e.reload="adapter.reload",e.append="adapter.append",e.prepend="adapter.prepend",e.check="adapter.check",e.remove="adapter.remove",e.replace="adapter.replace",e.update="adapter.update",e.clip="adapter.clip",e.insert="adapter.insert",e.fix="adapter.fix"}(te||(te={})),function(e){e.start="start",e.next="next",e.done="done",e.error="error"}(se||(se={}));const{INTEGER:ie,INTEGER_UNLIMITED:ne,BOOLEAN:re,OBJECT:oe,ITEM_LIST:ae,FUNC_WITH_X_ARGUMENTS:le,FUNC_WITH_X_AND_MORE_ARGUMENTS:ce,FUNC_WITH_X_TO_Y_ARGUMENTS:de,ONE_OF_MUST:he,ONE_OF_CAN:ue,OR:fe}=N;var ge;ge||(ge={});const pe={[B.get]:{validators:[ce(2)]},[B.settings]:{validators:[oe]},[B.devSettings]:{validators:[oe]}};var me;!function(e){e.reloadIndex="reloadIndex"}(me||(me={}));const xe={[me.reloadIndex]:{validators:[ie]}};var be;!function(e){e.items="items",e.bof="bof",e.increase="increase"}(be||(be={}));const Ie={[be.items]:{validators:[ae],mandatory:!0},[be.bof]:{validators:[re],defaultValue:!1},[be.increase]:{validators:[re],defaultValue:!1}};var we;!function(e){e.items="items",e.eof="eof",e.decrease="decrease"}(we||(we={}));const ve={[we.items]:{validators:[ae],mandatory:!0},[we.eof]:{validators:[re],defaultValue:!1},[we.decrease]:{validators:[re],defaultValue:!1}};var ye;!function(e){e.predicate="predicate",e.indexes="indexes",e.increase="increase"}(ye||(ye={}));const Se={[ye.predicate]:{validators:[le(1),he([ye.indexes])]},[ye.indexes]:{validators:[ae,he([ye.predicate])]},[ye.increase]:{validators:[re],defaultValue:!1}};var ze;!function(e){e.backwardOnly="backwardOnly",e.forwardOnly="forwardOnly"}(ze||(ze={}));const ke={[ze.backwardOnly]:{validators:[re,ue([ze.forwardOnly])],defaultValue:!1},[ze.forwardOnly]:{validators:[re,ue([ze.backwardOnly])],defaultValue:!1}};var $e;!function(e){e.items="items",e.before="before",e.after="after",e.beforeIndex="beforeIndex",e.afterIndex="afterIndex",e.decrease="decrease"}($e||($e={}));const Ee={[$e.items]:{validators:[ae],mandatory:!0},[$e.before]:{validators:[le(1),he([$e.after,$e.beforeIndex,$e.afterIndex])]},[$e.after]:{validators:[le(1),he([$e.before,$e.beforeIndex,$e.afterIndex])]},[$e.beforeIndex]:{validators:[ie,he([$e.before,$e.after,$e.afterIndex])]},[$e.afterIndex]:{validators:[ie,he([$e.before,$e.after,$e.beforeIndex])]},[$e.decrease]:{validators:[re],defaultValue:!1}};var Me;!function(e){e.items="items",e.predicate="predicate",e.fixRight="fixRight"}(Me||(Me={}));const Ve={[$e.items]:{validators:[ae],mandatory:!0},[Me.predicate]:{validators:[le(1)],mandatory:!0},[Me.fixRight]:{validators:[re],defaultValue:!1}};var Ne;!function(e){e.predicate="predicate",e.fixRight="fixRight"}(Ne||(Ne={}));const Oe={[Ne.predicate]:{validators:[le(1)],mandatory:!0},[Ne.fixRight]:{validators:[re],defaultValue:!1}};var Ae;!function(e){e.scrollPosition="scrollPosition",e.minIndex="minIndex",e.maxIndex="maxIndex",e.updater="updater",e.scrollToItem="scrollToItem",e.scrollToItemOpt="scrollToItemOpt"}(Ae||(Ae={}));const Pe={[Ae.scrollPosition]:{validators:[ne]},[Ae.minIndex]:{validators:[ne]},[Ae.maxIndex]:{validators:[ne]},[Ae.updater]:{validators:[de(1,2)]},[Ae.scrollToItem]:{validators:[le(1)]},[Ae.scrollToItemOpt]:{validators:[fe([re,oe])]}},Re={[te.reset]:B,[te.reload]:me,[te.prepend]:be,[te.append]:we,[te.check]:ge,[te.remove]:ye,[te.clip]:ze,[te.insert]:$e,[te.replace]:Me,[te.update]:Ne,[te.fix]:Ae},Ce={[te.reset]:pe,[te.reload]:xe,[te.prepend]:Ie,[te.append]:ve,[te.check]:{},[te.remove]:Se,[te.clip]:ke,[te.insert]:Ee,[te.replace]:Ve,[te.update]:Oe,[te.fix]:Pe};class Te{constructor(e,t,s){this.parseInput(e,Z),this.parseInput(t,K),this.instanceIndex=s,this.initializeDelay=this.getInitializeDelay(),this.viewport=this.getViewport()}parseInput(e,t){const s=C(e,t);if(!s.isValid)throw new Error("Invalid settings");Object.entries(s.params).forEach((([e,t])=>Object.assign(this,{[e]:t.value})))}getInitializeDelay(){let e=0;return this.windowViewport&&this.initWindowDelay&&!("scrollRestoration"in history)&&(e=this.initWindowDelay),this.initDelay>0&&(e=Math.max(e,this.initDelay)),e}getViewport(){if("function"!=typeof this.viewportElement)return this.viewportElement;const e=this.viewportElement(),t=R({value:e},"value",{validators:[N.ELEMENT]});return t.isValid?t.value:null}}const Fe=e=>{var t;return(t=class{}).process=e,t},Be=e=>{var t;return(t=class extends(Fe(e)){static parseInput(t,s,i=!1,n){const r={data:C(s,Ce[n||e])};return r.data.isValid?r.params=Object.entries(r.data.params).reduce(((e,[t,{value:s}])=>Object.assign(Object.assign({},e),{[t]:s})),{}):(t.logger.log((()=>r.data.showErrors())),i||t.workflow.call({process:e,status:se.error,payload:{error:`Wrong argument of the "${e}" method call`}})),r}}).process=e,t},Le=[ee.init,te.reset,te.reload];class De extends(Fe(ee.init)){static run(e,t){const{state:s,workflow:i}=e,n=Le.includes(t);e.logger.logCycle(!0),s.startWorkflowCycle(n,t),i.call({process:De.process,status:se.next})}}class je extends(Fe(ee.scroll)){static run(e,t){const{workflow:s,viewport:i}=e,n=i.scrollPosition;je.onSynthetic(e,n)||je.onThrottle(e,n,(()=>je.onScroll(e,s)))}static onSynthetic(e,t){const{scroll:s}=e.state,i=s.syntheticPosition;if(null!==i){if(s.syntheticFulfill&&(s.syntheticPosition=null),!s.syntheticFulfill||i===t)return e.logger.log((()=>["skipping scroll",t,`[${s.syntheticFulfill?"":"pre-"}synthetic]`])),!0;e.logger.log((()=>["synthetic scroll has been fulfilled:",t,t<i?"<":">",i]))}return!1}static onThrottle(e,t,s){const{state:{scroll:i},settings:{throttle:n},logger:r}=e;i.current=je.getScrollEvent(t,i.previous);const{direction:o,time:a}=i.current,l=i.previous?a-i.previous.time:1/0,c=n-l,d=isFinite(c)&&c>0,h=!!i.scrollTimer;if(r.log((()=>[o===I.backward?"⤴":"⤵",t,d?l+"ms":"0ms",d?h?"delayed":`/ ${c}ms delay`:""])),!d)return i.scrollTimer&&(clearTimeout(i.scrollTimer),i.scrollTimer=null),void s();h||(i.scrollTimer=setTimeout((()=>{r.log((()=>{const s=je.getScrollEvent(e.viewport.scrollPosition,i.current);return[s.direction===I.backward?"⤴":"⤵",s.position,s.time-a+"ms","triggered by timer set on",t]})),i.scrollTimer=null,s()}),c))}static getScrollEvent(e,t){const s=Number(new Date);let i=I.forward;return t&&(e===t.position?i=t.direction:e<t.position&&(i=I.backward)),{position:e,direction:i,time:s}}static onScroll(e,t){const{state:{scroll:s,cycle:i}}=e;s.previous=Object.assign({},s.current),s.current=null,i.busy.get()?e.logger.log((()=>["skipping scroll",s.previous.position,"[pending]"])):t.call({process:je.process,status:se.next})}}class _e extends(Be(te.reset)){static run(e,t){const{datasource:s,buffer:i,viewport:{paddings:n},state:{cycle:r}}=e;if(t){const{data:i}=_e.parseInput(e,t);if(!i.isValid)return;const n=t instanceof b;Object.keys(B).forEach((e=>{const t=i.params[e],r=s;(t.isSet||n&&r[e])&&(r[e]=t.value)}))}i.reset(!0),n.backward.reset(),n.forward.reset();const o={datasource:s};r.busy.get()&&(o.finalize=!0,r.interrupter=_e.process),e.workflow.call({process:_e.process,status:se.next,payload:o})}}class Ue extends(Be(te.reload)){static run(e,t){const{viewport:s,state:i,buffer:n}=e,{params:r}=Ue.parseInput(e,{reloadIndex:t},!0);n.reset(!1,r?r.reloadIndex:void 0),s.reset(n.startIndex);const o={};i.cycle.busy.get()&&(i.scroll.stop(),o.finalize=!0,i.cycle.interrupter=Ue.process),e.workflow.call({process:Ue.process,status:se.next,payload:o})}}class We{constructor(e,t,s){this.container={$index:e,data:t},this.nodeId=String(e),this.routines=s,this.invisible=!0,this.toRemove=!1,this.toInsert=!1}get $index(){return this.container.$index}set $index(e){this.container.$index=e}get data(){return this.container.data}set data(e){this.container.data=e}get element(){return this.container.element}set element(e){this.container.element=e}dispose(){delete this.container.element}setSize(e=0){this.preSize=e,this.element&&(this.size=this.routines.getSize(this.element))}makeVisible(){this.routines.makeElementVisible(this.element),this.invisible=!1}hide(){this.element&&this.routines.hideElement(this.element)}scrollTo(e){this.element&&this.routines.scrollTo(this.element,e)}updateIndex(e){this.$index=e,this.nodeId=String(e)}get(){return this.container}}class qe extends(Be(te.update)){static run(e,t){const{params:s}=qe.parseInput(e,t);if(!s)return;const i=qe.doUpdate(e,s);e.workflow.call({process:qe.process,status:i?se.next:se.done})}static doUpdate(e,t){const{buffer:s,viewport:i,state:{fetch:n},routines:r,logger:o}=e;if(!s.items)return o.log((()=>"no items in Buffer")),!1;const{item:a,index:l,diff:c}=i.getEdgeVisibleItem(s.items,I.backward),{trackedIndex:d,toRemove:h}=s.updateItems(t.predicate,((e,t)=>new We(e,t,r)),l,!!t.fixRight);let u=0;const f=s.get(d);a&&a===f&&(u=-s.getSizeByIndex(d)+c),h.forEach((e=>e.hide())),o.log((()=>h.length?"items to remove: ["+h.map((({$index:e})=>e)).join(",")+"]":"no items to remove")),h.length&&s.checkDefaultSize();const g=s.items.filter((({toInsert:e})=>e));return o.log((()=>g.length?"items to render: ["+g.map((({$index:e})=>e)).join(",")+"]":"no items to render")),n.update(d,u,g,h),!!h.length||!!g.length}}class Ge extends(Be(te.insert)){static run(e,t){const{params:s}=Ge.parseInput(e,t);if(!s)return;const i=Ge.doInsert(e,s);e.workflow.call({process:Ge.process,status:i?se.next:se.done})}static doInsert(e,t){return!!(Ge.insertEmpty(e,t)||Ge.insertInBuffer(e,t)||Ge.insertVirtually(e,t))}static insertEmpty(e,t){const{buffer:s,routines:i,state:{fetch:n}}=e;if(s.size)return!1;const{beforeIndex:r,afterIndex:o,items:a,decrease:l}=t;return!!s.fillEmpty(a,r,o,!!l,((e,t)=>new We(e,t,i)))&&(n.fill(s.items,s.startIndex),!0)}static insertInBuffer(e,t){const{before:s,after:i,beforeIndex:n,afterIndex:r,items:o,decrease:a}=t,l=e.buffer.getIndexToInsert(s||i,n,r);if(isNaN(l))return!1;const c=Number.isInteger(n)||s,d={predicate:({$index:e,data:t})=>l!==e||(c?[...o,t]:[t,...o]),fixRight:a};return qe.doUpdate(e,d)}static insertVirtually(e,t){const{beforeIndex:s,afterIndex:i,items:n,decrease:r}=t,{buffer:o,state:{fetch:a},viewport:l}=e,c=Number.isInteger(s)?I.backward:I.forward,d=c===I.backward?s:i;if(!o.insertVirtually(n,d,c,!!r))return!1;const{index:h,diff:u}=l.getEdgeVisibleItem(o.items,I.backward);return a.firstVisible.index=h,isNaN(h)||(a.simulate=!0,a.firstVisible.delta=-o.getSizeByIndex(h)+u),!0}}class He extends(Be(te.append)){static run(e,{process:t,options:s}){const{params:i}=He.parseInput(e,s,!1,t);if(!i)return;const n=He.doAppend(e,t,i);e.workflow.call({process:He.process,status:n?se.next:se.done})}static doAppend(e,t,s){const{bof:i,eof:n,increase:r,decrease:o}=s,{buffer:a}=e,l=t===te.prepend,c=l?!r:o;let d,h,u=s.items;return l?(d=(i?a.absMinIndex:a.minIndex)+(a.size?0:1),u=[...u].reverse()):h=(n?a.absMaxIndex:a.maxIndex)-(a.size||c?0:1),Ge.doInsert(e,{items:u,beforeIndex:d,afterIndex:h,decrease:c})}}class Xe extends(Be(te.check)){static run(e){const{workflow:t,buffer:s,state:{fetch:i},viewport:n}=e;let r=1/0,o=-1/0;if(s.items.forEach((e=>{const t=e.size;e.setSize(),e.size!==t&&(s.cacheItem(e),r=Math.min(r,e.$index),o=Math.max(o,e.$index))})),Number.isFinite(r)){i.first.indexBuffer=s.firstIndex,i.last.indexBuffer=s.lastIndex;const{index:e,diff:t}=n.getEdgeVisibleItem(s.items,I.backward);i.firstVisible.index=e,isNaN(e)||(i.firstVisible.delta=-s.getSizeByIndex(e)+t),i.check(s.items.filter((e=>e.$index>=r&&e.$index<=o)))}e.logger.stat("check"),t.call({process:Xe.process,status:Number.isFinite(r)?se.next:se.done})}}class Ye extends(Be(te.remove)){static run(e,t){const{params:s}=Ye.parseInput(e,t);if(!s)return;const i=Ye.doRemove(e,s);e.workflow.call({process:Ye.process,status:i?se.next:se.done})}static doRemove(e,t){const{fetch:s}=e.state;s.firstVisible.index=NaN;const i=Ye.removeBufferedItems(e,t),n=i.length>0;if(n&&(t.indexes&&t.indexes.length&&(t.indexes=t.indexes.filter((e=>!i.includes(e)))),t.indexes&&t.indexes.length)){const e=(t.increase?1:0)*i.length,s=(t.increase?0:-1)*i.length;t.indexes=t.indexes.map((t=>t+(t<i[0]?e:s)))}const r=Ye.removeVirtualItems(e,t);return!(!n&&!r)&&(e.logger.stat("after remove"),!0)}static removeBufferedItems(e,t){const{predicate:s,indexes:i,increase:n}=t;if(!s&&!i)return[];const r=e=>s&&s(e)||!!i&&i.includes(e.$index),o=e.buffer.items.reduce(((e,t)=>r(t)?[...e,t.$index]:e),[]),a={predicate:e=>!r(e),fixRight:n};return qe.doUpdate(e,a),o}static removeVirtualItems(e,t){const{indexes:s,increase:i}=t;if(!s||!s.length)return!1;const{buffer:n,viewport:r,state:{fetch:o}}=e,{finiteAbsMinIndex:a,firstIndex:l,finiteAbsMaxIndex:c,lastIndex:d}=n,h=[];for(let e=0,t=s.length;e<t;e++){const t=s[e];if(t>=a&&!isNaN(l)&&t<l)h.push(t);else{if(!(t<=c&&!isNaN(d)&&t>d))continue;h.push(t)}}if(!h.length)return!1;if(isNaN(o.firstVisible.index)){const{index:e,diff:t}=r.getEdgeVisibleItem(n.items,I.backward);o.firstVisible.index=e,isNaN(e)||(o.firstVisible.delta=-n.getSizeByIndex(e)+t)}return e.logger.log((()=>`going to remove ${h.length} item(s) virtually`)),n.removeVirtually(h,!!i),n.checkDefaultSize(),Ye.shiftFirstVisibleIndex(e,h,!!i),!0}static shiftFirstVisibleIndex(e,t,s){const{firstVisible:i}=e.state.fetch;if(isNaN(i.index))return;const n=t.reduce(((e,t)=>e+(s&&t>i.index||!s&&t<i.index?1:0)),0);i.index=i.index+(s?n:-n)}}class Je extends(Be(te.clip)){static run(e,t){const{params:s}=Je.parseInput(e,t);e.state.clip.forceForward=!(s&&s.backwardOnly),e.state.clip.forceBackward=!(s&&s.forwardOnly),e.workflow.call({process:Je.process,status:se.next})}}class Qe extends(Be(te.replace)){static run(e,t){const{params:s}=Qe.parseInput(e,t);if(!s)return;const i=Qe.doReplace(e,s);e.workflow.call({process:Qe.process,status:i?se.next:se.done})}static doReplace(e,t){const s=e.buffer.items.filter((e=>t.predicate(e))).map((e=>e.$index));if(!s.length)return e.logger.log("no items to be replaced"),!1;let i=!1;const n={predicate:({$index:e})=>!s.includes(e)||!i&&(i=!0,t.items),fixRight:t.fixRight};return qe.doUpdate(e,n)}}const{[te.fix]:Ze}=Re;class Ke extends(Be(te.fix)){static run(e,t){const{workflow:s}=e,{data:i,params:n}=Ke.parseInput(e,t);n&&(Object.entries(i.params).forEach((([t,s])=>{s.isSet&&s.isValid&&Ke.runByType(e,t,s.value,i)})),s.call({process:Ke.process,status:se.done}))}static runByType(e,t,s,i){switch(t){case Ze.scrollPosition:return Ke.setScrollPosition(e,s);case Ze.minIndex:return Ke.setMinIndex(e,s);case Ze.maxIndex:return Ke.setMaxIndex(e,s);case Ze.updater:return Ke.updateItems(e,s);case Ze.scrollToItem:if(i.params){const t=i.params[Ze.scrollToItemOpt],n=t?t.value:void 0;return Ke.scrollToItem(e,s,n)}return;case Ze.scrollToItemOpt:return}}static setScrollPosition({viewport:e},t){let s=t;t===-1/0?s=0:t===1/0&&(s=e.getScrollableSize()),e.setPosition(s)}static setMinIndex({buffer:e,settings:t},s){t.minIndex=s,e.absMinIndex=s}static setMaxIndex({buffer:e,settings:t},s){t.maxIndex=s,e.absMaxIndex=s}static updateItems({buffer:e,logger:t},s){let i=!1;const n=()=>i=!0;e.items.forEach((e=>s(e.get(),n))),i&&(t.log((()=>"update Buffer.items reference")),e.items=[...e.items])}static scrollToItem(e,t,s){const i=e.buffer.items.find((e=>t(e.get())));i?i.scrollTo(s):e.logger.log((()=>"scrollToItem cancelled, item not found"))}}class et extends(Fe(ee.start)){static run(e){const t=e.state.startInnerLoop();e.workflow.call({process:et.process,status:se.next,payload:t})}}class tt extends(Fe(ee.preFetch)){static run(e){const{workflow:t,buffer:s,state:{fetch:i,cycle:n}}=e;i.minIndex=s.minIndex,tt.setPositionsAndIndexes(e),tt.skipBufferedItems(e),e.settings.infinite&&tt.checkBufferGaps(e),tt.checkFetchPackSize(e),tt.setFetchDirection(e),t.call({process:tt.process,status:tt.getStatus(e),payload:{process:n.initiator}})}static setPositionsAndIndexes(e){tt.setPositions(e),tt.setFirstIndex(e),tt.setLastIndex(e),e.logger.fetch()}static setPositions(e){const{state:{fetch:{positions:t}},viewport:s}=e,i=s.getBufferPadding();t.before=s.scrollPosition,t.startDelta=tt.getStartDelta(e),t.relative=t.before-t.startDelta,t.start=t.relative-i,t.end=t.relative+s.getSize()+i}static getStartDelta(e){const{buffer:t,viewport:{offset:s}}=e;let i=0;if(s&&(i+=s),!t.defaultSize)return i;for(let e=t.finiteAbsMinIndex;e<t.startIndex;e++)i+=t.getSizeByIndex(e);return e.logger.log((()=>[`start delta is ${i}`,...s?[` (+${s} offset)`]:[]])),i}static setFirstIndex(e){const{state:t,buffer:s}=e,{positions:{start:i},first:n}=t.fetch;let r=s.startIndex,o=0;if(t.cycle.innerLoop.isInitial)e.logger.log("skipping fetch backward direction [initial loop]");else if(s.defaultSize){let e=o,t=r;for(;;){if(i>=0){const n=s.getSizeByIndex(t);if(e+n-i>0){r=t,o=e;break}if(e+=n,t++,t<s.absMinIndex)break}if(i<0){if(t--,t<s.absMinIndex)break;e-=s.getSizeByIndex(t);if(r=t,o=e,e-i<=0)break}}}else e.logger.log("skipping fetch backward direction [no item size]");n.index=n.indexBuffer=Math.max(r,s.absMinIndex),n.position=o}static setLastIndex(e){const{state:{fetch:t,cycle:s},buffer:i,settings:n}=e,{firstVisible:r,positions:{relative:o,end:a},first:l,last:c}=t;let d;if(i.defaultSize){let e=l.indexBuffer,t=l.position;for(d=e;;){d=e;const n=i.getSizeByIndex(e);if(t+=n,isNaN(r.index)&&t>o&&(r.index=e,s.innerLoop.isInitial||(r.delta=t-n-o)),t>=a)break;if(e++>i.absMaxIndex)break}}else d=i.startIndex+n.bufferSize-1,e.logger.log("forcing fetch forward direction [no item size]");c.index=c.indexBuffer=Math.min(d,i.absMaxIndex)}static skipBufferedItems(e){const{buffer:t}=e;if(!t.size)return;const{fetch:s}=e.state,i=s.first.index,n=s.last.index,r=[[]];let o=0;for(let e=i;e<=n;e++)t.get(e)?r[o].length&&(r[++o]=[]):r[o].push(e);let a=r[0];r[0].length&&r[1]&&r[1].length&&(s.hasAnotherPack=!0,r[1].length>=r[0].length&&(a=r[1])),s.first.index=Math.max(a[0],t.absMinIndex),s.last.index=Math.min(a[a.length-1],t.absMaxIndex),s.first.index===i&&s.last.index===n||e.logger.fetch("after Buffer flushing")}static checkBufferGaps(e){const{buffer:t,state:{fetch:s}}=e;if(!t.size)return;const i=s.first.index,n=t.lastIndex;i>n&&(s.first.index=s.first.indexBuffer=n+1);const r=t.firstIndex,o=s.last.index;o<r&&(s.last.index=s.last.indexBuffer=r-1),s.first.index===i&&s.last.index===o||e.logger.fetch("after Buffer filling (no clip case)")}static checkFetchPackSize(e){const{buffer:t,state:{fetch:s}}=e;if(!s.shouldFetch)return;const i=s.first.index,n=s.last.index,r=e.settings.bufferSize-(n-i+1);if(!(r<=0)){if(!t.size||n>t.items[0].$index){const e=Math.min(n+r,t.absMaxIndex);e>n&&(s.last.index=s.last.indexBuffer=e)}else{const e=Math.max(i-r,t.absMinIndex);e<i&&(s.first.index=s.first.indexBuffer=e)}s.first.index===i&&s.last.index===n||(e.logger.fetch("after bufferSize adjustment"),tt.skipBufferedItems(e))}}static setFetchDirection(e){const{buffer:t,state:{fetch:s}}=e;if(s.last.index){let i=I.forward;t.size&&(i=s.last.index<t.items[0].$index?I.backward:I.forward),s.direction=i,e.logger.log((()=>`fetch direction is "${i}"`))}}static getStatus(e){const{cycle:t,fetch:s}=e.state;return t.initiator===te.clip?(e.logger.log((()=>`going to skip fetch due to "${te.clip}" process`)),se.next):s.shouldFetch?(e.logger.log((()=>`going to fetch ${s.count} items started from index ${s.index}`)),se.next):se.done}}class st extends(Fe(ee.fetch)){static run(e){const{workflow:t}=e,s={success:s=>{e.logger.log((()=>`resolved ${s.length} items (index = ${e.state.fetch.index}, count = ${e.state.fetch.count})`)),e.state.fetch.newItemsData=s,t.call({process:st.process,status:se.next})},fail:e=>t.call({process:st.process,status:se.error,payload:{error:e}})},i=st.get(e);st.complete(e,s,i)}static complete(e,t,s){if(Object.prototype.hasOwnProperty.call(s,"data")){const{data:e,error:i,isError:n}=s;n?t.fail(i):t.success(e||[])}else{const{state:{scroll:i,fetch:n},viewport:r}=e;null===i.positionBeforeAsync&&(i.positionBeforeAsync=r.scrollPosition),n.cancel=()=>{t.success=()=>null,t.fail=()=>null},s.then((e=>t.success(e)),(e=>t.fail(e)))}}static get(e){const t=e.datasource.get,{index:s,count:i}=e.state.fetch;let n,r,o,a;const l=e=>{o?o(e):n=e||null},c=e=>{a?a(e):r=e||null},d=t(s,i,l,c);if(d&&"object"==typeof d&&null!==d){if("function"==typeof d.then)return d;if("function"==typeof d.subscribe){const e=d.subscribe(l,c,(()=>{e&&"object"==typeof e&&"function"==typeof e.unsubscribe&&e.unsubscribe()}))}}return n||r?{data:r?null:n||[],error:r,isError:!!r}:new Promise(((e,t)=>{o=e,a=t}))}}class it extends(Fe(ee.postFetch)){static run(e){const{workflow:t}=e;it.setItems(e)?(it.setBufferLimits(e),t.call({process:it.process,status:e.state.fetch.hasNewItems?se.next:se.done})):t.call({process:it.process,status:se.error,payload:{error:"Can't set buffer items"}})}static setBufferLimits(e){const{buffer:t,state:{fetch:s,cycle:{innerLoop:i}}}=e,{items:n,first:{index:r},last:{index:o}}=s;if(n.length){const e=n.length-1;r<n[0].$index&&(t.absMinIndex=n[0].$index),o>n[e].$index&&(t.absMaxIndex=n[e].$index)}else(o<t.minIndex||i.isInitial)&&(t.absMinIndex=t.minIndex),(r>t.maxIndex||i.isInitial)&&(t.absMaxIndex=t.maxIndex)}static setItems(e){const{buffer:t,state:{fetch:s,cycle:i}}=e,n=s.newItemsData;if(!n||!n.length)return!0;let r=s.index;return n.length<s.count&&(i.innerLoop.isInitial?r=t.startIndex:s.first.index<t.minIndex&&(r=t.minIndex-n.length)),s.items=n.map(((t,s)=>new We(r+s,t,e.routines))),t.setItems(s.items)}}class nt extends(Fe(ee.render)){static run(e){const{workflow:t,state:{cycle:s,render:i,scroll:n},viewport:r,routines:o}=e;e.logger.stat("before new items render"),null===n.positionBeforeAsync&&(n.positionBeforeAsync=r.scrollPosition),i.cancel=o.render((()=>{i.cancel=null,nt.doRender(e)?t.call({process:nt.process,status:i.noSize?se.done:se.next,payload:{process:s.initiator}}):t.call({process:nt.process,status:se.error,payload:{error:"Can't associate item with element"}})}))}static doRender(e){const{state:{fetch:t,render:s},viewport:i,buffer:n,logger:r}=e;return s.positionBefore=i.scrollPosition,!(!t.isCheck&&(s.sizeBefore=i.getScrollableSize(),!t.items.every((t=>nt.processElement(e,t)))))&&(n.checkDefaultSize(),s.sizeAfter=i.getScrollableSize(),r.stat("after new items render"),r.log((()=>s.noSize?"viewport size has not been changed":void 0)),!0)}static processElement(e,t){const{viewport:s,buffer:i}=e,n=s.findItemElementById(t.nodeId);return!!n&&(t.element=n,t.makeVisible(),t.setSize(i.getSizeByIndex(t.$index)),i.cacheItem(t),!0)}}const rt=({call:e})=>!!e.interrupted;class ot extends(Fe(ee.end)){static run(e,{error:t}={}){const{workflow:s,state:{cycle:{interrupter:i}}}=e;if(t||i||ot.calculateParams(e,s),rt(s))return void s.call({process:ot.process,status:se.done});const n=ot.shouldContinueRun(e,t);e.state.endInnerLoop(),s.call({process:ot.process,status:n?se.next:se.done,payload:Object.assign({},i?{process:i}:{})})}static calculateParams(e,t){const{adapter:s,viewport:i,buffer:{items:n}}=e;if(s.wanted.firstVisible){const{item:e}=i.getEdgeVisibleItem(n,I.backward);e&&e.element===s.firstVisible.element||(s.firstVisible=e?e.get():d)}if(s.wanted.lastVisible&&!rt(t)){const{item:e}=i.getEdgeVisibleItem(n,I.forward);e&&e.element===s.lastVisible.element||(s.lastVisible=e?e.get():d)}}static shouldContinueRun(e,t){const{cycle:s,fetch:i,render:n}=e.state;return!!s.interrupter||!t&&(!(!i.simulate||!i.isCheck||n.noSize)||(!(!i.simulate||!i.doRemove)||!(i.simulate||!(i.hasNewItems&&!n.noSize||i.hasAnotherPack))))}}class at extends(Fe(ee.adjust)){static run(e){const{workflow:t,viewport:s,state:{scroll:i}}=e;i.positionBeforeAdjust=s.scrollPosition,at.setPaddings(e),i.positionAfterAdjust=s.scrollPosition;const n=at.calculatePosition(e);at.setAdditionalForwardPadding(e,n),at.setPosition(e,n,(()=>t.call({process:at.process,status:se.done})))}static setPaddings(e){const{viewport:t,buffer:s,settings:{inverse:i},state:{fetch:n}}=e,r=s.getFirstVisibleItem(),o=s.getLastVisibleItem();let a,l;r&&o?(a=r.$index,l=o.$index):(a=isNaN(n.firstVisible.index)?s.startIndex:n.firstVisible.index,l=a-1);const{forward:c,backward:d}=t.paddings;let h,u=0,f=0;for(h=s.finiteAbsMinIndex;h<a;h++)u+=s.getSizeByIndex(h);for(h=l+1;h<=s.finiteAbsMaxIndex;h++)f+=s.getSizeByIndex(h);const g=u+(t.getScrollableSize()-c.size-d.size)+f,p=t.getSize()-g;p>0&&(i?u+=p:f+=p,e.logger.log((()=>i?"backward":`forward padding will be increased by ${p} to fill the viewport`))),d.size=u,c.size=f,e.logger.stat("after paddings adjustments")}static calculatePosition(e){const{viewport:t,buffer:s,state:{fetch:i,render:n,scroll:r}}=e;let o=t.paddings.backward.size;if(!isNaN(i.firstVisible.index)&&!isNaN(s.firstIndex)){e.logger.log(`first index = ${i.firstVisible.index}, delta = ${i.firstVisible.delta}`);const t=i.shouldCheckPreSizeExpectation(s.lastIndex);s.items.forEach((e=>{e.$index<i.firstVisible.index?o+=e.size:(e.$index===i.firstVisible.index&&i.firstVisible.delta&&(o-=i.firstVisible.delta),t&&e.preSize&&i.items.includes(e)&&(o+=e.size-e.preSize))}))}if(null!==r.positionBeforeAsync){const t=n.positionBefore-r.positionBeforeAsync;0!==t&&(e.logger.log(`shift position due to fetch-render difference (${t})`),o+=t)}return t.offset>0&&(o||i.positions.before)&&(o+=t.offset),Math.round(o)}static setAdditionalForwardPadding(e,t){const{viewport:s,buffer:i,state:{cycle:n}}=e;if(!n.isInitial||!ot.shouldContinueRun(e,null))return;const r=t-s.getMaxScrollPosition();if(r<=0)return;const o=i.getLastVisibleItem();if(!o)return;let a=0,l=o.$index+1;for(;a<=r&&l<=i.absMaxIndex;)a+=i.getSizeByIndex(l++);const c=Math.min(a,r);c&&(s.paddings.forward.size+=c,e.logger.log(`increase fwd padding due to lack of items (${r} -> ${c})`))}static setPosition(e,t,s){const{state:{scroll:i},viewport:n,routines:r}=e;if(!i.hasPositionChanged(t))return s();i.syntheticPosition=t,i.syntheticFulfill=!1,i.cancelAnimation=r.animate((()=>{i.cancelAnimation=null;const r=i.positionAfterAdjust-n.scrollPosition;let o="";r>0&&(t-=r,i.syntheticPosition=t,o=` (-${r})`),i.syntheticFulfill=!0,n.scrollPosition=t,e.logger.stat("after scroll adjustment"+o),s()}))}}class lt extends(Fe(ee.preClip)){static run(e){lt.prepareClip(e),e.workflow.call({process:lt.process,status:se.next,payload:{doClip:e.state.clip.doClip}})}static prepareClip(e){const{state:{fetch:t,clip:s}}=e;if(lt.shouldNotClip(e))return;const i=t.first.indexBuffer,n=t.last.indexBuffer;e.logger.log((()=>`looking for ${t.direction?"anti-"+t.direction+" ":""}items that are out of [${i}..${n}] range`)),lt.isBackward(e,i)&<.prepareClipByDirection(e,I.backward,i),lt.isForward(e,n)&<.prepareClipByDirection(e,I.forward,n),s.doClip||e.logger.log("skipping clip [no items to clip]")}static shouldNotClip(e){const{settings:t,buffer:s,state:i}=e;return t.infinite&&!i.clip.force?(e.logger.log("skipping clip [infinite mode]"),!0):s.size?!!i.cycle.isInitial&&(e.logger.log("skipping clip [initial cycle]"),!0):(e.logger.log("skipping clip [empty buffer]"),!0)}static isBackward(e,t){const{buffer:s,state:{clip:i,fetch:n}}=e;return i.force?i.forceBackward:n.direction!==I.backward&&t-1>=s.absMinIndex}static isForward(e,t){const{buffer:s,state:{clip:i,fetch:n}}=e;return i.force?i.forceForward:n.direction!==I.forward&&t+1<=s.absMaxIndex}static prepareClipByDirection(e,t,s){const i=t===I.forward;e.buffer.items.forEach((n=>{(!i&&n.$index<s||i&&n.$index>s)&&(n.toRemove=!0,n.removeDirection=t,e.state.clip.doClip=!0)}))}}class ct extends(Fe(ee.clip)){static run(e){const{workflow:t}=e;ct.doClip(e),t.call({process:ct.process,status:se.next})}static doClip(e){const{buffer:t,viewport:{paddings:s},state:{clip:i},logger:n}=e,r={[I.backward]:0,[I.forward]:0};n.stat(`before clip (${++i.callCount})`);const o=t.items.filter((e=>!!e.toRemove&&(e.hide(),r[e.removeDirection]+=e.size,!0)));o.length&&(r[I.backward]&&(s.byDirection(I.backward).size+=r[I.backward]),r[I.forward]&&(s.byDirection(I.forward).size+=r[I.forward]),e.settings.onBeforeClip&&e.settings.onBeforeClip(o.map((e=>e.get())))),t.clip(),n.log((()=>{const e=o.map((({$index:e})=>e));return e.length?[`clipped ${e.length} item(s) from Buffer`+(r.backward?`, +${r.backward} fwd px`:"")+(r.forward?`, +${r.forward} bwd px`:"")+`, range: [${e[0]}..${e[e.length-1]}]`]:"clipped 0 items from Buffer"})),n.stat("after clip")}}class dt{constructor(e,t,s){this.logs=[],this.logAdapterMethod=(e,t,s)=>{if(!this.debug)return;const i=(void 0===t?[]:Array.isArray(t)?t:[t]).map((e=>"function"==typeof e?"func":"object"==typeof e&&e?Array.isArray(e)?`[of ${e.length}]`:"{ "+Object.keys(e).join(", ")+" }":e)).join(", ");this.log(`adapter: ${e}(${i||""})${s||""}`)};const{settings:i}=e;this.debug=i.debug,this.immediateLog=i.immediateLog,this.logTime=i.logTime,this.getTime=()=>e.state&&` // time: ${e.state.time}`,this.getStat=()=>{const{buffer:t,viewport:s}=e,i=t.getFirstVisibleItem(),n=t.getLastVisibleItem();return"pos: "+s.scrollPosition+", size: "+s.getScrollableSize()+", bwd_p: "+s.paddings.backward.size+", fwd_p: "+s.paddings.forward.size+", default: "+(t.defaultSize||"no")+", items: "+t.getVisibleItemsCount()+", range: "+(i&&n?`[${i.$index}..${n.$index}]`:"no")},this.getFetchRange=()=>{const{first:{index:t},last:{index:s}}=e.state.fetch;return Number.isNaN(t)||Number.isNaN(s)?"no":`[${t}..${s}]`},this.getLoopId=()=>e.state.cycle.loopId,this.getLoopIdNext=()=>e.state.cycle.loopIdNext,this.getWorkflowCycleData=()=>`${i.instanceIndex}-${e.state.cycle.count}`,this.getScrollPosition=()=>e.routines.getScrollPosition(),this.log((()=>`vscroll Workflow has been started, core: ${t.core.name} v${t.core.version}, consumer: ${t.consumer.name} v${t.consumer.version}, scroller instance: ${i.instanceIndex}, adapter `+(s?`instance: ${s.id}`:"is not instantiated")))}object(e,t,s){this.log((()=>[e,s?JSON.stringify(t,((e,t)=>Number.isNaN(t)?"NaN":t===1/0?"Infinity":t===-1/0?"-Infinity":t instanceof Element?"HTMLElement":t instanceof HTMLDocument?"HTMLDocument":"function"==typeof t?"Function":t)).replace(/"/g,"").replace(/(\{|:|,)/g,"$1 ").replace(/(\})/g," $1"):t]))}stat(e){if(this.debug){const t=["color: #888; border: dashed #888 0; border-bottom-width: 0px","color: #000; border-width: 0"];this.log((()=>["%cstat"+(e?` ${e}`:"")+",%c "+this.getStat(),...t]))}}fetch(e){if(this.debug){const t="fetch interval"+(e?` ${e}`:""),s=["color: #888","color: #000"];this.log((()=>[`%c${t}: %c${this.getFetchRange()}`,...s]))}}prepareForLog(e){return e instanceof Event&&e.target?this.getScrollPosition():e}logProcess(e){if(!this.debug)return;const{process:t,status:s,payload:i}=e,n=[];if(t===ee.init&&s===se.next)n.push(`%c---=== loop ${this.getLoopIdNext()} start`);else if(t===ee.end){n.push(`%c---=== loop ${this.getLoopId()} done`);const e=i&&i.process;s===se.next&&e!==te.reset&&e!==te.reload&&(n[0]+=`, loop ${this.getLoopIdNext()} start`)}n.length&&this.log((()=>[...n,"color: #006600;"]))}logCycle(e=!0){const t=this.getWorkflowCycleData(),s=`color: #0000aa; border: solid #555 1px; border-width: ${e?"1px 0 0 1px":"0 0 1px 1px"}; margin-left: -2px`;this.log((()=>[`%c ~~~ WF Cycle ${t} ${e?"STARTED":"FINALIZED"} ~~~ `,s]))}logError(e){if(this.debug){const t=["color: #a00;","color: #000"];this.log((()=>["error:%c"+(e?` ${e}`:"")+`%c (loop ${this.getLoopIdNext()})`,...t]))}}log(...e){if(this.debug){if("function"==typeof e[0]&&(e=e[0](),Array.isArray(e)||(e=[e])),e.every((e=>void 0===e)))return;this.logTime&&(e=[...e,this.getTime()]),e=e.map((e=>this.prepareForLog(e))),this.immediateLog?console.log.apply(this,e):this.logs.push(e)}}logForce(...e){this.debug&&(!this.immediateLog&&this.logs.length&&(this.logs.forEach((e=>console.log.apply(this,e))),this.logs=[]),e.length&&console.log.apply(this,e))}}class ht{constructor(e,t){this.settings={viewport:t.viewport,horizontal:t.horizontal,window:t.windowViewport},this.element=e,this.viewport=this.getViewportElement(),this.onInit(t)}checkElement(e){if(!e)throw new Error("HTML element is not defined")}getViewportElement(){if(this.settings.window)return document.documentElement;if(this.settings.viewport)return this.settings.viewport;this.checkElement(this.element);const e=this.element.parentElement;return this.checkElement(e),e}onInit(e){e.windowViewport&&"scrollRestoration"in history&&(history.scrollRestoration="manual"),e.dismissOverflowAnchor&&(this.viewport.style.overflowAnchor="none")}findElementBySelector(e,t){return this.checkElement(e),e.querySelector(t)}findPaddingElement(e){return this.findElementBySelector(this.element,`[data-padding-${e}]`)}findItemElement(e){return this.findElementBySelector(this.element,`[data-sid="${e}"]`)}getScrollPosition(){return this.settings.window?this.settings.horizontal?window.pageXOffset:window.pageYOffset:this.viewport[this.settings.horizontal?"scrollLeft":"scrollTop"]}setScrollPosition(e){e=Math.max(0,e),this.settings.window?this.settings.horizontal?window.scrollTo(e,window.scrollY):window.scrollTo(window.scrollX,e):this.viewport[this.settings.horizontal?"scrollLeft":"scrollTop"]=e}getElementParams(e){return this.checkElement(e),e.getBoundingClientRect()}getWindowParams(){const{clientWidth:e,clientHeight:t,clientLeft:s,clientTop:i}=this.viewport;return{height:t,width:e,top:i,bottom:i+t,left:s,right:s+e,x:s,y:i,toJSON:()=>null}}getSize(e){return this.getElementParams(e)[this.settings.horizontal?"width":"height"]}getScrollerSize(){return this.getElementParams(this.element)[this.settings.horizontal?"width":"height"]}getViewportSize(){return this.settings.window?this.getWindowParams()[this.settings.horizontal?"width":"height"]:this.getSize(this.viewport)}getSizeStyle(e){this.checkElement(e);const t=e.style[this.settings.horizontal?"width":"height"];return parseFloat(t)||0}setSizeStyle(e,t){this.checkElement(e),t=Math.max(0,Math.round(t)),e.style[this.settings.horizontal?"width":"height"]=`${t}px`}getEdge(e,t){const{horizontal:s}=this.settings;return this.getElementParams(e)[t===I.forward?s?"right":"bottom":s?"left":"top"]}getViewportEdge(e){const{window:t,horizontal:s}=this.settings;if(t){return this.getWindowParams()[e===I.forward?s?"right":"bottom":s?"left":"top"]}return this.getEdge(this.viewport,e)}makeElementVisible(e){this.checkElement(e),e.style.left="",e.style.top="",e.style.position=""}hideElement(e){this.checkElement(e),e.style.display="none"}getOffset(){const e=e=>(this.settings.horizontal?e.offsetLeft:e.offsetTop)||0;return e(this.element)-(this.settings.window?0:e(this.viewport))}scrollTo(e,t){this.checkElement(e),e.scrollIntoView(t)}render(e){const t=setTimeout((()=>e()));return()=>clearTimeout(t)}animate(e){const t=requestAnimationFrame((()=>e()));return()=>cancelAnimationFrame(t)}onScroll(e){const t=this.settings.window?window:this.viewport;return t.addEventListener("scroll",e),()=>t.removeEventListener("scroll",e)}}class ut{constructor(e,t){const s=t.findPaddingElement(e);t.checkElement(s),this.element=s,this.direction=e,this.routines=t}reset(e){this.size=e||0}get size(){return this.routines.getSizeStyle(this.element)}set size(e){this.routines.setSizeStyle(this.element,e)}}class ft{constructor(e,t){this.settings=t,this.forward=new ut(I.forward,e),this.backward=new ut(I.backward,e)}byDirection(e,t){return e===I.backward?t?this.forward:this.backward:t?this.backward:this.forward}reset(e,t,s){const i=this.getPositiveSize(t,e,s),n=this.getNegativeSize(t);if(this.settings.inverse){this.forward.reset(n),this.backward.reset(i);const t=e-this.backward.size-s;t>0&&(this.backward.size+=t,this.forward.size-=t)}else{this.forward.reset(i),this.backward.reset(n);const t=e-this.forward.size-s;t>0&&(this.backward.size-=t,this.forward.size+=t)}}getPositiveSize(e,t,s){const{settings:i}=this;let n=t;return isFinite(i.maxIndex)&&(n=(i.maxIndex-e+1)*i.itemSize),s&&(n=Math.max(n-s,0)),n}getNegativeSize(e){const{settings:t}=this;let s=0;return isFinite(t.minIndex)&&(s=(e-t.minIndex)*t.itemSize),s}}class gt{constructor(e,t,s,i){this.settings=e,this.routines=t,this.state=s,this.logger=i,this.paddings=new ft(this.routines,e)}reset(e){this.setOffset(),this.paddings.reset(this.getSize(),e,this.offset),this.scrollPosition=this.paddings.backward.size||0,this.state.scroll.reset()}setPosition(e){if(this.scrollPosition===e)return this.logger.log((()=>["setting scroll position at",e,"[cancelled]"])),e;this.routines.setScrollPosition(e);const t=this.scrollPosition;return this.logger.log((()=>["setting scroll position at",t,...t!==e?[`(${e})`]:[]])),t}get scrollPosition(){return this.routines.getScrollPosition()}set scrollPosition(e){this.setPosition(e)}getSize(){return this.routines.getViewportSize()}getScrollableSize(){return this.routines.getScrollerSize()}getMaxScrollPosition(){return this.getScrollableSize()-this.getSize()}getBufferPadding(){return this.getSize()*this.settings.padding}getEdge(e){return this.routines.getViewportEdge(e)}setOffset(){this.offset=this.routines.getOffset()}findItemElementById(e){return this.routines.findItemElement(e)}getEdgeVisibleItem(e,t){const s=t===I.backward,i=s?I.forward:I.backward,n=this.getEdge(t);let r,o=0;for(let t=s?0:e.length-1;s?t<=e.length-1:t>=0;t+=s?1:-1){if(o=this.routines.getEdge(e[t].element,i)-n,s&&o>0||!s&&o<0){r=e[t];break}}return{item:r,index:r?r.$index:NaN,diff:o}}}class pt{constructor(){this.reset()}reset(){this.newItems=[],this.oldItems=[],this.removed=[]}}class mt{constructor(e,t){this.itemSize=e,this.sizeStrategy=t,this.sizeMap=new Map,this.recalculation=new pt}reset(e){e&&(this.constantSize=this.itemSize,this.frequentSize=this.itemSize,this.averageSize=this.itemSize,this.averageSizeFloat=this.itemSize,this.sizeMap.clear()),this.recalculation.reset()}get(){switch(this.sizeStrategy){case w.Average:return this.averageSize;case w.Frequent:return this.frequentSize;default:return this.constantSize}}recalculateAverageSize(e){const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(t.length){const i=t.reduce(((e,t)=>e+t.size),0),n=t.reduce(((e,t)=>e+t.newSize),0),r=this.averageSizeFloat||0;this.averageSizeFloat=r-(i-n)/(e-s.length)}if(s.length){const t=s.reduce(((e,t)=>e+t.size),0),i=this.averageSizeFloat||0;this.averageSizeFloat=((e-s.length)*i+t)/e}if(i.length){const t=i.reduce(((e,t)=>e+t.size),0),s=this.averageSizeFloat||0;this.averageSizeFloat=((e+i.length)*s-t)/e}this.averageSize=Math.round(this.averageSizeFloat)}recalculateFrequentSize(){const{oldItems:e,newItems:t,removed:s}=this.recalculation,i=this.sizeMap.get(this.frequentSize);t.length&&t.forEach((({size:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1))),e.length&&(e.forEach((({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0)))),e.forEach((({newSize:e})=>this.sizeMap.set(e,(this.sizeMap.get(e)||0)+1)))),s.length&&s.forEach((({size:e})=>this.sizeMap.set(e,Math.max((this.sizeMap.get(e)||0)-1,0))));const n=[...this.sizeMap.entries()].sort(((e,t)=>t[1]-e[1])),r=n[0][1],o=n.filter((e=>e[1]===r));o.length>1&&o.find((e=>e[0]===i))||(this.frequentSize=n[0][0])}recalculate(e){if(this.sizeStrategy===w.Constant)return!1;const{oldItems:t,newItems:s,removed:i}=this.recalculation;if(!t.length&&!s.length&&!i.length)return!1;const n=this.get();return e?(this.sizeStrategy===w.Average?this.recalculateAverageSize(e):this.recalculateFrequentSize(),this.recalculation.reset()):this.reset(!0),this.get()!==n}setExisted(e,t){this.sizeStrategy!==w.Constant&&this.recalculation.oldItems.push({size:e,newSize:t})}setNew(e){this.sizeStrategy!==w.Constant?this.recalculation.newItems.push({size:e}):this.constantSize||(this.constantSize=e)}setRemoved(e){this.sizeStrategy!==w.Constant&&this.recalculation.removed.push({size:e})}}class xt{constructor(e,t){this.$index=e.$index,this.data=t?e.data:null,this.size=e.size}changeIndex(e){this.$index=e}}class bt{constructor({itemSize:e,cacheData:t,cacheOnReload:s,sizeStrategy:i},n){this.itemSize=e,this.saveData=t,this.cacheOnReload=s,this.sizeStrategy=i,this.logger=n,this.items=new Map,this.defaultSize=new mt(e,i),this.reset(!0)}reset(e){(e=e||!this.cacheOnReload)&&(this.minIndex=1/0,this.maxIndex=-1/0,this.items.clear()),this.defaultSize.reset(e)}get size(){return this.items.size}get(e){return this.items.get(e)}getSizeByIndex(e){const t=this.get(e);return t&&t.size||this.defaultSize.get()}getDefaultSize(){return this.defaultSize.get()}recalculateDefaultSize(){return!!this.defaultSize.recalculate(this.size)&&(this.logger.log((()=>`default size has been updated: ${this.defaultSize.get()}`)),!0)}add(e){let t=this.get(e.$index);return t?(this.saveData&&(t.data=e.data),t.size!==e.size&&(t.size?this.defaultSize.setExisted(t.size,e.size):this.defaultSize.setNew(e.size),t.size=e.size)):(t=new xt(e,this.saveData),this.items.set(e.$index,t),this.defaultSize.setNew(e.size)),e.$index<this.minIndex&&(this.minIndex=e.$index),e.$index>this.maxIndex&&(this.maxIndex=e.$index),t}insertItems(e,t,s,i){const n=new Map,r=e.length;let o=1/0,a=-1/0;const l=e=>{n.set(e.$index,e),o=e.$index<o?e.$index:o,a=e.$index>a?e.$index:a};this.items.forEach((e=>{let n=0;s===I.backward?e.$index<t&&i?n=-r:e.$index>=t&&!i&&(n=r):s===I.forward&&(e.$index<=t&&i?n=-r:e.$index>t&&!i&&(n=r)),n&&e.changeIndex(e.$index+n),l(e)})),this.saveData&&e.forEach(((e,n)=>{const o=t+n-(i?r:0)+(s===I.forward?1:0),a=new xt({$index:o,data:e},this.saveData);l(a)})),this.items=n,this.minIndex=o,this.maxIndex=a}removeItems(e,t){const s=new Map;let i=1/0,n=-1/0;this.items.forEach((r=>{if(e.some((e=>e===r.$index)))return void(r.size&&this.defaultSize.setRemoved(r.size));const o=t?e.reduce(((e,t)=>e+(r.$index<t?1:0)),0):e.reduce(((e,t)=>e-(r.$index>t?1:0)),0);r.changeIndex(r.$index+o),s.set(r.$index,r),i=r.$index<i?r.$index:i,n=r.$index>n?r.$index:n})),this.items=s,this.minIndex=i,this.maxIndex=n}updateSubset(e,t,s){if(!this.size||!e.length)return;const i=e[0].$index,n=e[e.length-1].$index;let r,o;if(t.length){const e=t[0].$index,s=t[t.length-1].$index;r=e-i,o=s-n}else r=s?n-i+1:0,o=s?0:i-n-1;const a=new Map;this.items.forEach((e=>e.$index<i?(e.changeIndex(e.$index+r),void a.set(e.$index,e)):e.$index>n?(e.changeIndex(e.$index+o),void a.set(e.$index,e)):void 0)),t.forEach((e=>a.set(e.$index,new xt(e,this.saveData)))),e.filter((e=>e.toRemove)).forEach((e=>this.defaultSize.setRemoved(e.size))),this.minIndex+=r,this.maxIndex+=o,this.items=a}shiftIndexes(e){const t=new Map;let s=1/0,i=-1/0;this.items.forEach((n=>{n.changeIndex(n.$index+e),t.set(n.$index,n),s=n.$index<s?n.$index:s,i=n.$index>i?n.$index:i})),this.items=t,this.minIndex=s,this.maxIndex=i}}class It{constructor(e,t){this.context=e,this.logger=t}fillEmpty(e,t,s){return e.length?Number.isInteger(t)||Number.isInteger(s)?(this.logger.log((()=>`going to fill the buffer with ${e.length} item(s)`)),!0):(this.logger.log("no items to fill the buffer; wrong indexes"),!1):(this.logger.log("no items to fill the buffer; empty list"),!1)}insertInBuffer(e,t,s){const i=Number.isInteger(t)?t:Number.isInteger(s)?s:NaN,n=this.context.items.find((t=>e&&e(t.get())||Number.isInteger(i)&&i===t.$index));return n?n.$index:(this.logger.log("no items to insert in buffer; empty predicate's result"),NaN)}insertVirtual(e,t,s){if(!e.length)return this.logger.log("no items to insert virtually; empty list"),!1;const{firstIndex:i,lastIndex:n,finiteAbsMinIndex:r,finiteAbsMaxIndex:o}=this.context;if(t<r||t>o)return this.logger.log((()=>`no items to insert virtually; selected index (${t}) does not match virtual area [${r}..${o}]`)),!1;const a=s===I.backward;return t<i+(a?1:0)||t>n-(a?0:1)?(this.logger.log((()=>`going to insert ${e.length} item(s) virtually`)),!0):(this.logger.log((()=>`no items to insert virtually; selected index (${t}) belongs Buffer [${i}..${n}]`)),!1)}}class wt{constructor(t,s,i){this._items=[],this.logger=i,this.changeItems=s,this.bof=new e(!1),this.eof=new e(!1),this.cache=new bt(t,i),this.checkCall=new It(this,i),this.startIndexUser=t.startIndex,this.minIndexUser=t.minIndex,this.maxIndexUser=t.maxIndex,this.reset(!0)}dispose(){this.bof.dispose(),this.eof.dispose(),this._items.forEach((e=>e.dispose())),this._items=[]}reset(e,t){this.items.forEach((e=>e.hide())),this.pristine=!0,this.items=[],this.cache.reset(e),this.absMinIndex=this.minIndexUser,this.absMaxIndex=this.maxIndexUser,this.setCurrentStartIndex(t),this.bof.set(!1),this.eof.set(!1),this.pristine=!1}setCurrentStartIndex(e){const t=this.minIndexUser,s=this.maxIndexUser,i=this.startIndexUser;let n=Number(e);Number.isNaN(n)&&(this.logger.log((()=>`fallback startIndex to settings.startIndex (${i})`)),n=i),n<t&&(this.logger.log((()=>`setting startIndex to settings.minIndex (${t}) because ${n} < ${t}`)),n=t),n>s&&(this.logger.log((()=>`setting startIndex to settings.maxIndex (${s}) because ${n} > ${s}`)),n=s),this.startIndex=n}set items(e){this._items=e,this.changeItems(e),this.pristine||(this.checkBOF(),this.checkEOF())}get items(){return this._items}set absMinIndex(e){this._absMinIndex!==e&&(this._absMinIndex=Number.isFinite(this._absMaxIndex)&&e>this._absMaxIndex?this._absMaxIndex:e),this.pristine||this.checkBOF()}get absMinIndex(){return this._absMinIndex}set absMaxIndex(e){this._absMaxIndex!==e&&(this._absMaxIndex=Number.isFinite(this._absMinIndex)&&e<this._absMinIndex?this._absMinIndex:e),this.pristine||this.checkEOF()}get absMaxIndex(){return this._absMaxIndex}checkBOF(){const e=this.items.length?this.items[0].$index===this.absMinIndex:isFinite(this.absMinIndex);this.bof.set(e)}checkEOF(){const e=this.items.length?this.items[this.items.length-1].$index===this.absMaxIndex:isFinite(this.absMaxIndex);this.eof.set(e)}get size(){return this._items.length}get cacheSize(){return this.cache.size}get defaultSize(){return this.cache.getDefaultSize()}get minIndex(){return isFinite(this.cache.minIndex)?this.cache.minIndex:this.startIndex}get maxIndex(){return isFinite(this.cache.maxIndex)?this.cache.maxIndex:this.startIndex}get firstIndex(){return this.items.length?this.items[0].$index:NaN}get lastIndex(){return this.items.length?this.items[this.items.length-1].$index:NaN}get finiteAbsMinIndex(){return isFinite(this.absMinIndex)?this.absMinIndex:this.minIndex}get finiteAbsMaxIndex(){return isFinite(this.absMaxIndex)?this.absMaxIndex:this.maxIndex}get(e){return this.items.find((t=>t.$index===e))}setItems(e){if(this.items.length)if(this.items[0].$index>e[e.length-1].$index)this.items=[...e,...this.items];else{if(!(e[0].$index>this.items[this.items.length-1].$index))return!1;this.items=[...this.items,...e]}else this.items=[...e];return!0}clip(){this.items=this.items.filter((({toRemove:e})=>!e))}getIndexToInsert(e,t,s){return this.checkCall.insertInBuffer(e,t,s)}shiftExtremum(e,t){t?(this.absMinIndex-=e,this.startIndex-=e):this.absMaxIndex+=e,this.startIndex>this.absMaxIndex?this.startIndex=this.absMaxIndex:this.startIndex<this.absMinIndex&&(this.startIndex=this.absMinIndex)}insertVirtually(e,t,s,i){if(!this.checkCall.insertVirtual(e,t,s))return!1;let n=0;return t<=this.firstIndex&&!i?n=e.length:t>=this.lastIndex&&i&&(n=-e.length),n&&(this.items.forEach((e=>e.updateIndex(e.$index+n))),this.cache.insertItems(e,t,s,i),this.items=[...this.items]),this.shiftExtremum(e.length,i),!0}removeVirtually(e,t){const s=this.items.length;let i=!1;for(let n=t?s-1:0;t?n>=0:n<s;t?n--:n++){const s=this.items[n],r=e.reduce(((e,i)=>e+(t?s.$index<i?1:0:s.$index>i?-1:0)),0);i=i||!!r,s.updateIndex(s.$index+r)}this.shiftExtremum(-e.length,t),i&&(this.items=[...this.items]),this.cache.removeItems(e,t)}fillEmpty(e,t,s,i,n){if(!this.checkCall.fillEmpty(e,t,s))return!1;const r=Number.isInteger(t),o=r?t:s,a=i?e.length:r?1:0;return this.items=e.map(((e,t)=>n(o+t+(r?0:1)-a,e))),this._absMinIndex=this.items[0].$index,this._absMaxIndex=this.items[this.size-1].$index,this.startIndex<=this.absMinIndex?this.startIndex=this.absMinIndex:this.startIndex>this.absMaxIndex&&(this.startIndex=this.absMaxIndex),!0}updateItems(e,t,s,i){if(!this.size||Number.isNaN(this.firstIndex))return{trackedIndex:NaN,toRemove:[]};let n=s,r=i?this.lastIndex:this.firstIndex;const o=[],a=i?-1:1,l=this.size-1,c=new Map,d=Array.prototype[i?"unshift":"push"];for(let h=i?l:0;i?h>=0:h<=l;h+=a){const l=this.items[h];c.set(l.$index,l);const u=e(l);if(!u||Array.isArray(u)&&!u.length){l.toRemove=!0,n+=l.$index>=s?i?1:0:i?0:-1,this.shiftExtremum(-1,i);continue}if(!Array.isArray(u)){l.updateIndex(r),d.call(o,l),r+=a;continue}l.$index<s?n+=i?0:u.length-1:l.$index>s&&(n+=i?1-u.length:0);let f=!0;const g=[];(i?[...u].reverse():u).forEach(((e,i)=>{let o;l.data===e?(s===l.$index&&(n=r+i*a),l.updateIndex(r+i*a),o=l,f=!1):(o=t(r+i*a,e),o.toInsert=!0),d.call(g,o)})),l.toRemove=f,d.call(o,...g),r+=a*u.length,u.length>1&&this.shiftExtremum(u.length-1,i)}const h=this.items.filter((e=>e.toRemove)),u=Array.from(c).map((([e,{size:t,toRemove:s}])=>({$index:e,size:t,toRemove:s}))).sort(((e,t)=>e.$index-t.$index));return this.items=o,this.cache.updateSubset(u,o,i),this.finiteAbsMinIndex===this.finiteAbsMaxIndex?n=NaN:n>this.finiteAbsMaxIndex?n=this.finiteAbsMaxIndex:n<this.finiteAbsMinIndex&&(n=this.finiteAbsMinIndex),{trackedIndex:n,toRemove:h}}cacheItem(e){this.cache.add(e)}getFirstVisibleItemIndex(){const e=this.items.length;for(let t=0;t<e;t++)if(!this.items[t].invisible)return t;return-1}getLastVisibleItemIndex(){for(let e=this.items.length-1;e>=0;e--)if(!this.items[e].invisible)return e;return-1}getFirstVisibleItem(){const e=this.getFirstVisibleItemIndex();if(e>=0)return this.items[e]}getLastVisibleItem(){const e=this.getLastVisibleItemIndex();if(e>=0)return this.items[e]}getEdgeVisibleItem(e,t){return e===(t?I.backward:I.forward)?this.getLastVisibleItem():this.getFirstVisibleItem()}getVisibleItemsCount(){return this.items.reduce(((e,t)=>e+(t.invisible?0:1)),0)}getSizeByIndex(e){return this.cache.getSizeByIndex(e)}checkDefaultSize(){return this.cache.recalculateDefaultSize()}}class vt{constructor(t){this.total=t,this.isInitial=!1,this.busy=new e(!1)}get first(){return 0===this.count}done(){this.isInitial=!1,this.count++,this.total++,this.busy.set(!1)}start(){this.busy.set(!0)}dispose(){this.busy.dispose()}}class yt{constructor(t,s){const i=s?s.count:1,n=s?s.innerLoop.count:0;this.instanceIndex=t,this.innerLoop=new vt(n),this.interrupter=null,this.busy=new e(!1),this.end(i)}get loopId(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total}`}get loopIdNext(){return`${this.instanceIndex}-${this.count}-${this.innerLoop.total+1}`}start(e,t){this.isInitial=e,this.initiator=t,this.innerLoop.isInitial=e,this.innerLoop.count=0,this.interrupter=null,this.busy.set(!0)}end(e){this.count=e,this.isInitial=!1,this.busy.set(!1)}dispose(e){e&&this.busy.dispose(),this.innerLoop.dispose()}}class St{constructor(){this.reset()}reset(){this.startDelta=0,this.before=0}}class zt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN,this.position=NaN}}class kt{constructor(){this.reset()}reset(){this.index=NaN,this.indexBuffer=NaN}}class $t{constructor(){this.reset()}reset(){this.index=NaN,this.delta=0}}class Et{constructor(e){this.directionPriority=e,this.callCount=0,this.positions=new St,this.first=new zt,this.last=new kt,this.firstVisible=new $t,this.reset()}reset(){this._newItemsData=null,this.items=[],this.positions.reset(),this.first.reset(),this.last.reset(),this.firstVisible.reset(),this.hasAnotherPack=!1,this.direction=null,this.cancel=null,this.simulate=!1,this.isCheck=!1,this.doRemove=!1}get newItemsData(){return this._newItemsData}set newItemsData(e){this._newItemsData=e,e&&e.length&&this.callCount++}get shouldFetch(){return!!this.count}get hasNewItems(){return!(!this._newItemsData||!this._newItemsData.length)}get index(){return this.first.index}get count(){return isNaN(this.first.index)||isNaN(this.last.index)?0:this.last.index-this.first.index+1}shouldCheckPreSizeExpectation(e){if(this.directionPriority===I.backward)return!1;const t=this.items[this.items.length-1];return t&&t.$index<e}startSimulate(e){this.simulate=!0,this._newItemsData=e.map((e=>e.data)),this.items=e,this.hasAnotherPack=!1}stopSimulate(){this.simulate=!1,this.isCheck=!1,this.doRemove=!1}fill(e,t){this.startSimulate(e),this.first.index=e[0].$index,this.last.index=e[e.length-1].$index,this.direction=I.forward,this.firstVisible.index=t,this.firstVisible.delta=0}check(e){this.startSimulate(e),this.last.index=e[0].$index,this.first.index=e[e.length-1].$index,this.isCheck=!0}update(e,t,s,i){this.startSimulate(s),this.firstVisible.index=e,this.firstVisible.delta=t,this.doRemove=i.length>0}}class Mt{constructor(){this.callCount=0,this.reset()}get force(){return this.forceForward||this.forceBackward}reset(e){this.doClip=!1,e||(this.forceForward=!1,this.forceBackward=!1)}}class Vt{constructor(){this.reset()}get noSize(){return this.sizeBefore===this.sizeAfter}reset(){this.sizeBefore=0,this.sizeAfter=0,this.positionBefore=0,this.cancel=null}}class Nt{constructor(){this.reset()}reset(){this.previous=null,this.current=null,this.syntheticPosition=null,this.syntheticFulfill=!1,this.positionBeforeAsync=null,this.positionBeforeAdjust=null,this.positionAfterAdjust=null,this.stop()}stop(){this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.cancelAnimation&&(this.cancelAnimation(),this.cancelAnimation=null)}hasPositionChanged(e){const t=this.positionBeforeAdjust,s=this.positionAfterAdjust;return null===t||t!==e||null===s||s!==e}}class Ot{constructor(e,t,s){this.packageInfo=e,this.settings=t,this.initTime=Number(new Date),this.cycle=new yt(this.settings.instanceIndex,s?s.cycle:void 0),this.fetch=new Et(t.directionPriority),this.clip=new Mt,this.render=new Vt,this.scroll=new Nt}get time(){return Number(new Date)-this.initTime}startWorkflowCycle(e,t){this.cycle.start(e,t)}endWorkflowCycle(e){this.cycle.end(e)}startInnerLoop(){const{cycle:e,scroll:t,fetch:s,render:i,clip:n}=this;return e.innerLoop.start(),t.positionBeforeAsync=null,s.simulate||s.reset(),n.reset(n.force),i.reset(),Object.assign({},e.innerLoop.first?{process:e.initiator,doRender:s.simulate&&s.items.length>0}:{})}endInnerLoop(){const{fetch:e,clip:t,render:s,cycle:i}=this;e.stopSimulate(),t.reset(!0),e.cancel&&(e.cancel(),e.cancel=null),s.cancel&&(s.cancel(),s.cancel=null),i.innerLoop.done()}dispose(){this.scroll.stop(),this.cycle.dispose(),this.endInnerLoop()}}const At=h(),Pt=(e,t)=>"object"==typeof e&&null!==e&&Object.prototype.hasOwnProperty.call(e,t),Rt=(e,t,s)=>{let i=t;if(!Pt(t,"items")){const n=Array.isArray(t)?t:[t];i=e?{items:n,bof:s}:{items:n,eof:s}}return i};class Ct{constructor(e,i,n){this.source={},this.box={},this.demand={},this.wanted={},this.getWorkflow=i,this.logger=n,this.relax$=null,this.relaxRun=null,this.reloadCounter=0;const r=e&&u.get(e.id)||{},o=e?At.map((t=>{let s=e[t.name];if(e.augmented){const e=r[t.name];e&&(s=e.default)}return Object.assign(Object.assign({},t),{value:s})})):h();Object.entries(r).forEach((([e,t])=>{const s=o.find((({name:t})=>t===e));s&&t&&(s.value=t.default)})),o.filter((({type:e,permanent:t})=>e===s.Scalar&&t)).forEach((({name:e,value:t})=>Object.defineProperty(this,e,{configurable:!0,get:()=>t}))),o.filter((e=>e.type===s.Reactive)).forEach((({name:e,value:t})=>{this.source[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>{const t=At.find((({wanted:t,reactive:s})=>t&&s===e));return t&&(this.wanted[t.name]=!0),this.source[e]}})})),o.filter((e=>e.type===s.Scalar&&!!e.reactive)).forEach((({name:e,value:t,reactive:s,wanted:i})=>{i&&(this.wanted[e]=!1),this.box[e]=t,Object.defineProperty(this,e,{configurable:!0,set:t=>{if(t!==this.box[e]){this.box[e]=t,this.source[s].set(t);const i=r[s];i&&i.emit(i.source,t)}},get:()=>(i&&(this.wanted[e]=!0),this.box[e])})})),o.filter((e=>e.type===s.Scalar&&e.onDemand)).forEach((({name:e,value:t})=>{this.demand[e]=t,Object.defineProperty(this,e,{configurable:!0,get:()=>this.demand[e]})})),e&&(o.forEach((({name:i,type:n,value:o,permanent:a})=>{let l=this[i];n===s.Function?l=l.bind(this):n===s.WorkflowRunner?l=this.getPromisifiedMethod(l,o):n===s.Reactive&&r[i]?l=e[i]:i===t.augmented&&(l=!0),Object.defineProperty(e,i,{configurable:!0,get:()=>a||n!==s.Scalar?l:this[i]})})),this.externalContext=e)}get workflow(){return this.getWorkflow()}get reloadCount(){return this.reloadCounter}get reloadId(){return this.id+"."+this.reloadCounter}getPromisifiedMethod(e,t){return(...s)=>this.relax$?new Promise((t=>{this.relax$&&this.relax$.once((e=>t(e))),e.apply(this,s)})):t.apply(this,s)}initialize(s,i,n,r){if(Object.defineProperty(this.demand,t.itemsCount,{get:()=>s.getVisibleItemsCount()}),Object.defineProperty(this.demand,t.bufferInfo,{get:()=>({firstIndex:s.firstIndex,lastIndex:s.lastIndex,minIndex:s.minIndex,maxIndex:s.maxIndex,absMinIndex:s.absMinIndex,absMaxIndex:s.absMaxIndex,defaultSize:s.defaultSize})}),this.bof=s.bof.get(),s.bof.on((e=>this.bof=e)),this.eof=s.eof.get(),s.eof.on((e=>this.eof=e)),Object.defineProperty(this.demand,t.packageInfo,{get:()=>i.packageInfo}),this.loopPending=i.cycle.innerLoop.busy.get(),i.cycle.innerLoop.busy.on((e=>this.loopPending=e)),this.isLoading=i.cycle.busy.get(),i.cycle.busy.on((e=>this.isLoading=e)),this.logger=n,r){this.relax$||(this.relax$=new e);const t=this.relax$;r.on((({status:e,payload:s})=>{let i=()=>{};e===se.start?i=this.isLoading$.on((e=>{e||(i(),t.set({success:!0,immediate:!1,details:null}))})):e!==se.done&&e!==se.error||(i(),t.set({success:e!==se.error,immediate:!0,details:e===se.error&&s?String(s.error):null}))}))}this.init=!0}dispose(){this.relax$&&this.relax$.dispose(),this.externalContext&&this.resetContext(),Object.getOwnPropertyNames(this).forEach((e=>{delete this[e]}))}resetContext(){const e=u.get(this.externalContext.id);At.forEach((({type:t,permanent:i,name:n,value:r})=>{if(t===s.Reactive||i||Object.defineProperty(this.externalContext,n,{configurable:!0,get:()=>r}),t===s.Reactive&&e){const t=e[n];t&&(t.default.reset(),t.emit(t.source,t.default.get()))}}))}reset(e){this.reloadCounter++,this.logger.logAdapterMethod("reset",e,` of ${this.reloadId}`),this.workflow.call({process:te.reset,status:se.start,payload:{options:e}})}reload(e){this.reloadCounter++,this.logger.logAdapterMethod("reload",e,` of ${this.reloadId}`),this.workflow.call({process:te.reload,status:se.start,payload:{options:e}})}append(e,t){const s=Rt(!1,e,t);this.logger.logAdapterMethod("append",[s.items,s.eof]),this.workflow.call({process:te.append,status:se.start,payload:{options:s}})}prepend(e,t){const s=Rt(!0,e,t);this.logger.logAdapterMethod("prepend",[s.items,s.bof]),this.workflow.call({process:te.prepend,status:se.start,payload:{options:s}})}check(){this.logger.logAdapterMethod("check"),this.workflow.call({process:te.check,status:se.start})}remove(e){e=(e=>{Pt(e,"predicate")||Pt(e,"indexes")||(e={predicate:e});return e})(e),this.logger.logAdapterMethod("remove",e),this.workflow.call({process:te.remove,status:se.start,payload:{options:e}})}clip(e){this.logger.logAdapterMethod("clip",e),this.workflow.call({process:te.clip,status:se.start,payload:{options:e}})}insert(e){this.logger.logAdapterMethod("insert",e),this.workflow.call({process:te.insert,status:se.start,payload:{options:e}})}replace(e){this.logger.logAdapterMethod("replace",e),this.workflow.call({process:te.replace,status:se.start,payload:{options:e}})}update(e){this.logger.logAdapterMethod("update",e),this.workflow.call({process:te.update,status:se.start,payload:{options:e}})}fix(e){this.logger.logAdapterMethod("fix",e),this.workflow.call({process:te.fix,status:se.start,payload:{options:e}})}relaxUnchained(e,t){const s=()=>"function"==typeof e&&t===this.reloadId&&e();return this.isLoading||s(),new Promise((e=>{this.isLoading?this.isLoading$.once((()=>{s(),e(!1)})):e(!0)})).then((e=>{const s=t===this.reloadId;return this.logger.log((()=>s?void 0:`relax promise cancelled due to ${t} != ${this.reloadId}`)),{immediate:e,success:s,details:s?null:"Interrupted by reload or reset"}}))}relax(e){const t=this.reloadId;return this.logger.logAdapterMethod("relax",e,` of ${t}`),this.init?this.relaxRun=this.relaxRun?this.relaxRun.then((()=>this.relaxUnchained(e,t))):this.relaxUnchained(e,t).then((e=>(this.relaxRun=null,e))):Promise.resolve(o)}showLog(){this.logger.logAdapterMethod("showLog"),this.logger.logForce()}}const Tt="Invalid datasource:";let Ft=0;class Bt{constructor({datasource:e,consumer:t,element:s,workflow:i,scroller:n}){const{params:{get:r}}=C(e,L);if(!r.isValid)throw new Error(`Invalid datasource: ${r.errors[0]}`);const o=n?n.state.packageInfo:{consumer:t,core:f};s=n?n.routines.element:s,i=n?n.workflow:i,this.workflow=i,this.settings=new Te(e.settings,e.devSettings,++Ft),this.logger=new dt(this,o,e.adapter),this.routines=new ht(s,this.settings),this.state=new Ot(o,this.settings,n?n.state:void 0),this.buffer=new wt(this.settings,i.onDataChanged,this.logger),this.viewport=new gt(this.settings,this.routines,this.state,this.logger),this.logger.object("vscroll settings object",this.settings,!0),this.initDatasource(e,n)}initDatasource(e,t){if(t)return this.datasource=e,void(this.adapter=t.adapter);const s=e instanceof m,i=!s&&!this.settings.adapter;if(s)this.datasource=e;else{const t=x((()=>({mock:i})));this.datasource=new t(e),this.settings.adapter&&(e.adapter=this.datasource.adapter)}const n=i?null:this.datasource.adapter;this.adapter=new Ct(n,(()=>this.workflow),this.logger)}init(e){this.viewport.reset(this.buffer.startIndex),this.logger.stat("initialization"),this.adapter.initialize(this.buffer,this.state,this.logger,e)}dispose(e){e&&this.adapter.dispose(),this.buffer.dispose(),this.state.dispose()}finalize(){}}class Lt{constructor({element:t,datasource:s,consumer:i,run:n}){this.isInitialized=!1,this.initTimer=null,this.adapterRun$=new e,this.cyclesDone=0,this.interruptionCount=0,this.errors=[],this.offScroll=()=>null,this.propagateChanges=n,this.stateMachineMethods={run:this.runProcess(),interrupt:this.interrupt.bind(this),done:this.done.bind(this),onError:this.onError.bind(this)},this.scroller=new Bt({element:t,datasource:s,consumer:i,workflow:this.getUpdater()}),this.scroller.settings.initializeDelay?this.initTimer=setTimeout((()=>{this.initTimer=null,this.init()}),this.scroller.settings.initializeDelay):this.init()}init(){this.scroller.init(this.adapterRun$),this.isInitialized=!0,this.callWorkflow({process:ee.init,status:se.start});const{routines:e}=this.scroller;this.offScroll=e.onScroll((e=>this.callWorkflow({process:ee.scroll,status:se.start,payload:{event:e}})))}changeItems(e){this.propagateChanges(e)}callWorkflow(e){if(!this.isInitialized)return;const{process:t,status:s}=e;t&&t.startsWith("adapter")&&s!==se.next&&this.adapterRun$.set(e),this.process(e)}getUpdater(){return{call:this.callWorkflow.bind(this),onDataChanged:this.changeItems.bind(this)}}process(e){const{status:t,process:s,payload:i}=e;this.scroller.settings.logProcessRun&&this.scroller.logger.log((()=>["%cfire%c","color: #cc7777;","color: #000000;",s,`"${t}"`,...void 0!==i?[i]:[]])),this.scroller.logger.logProcess(e),s===ee.end&&this.scroller.finalize(),(({input:{process:e,status:t,payload:s={}},methods:{run:i,interrupt:n,done:r,onError:o}})=>{if(t===se.error)return o(e,s),void(e.startsWith("adapter")||i(ot)(s));const{options:a}=s;switch(e){case ee.init:t===se.start&&i(De)(e),t===se.next&&i(et)();break;case ee.scroll:t===se.start&&i(je)(s),t===se.next&&i(De)(e);break;case te.reset:case te.reload:t===se.start&&(e===te.reset?i(_e)(a):i(Ue)(a)),t===se.next&&(n(Object.assign({process:e},s)),s.finalize?i(ot)():i(De)(e));break;case te.append:case te.prepend:t===se.start&&i(He)({process:e,options:a}),t===se.next&&i(De)(e);break;case te.check:t===se.start&&i(Xe)(),t===se.next&&i(De)(e);break;case te.remove:t===se.start&&i(Ye)(a),t===se.next&&i(De)(e);break;case te.clip:t===se.start&&i(Je)(a),t===se.next&&i(De)(e);break;case te.insert:t===se.start&&i(Ge)(a),t===se.next&&i(De)(e);break;case te.replace:t===se.start&&i(Qe)(a),t===se.next&&i(De)(e);break;case te.update:t===se.start&&i(qe)(a),t===se.next&&i(De)(e);break;case te.fix:t===se.start&&i(Ke)(a),t===se.next&&i(De)(e);break;case ee.start:switch(s.process){case te.append:case te.insert:case te.replace:case te.update:s.doRender?i(nt)():i(at)();break;case te.check:i(nt)();break;case te.remove:i(at)();break;default:i(tt)()}break;case ee.preFetch:t===se.next&&(s.process===te.clip?i(lt)():i(st)()),t===se.done&&i(ot)();break;case ee.fetch:i(it)();break;case ee.postFetch:t===se.next&&i(nt)(),t===se.done&&i(ot)();break;case ee.render:if(t===se.next)switch(s.process){case te.append:case te.check:case te.insert:case te.replace:case te.update:i(at)();break;default:i(lt)()}t===se.done&&i(ot)();break;case ee.preClip:s.doClip?i(ct)():i(at)();break;case ee.clip:i(at)();break;case ee.adjust:i(ot)();break;case ee.end:if(t===se.next)switch(s.process){case te.reset:case te.reload:r(),i(De)(s.process);break;default:i(et)()}t===se.done&&r()}})({input:e,methods:this.stateMachineMethods})}runProcess(){return({run:e,process:t,name:s})=>(...i)=>{this.scroller.settings.logProcessRun&&this.scroller.logger.log((()=>["%crun%c","color: #333399;","color: #000000;",t||s,...i])),e(this.scroller,...i)}}onError(e,t){const s=t&&String(t.error)||"",{time:i,cycle:n}=this.scroller.state;this.errors.push({process:e,message:s,time:i,loop:n.loopIdNext}),this.scroller.logger.logError(s)}interrupt({process:e,finalize:t,datasource:s}){if(t){const{workflow:t,logger:s}=this.scroller;t.call=e=>s.log("[skip wf call]"),t.call.interrupted=!0,this.scroller.workflow=this.getUpdater(),this.interruptionCount++,s.log((()=>`workflow had been interrupted by the ${e} process (${this.interruptionCount})`))}s&&this.scroller.adapter.relax((()=>{this.scroller.logger.log("new Scroller instantiation");const e=new Bt({datasource:s,scroller:this.scroller});this.scroller.dispose(),this.scroller=e,this.scroller.init()}))}done(){const{state:e,logger:t}=this.scroller;this.cyclesDone++,t.logCycle(!1),e.endWorkflowCycle(this.cyclesDone+1),this.finalize()}dispose(){this.initTimer&&clearTimeout(this.initTimer),this.offScroll(),this.adapterRun$.dispose(),this.scroller.dispose(!0),Object.getOwnPropertyNames(this).forEach((e=>{delete this[e]}))}finalize(){}}export{t as AdapterPropName,I as Direction,d as EMPTY_ITEM,Tt as INVALID_DATASOURCE_PREFIX,w as SizeStrategy,Lt as Workflow,h as getDefaultAdapterProps,x as makeDatasource,f as packageInfo};
|
|
6
6
|
//# sourceMappingURL=vscroll.esm6.min.js.map
|