| /* | 
 | * 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 * as zrUtil from 'zrender/src/core/util'; | 
 | import GlobalModel from '../../model/Global'; | 
 | import { Dictionary } from '../../util/types'; | 
 | import DataZoomModel from './DataZoomModel'; | 
 | import { makeInner } from '../../util/model'; | 
 | import { DataZoomPayloadBatchItem } from './helper'; | 
 |  | 
 | const each = zrUtil.each; | 
 |  | 
 | export type DataZoomStoreSnapshot = Dictionary<DataZoomPayloadBatchItem>; | 
 |  | 
 | type Store = { | 
 |     snapshots: DataZoomStoreSnapshot[] | 
 | }; | 
 |  | 
 | const inner = makeInner<Store, GlobalModel>(); | 
 |  | 
 | /** | 
 |  * @param ecModel | 
 |  * @param newSnapshot key is dataZoomId | 
 |  */ | 
 | export function push(ecModel: GlobalModel, newSnapshot: DataZoomStoreSnapshot) { | 
 |     const storedSnapshots = getStoreSnapshots(ecModel); | 
 |  | 
 |     // If previous dataZoom can not be found, | 
 |     // complete an range with current range. | 
 |     each(newSnapshot, function (batchItem, dataZoomId) { | 
 |         let i = storedSnapshots.length - 1; | 
 |         for (; i >= 0; i--) { | 
 |             const snapshot = storedSnapshots[i]; | 
 |             if (snapshot[dataZoomId]) { | 
 |                 break; | 
 |             } | 
 |         } | 
 |         if (i < 0) { | 
 |             // No origin range set, create one by current range. | 
 |             const dataZoomModel = ecModel.queryComponents( | 
 |                 {mainType: 'dataZoom', subType: 'select', id: dataZoomId} | 
 |             )[0] as DataZoomModel; | 
 |             if (dataZoomModel) { | 
 |                 const percentRange = dataZoomModel.getPercentRange(); | 
 |                 storedSnapshots[0][dataZoomId] = { | 
 |                     dataZoomId: dataZoomId, | 
 |                     start: percentRange[0], | 
 |                     end: percentRange[1] | 
 |                 }; | 
 |             } | 
 |         } | 
 |     }); | 
 |  | 
 |     storedSnapshots.push(newSnapshot); | 
 | } | 
 |  | 
 | export function pop(ecModel: GlobalModel) { | 
 |     const storedSnapshots = getStoreSnapshots(ecModel); | 
 |     const head = storedSnapshots[storedSnapshots.length - 1]; | 
 |     storedSnapshots.length > 1 && storedSnapshots.pop(); | 
 |  | 
 |     // Find top for all dataZoom. | 
 |     const snapshot: DataZoomStoreSnapshot = {}; | 
 |     each(head, function (batchItem, dataZoomId) { | 
 |         for (let i = storedSnapshots.length - 1; i >= 0; i--) { | 
 |             batchItem = storedSnapshots[i][dataZoomId]; | 
 |             if (batchItem) { | 
 |                 snapshot[dataZoomId] = batchItem; | 
 |                 break; | 
 |             } | 
 |         } | 
 |     }); | 
 |  | 
 |     return snapshot; | 
 | } | 
 |  | 
 | export function clear(ecModel: GlobalModel) { | 
 |     inner(ecModel).snapshots = null; | 
 | } | 
 |  | 
 | export function count(ecModel: GlobalModel) { | 
 |     return getStoreSnapshots(ecModel).length; | 
 | } | 
 |  | 
 | /** | 
 |  * History length of each dataZoom may be different. | 
 |  * this._history[0] is used to store origin range. | 
 |  */ | 
 | function getStoreSnapshots(ecModel: GlobalModel) { | 
 |     const store = inner(ecModel); | 
 |     if (!store.snapshots) { | 
 |         store.snapshots = [{}]; | 
 |     } | 
 |     return store.snapshots; | 
 | } |