|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
|   | 
|   | 
| /** | 
|  * AUTO-GENERATED FILE. DO NOT MODIFY. | 
|  */ | 
|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
| import { assert, isArray } from 'zrender/lib/core/util.js'; | 
| ; | 
| /** | 
|  * @param {Object} define | 
|  * @return See the return of `createTask`. | 
|  */ | 
|   | 
| export function createTask(define) { | 
|   return new Task(define); | 
| } | 
|   | 
| var Task = | 
| /** @class */ | 
| function () { | 
|   function Task(define) { | 
|     define = define || {}; | 
|     this._reset = define.reset; | 
|     this._plan = define.plan; | 
|     this._count = define.count; | 
|     this._onDirty = define.onDirty; | 
|     this._dirty = true; | 
|   } | 
|   /** | 
|    * @param step Specified step. | 
|    * @param skip Skip customer perform call. | 
|    * @param modBy Sampling window size. | 
|    * @param modDataCount Sampling count. | 
|    * @return whether unfinished. | 
|    */ | 
|   | 
|   | 
|   Task.prototype.perform = function (performArgs) { | 
|     var upTask = this._upstream; | 
|     var skip = performArgs && performArgs.skip; // TODO some refactor. | 
|     // Pull data. Must pull data each time, because context.data | 
|     // may be updated by Series.setData. | 
|   | 
|     if (this._dirty && upTask) { | 
|       var context = this.context; | 
|       context.data = context.outputData = upTask.context.outputData; | 
|     } | 
|   | 
|     if (this.__pipeline) { | 
|       this.__pipeline.currentTask = this; | 
|     } | 
|   | 
|     var planResult; | 
|   | 
|     if (this._plan && !skip) { | 
|       planResult = this._plan(this.context); | 
|     } // Support sharding by mod, which changes the render sequence and makes the rendered graphic | 
|     // elements uniformed distributed when progress, especially when moving or zooming. | 
|   | 
|   | 
|     var lastModBy = normalizeModBy(this._modBy); | 
|     var lastModDataCount = this._modDataCount || 0; | 
|     var modBy = normalizeModBy(performArgs && performArgs.modBy); | 
|     var modDataCount = performArgs && performArgs.modDataCount || 0; | 
|   | 
|     if (lastModBy !== modBy || lastModDataCount !== modDataCount) { | 
|       planResult = 'reset'; | 
|     } | 
|   | 
|     function normalizeModBy(val) { | 
|       !(val >= 1) && (val = 1); // jshint ignore:line | 
|   | 
|       return val; | 
|     } | 
|   | 
|     var forceFirstProgress; | 
|   | 
|     if (this._dirty || planResult === 'reset') { | 
|       this._dirty = false; | 
|       forceFirstProgress = this._doReset(skip); | 
|     } | 
|   | 
|     this._modBy = modBy; | 
|     this._modDataCount = modDataCount; | 
|     var step = performArgs && performArgs.step; | 
|   | 
|     if (upTask) { | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         assert(upTask._outputDueEnd != null); | 
|       } | 
|   | 
|       this._dueEnd = upTask._outputDueEnd; | 
|     } // DataTask or overallTask | 
|     else { | 
|         if (process.env.NODE_ENV !== 'production') { | 
|           assert(!this._progress || this._count); | 
|         } | 
|   | 
|         this._dueEnd = this._count ? this._count(this.context) : Infinity; | 
|       } // Note: Stubs, that its host overall task let it has progress, has progress. | 
|     // If no progress, pass index from upstream to downstream each time plan called. | 
|   | 
|   | 
|     if (this._progress) { | 
|       var start = this._dueIndex; | 
|       var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); | 
|   | 
|       if (!skip && (forceFirstProgress || start < end)) { | 
|         var progress = this._progress; | 
|   | 
|         if (isArray(progress)) { | 
|           for (var i = 0; i < progress.length; i++) { | 
|             this._doProgress(progress[i], start, end, modBy, modDataCount); | 
|           } | 
|         } else { | 
|           this._doProgress(progress, start, end, modBy, modDataCount); | 
|         } | 
|       } | 
|   | 
|       this._dueIndex = end; // If no `outputDueEnd`, assume that output data and | 
|       // input data is the same, so use `dueIndex` as `outputDueEnd`. | 
|   | 
|       var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; | 
|   | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         // ??? Can not rollback. | 
|         assert(outputDueEnd >= this._outputDueEnd); | 
|       } | 
|   | 
|       this._outputDueEnd = outputDueEnd; | 
|     } else { | 
|       // (1) Some overall task has no progress. | 
|       // (2) Stubs, that its host overall task do not let it has progress, has no progress. | 
|       // This should always be performed so it can be passed to downstream. | 
|       this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; | 
|     } | 
|   | 
|     return this.unfinished(); | 
|   }; | 
|   | 
|   Task.prototype.dirty = function () { | 
|     this._dirty = true; | 
|     this._onDirty && this._onDirty(this.context); | 
|   }; | 
|   | 
|   Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) { | 
|     iterator.reset(start, end, modBy, modDataCount); | 
|     this._callingProgress = progress; | 
|   | 
|     this._callingProgress({ | 
|       start: start, | 
|       end: end, | 
|       count: end - start, | 
|       next: iterator.next | 
|     }, this.context); | 
|   }; | 
|   | 
|   Task.prototype._doReset = function (skip) { | 
|     this._dueIndex = this._outputDueEnd = this._dueEnd = 0; | 
|     this._settedOutputEnd = null; | 
|     var progress; | 
|     var forceFirstProgress; | 
|   | 
|     if (!skip && this._reset) { | 
|       progress = this._reset(this.context); | 
|   | 
|       if (progress && progress.progress) { | 
|         forceFirstProgress = progress.forceFirstProgress; | 
|         progress = progress.progress; | 
|       } // To simplify no progress checking, array must has item. | 
|   | 
|   | 
|       if (isArray(progress) && !progress.length) { | 
|         progress = null; | 
|       } | 
|     } | 
|   | 
|     this._progress = progress; | 
|     this._modBy = this._modDataCount = null; | 
|     var downstream = this._downstream; | 
|     downstream && downstream.dirty(); | 
|     return forceFirstProgress; | 
|   }; | 
|   | 
|   Task.prototype.unfinished = function () { | 
|     return this._progress && this._dueIndex < this._dueEnd; | 
|   }; | 
|   /** | 
|    * @param downTask The downstream task. | 
|    * @return The downstream task. | 
|    */ | 
|   | 
|   | 
|   Task.prototype.pipe = function (downTask) { | 
|     if (process.env.NODE_ENV !== 'production') { | 
|       assert(downTask && !downTask._disposed && downTask !== this); | 
|     } // If already downstream, do not dirty downTask. | 
|   | 
|   | 
|     if (this._downstream !== downTask || this._dirty) { | 
|       this._downstream = downTask; | 
|       downTask._upstream = this; | 
|       downTask.dirty(); | 
|     } | 
|   }; | 
|   | 
|   Task.prototype.dispose = function () { | 
|     if (this._disposed) { | 
|       return; | 
|     } | 
|   | 
|     this._upstream && (this._upstream._downstream = null); | 
|     this._downstream && (this._downstream._upstream = null); | 
|     this._dirty = false; | 
|     this._disposed = true; | 
|   }; | 
|   | 
|   Task.prototype.getUpstream = function () { | 
|     return this._upstream; | 
|   }; | 
|   | 
|   Task.prototype.getDownstream = function () { | 
|     return this._downstream; | 
|   }; | 
|   | 
|   Task.prototype.setOutputEnd = function (end) { | 
|     // This only happend in dataTask, dataZoom, map, currently. | 
|     // where dataZoom do not set end each time, but only set | 
|     // when reset. So we should record the setted end, in case | 
|     // that the stub of dataZoom perform again and earse the | 
|     // setted end by upstream. | 
|     this._outputDueEnd = this._settedOutputEnd = end; | 
|   }; | 
|   | 
|   return Task; | 
| }(); | 
|   | 
| export { Task }; | 
|   | 
| var iterator = function () { | 
|   var end; | 
|   var current; | 
|   var modBy; | 
|   var modDataCount; | 
|   var winCount; | 
|   var it = { | 
|     reset: function (s, e, sStep, sCount) { | 
|       current = s; | 
|       end = e; | 
|       modBy = sStep; | 
|       modDataCount = sCount; | 
|       winCount = Math.ceil(modDataCount / modBy); | 
|       it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; | 
|     } | 
|   }; | 
|   return it; | 
|   | 
|   function sequentialNext() { | 
|     return current < end ? current++ : null; | 
|   } | 
|   | 
|   function modNext() { | 
|     var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); | 
|     var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case), | 
|     // Use normal linear rendering mode. | 
|     : current; | 
|     current++; | 
|     return result; | 
|   } | 
| }(); /////////////////////////////////////////////////////////// | 
| // For stream debug (Should be commented out after used!) | 
| // @usage: printTask(this, 'begin'); | 
| // @usage: printTask(this, null, {someExtraProp}); | 
| // @usage: Use `__idxInPipeline` as conditional breakpiont. | 
| // | 
| // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void { | 
| //     window.ecTaskUID == null && (window.ecTaskUID = 0); | 
| //     task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); | 
| //     task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); | 
| //     let props = []; | 
| //     if (task.__pipeline) { | 
| //         let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; | 
| //         props.push({text: '__idxInPipeline/total', value: val}); | 
| //     } else { | 
| //         let stubCount = 0; | 
| //         task.agentStubMap.each(() => stubCount++); | 
| //         props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); | 
| //     } | 
| //     props.push({text: 'uid', value: task.uidDebug}); | 
| //     if (task.__pipeline) { | 
| //         props.push({text: 'pipelineId', value: task.__pipeline.id}); | 
| //         task.agent && props.push( | 
| //             {text: 'stubFor', value: task.agent.uidDebug} | 
| //         ); | 
| //     } | 
| //     props.push( | 
| //         {text: 'dirty', value: task._dirty}, | 
| //         {text: 'dueIndex', value: task._dueIndex}, | 
| //         {text: 'dueEnd', value: task._dueEnd}, | 
| //         {text: 'outputDueEnd', value: task._outputDueEnd} | 
| //     ); | 
| //     if (extra) { | 
| //         Object.keys(extra).forEach(key => { | 
| //             props.push({text: key, value: extra[key]}); | 
| //         }); | 
| //     } | 
| //     let args = ['color: blue']; | 
| //     let msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( | 
| //         args.push('color: green', 'color: red'), | 
| //         `${item.text}: %c${item.value}` | 
| //     )).join('%c, '); | 
| //     console.log.apply(console, [msg].concat(args)); | 
| //     // console.log(this); | 
| // }; | 
| // window.printPipeline = function (task: any, prefix: string) { | 
| //     const pipeline = task.__pipeline; | 
| //     let currTask = pipeline.head; | 
| //     while (currTask) { | 
| //         window.printTask(currTask, prefix); | 
| //         currTask = currTask._downstream; | 
| //     } | 
| // }; | 
| // window.showChain = function (chainHeadTask) { | 
| //     var chain = []; | 
| //     var task = chainHeadTask; | 
| //     while (task) { | 
| //         chain.push({ | 
| //             task: task, | 
| //             up: task._upstream, | 
| //             down: task._downstream, | 
| //             idxInPipeline: task.__idxInPipeline | 
| //         }); | 
| //         task = task._downstream; | 
| //     } | 
| //     return chain; | 
| // }; | 
| // window.findTaskInChain = function (task, chainHeadTask) { | 
| //     let chain = window.showChain(chainHeadTask); | 
| //     let result = []; | 
| //     for (let i = 0; i < chain.length; i++) { | 
| //         let chainItem = chain[i]; | 
| //         if (chainItem.task === task) { | 
| //             result.push(i); | 
| //         } | 
| //     } | 
| //     return result; | 
| // }; | 
| // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) { | 
| //     let chainA = window.showChain(chainHeadTaskA); | 
| //     for (let i = 0; i < chainA.length; i++) { | 
| //         console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB)); | 
| //     } | 
| // }; |