|   | 
| /* | 
| * 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. | 
| */ | 
| /** | 
|  * Link lists and struct (graph or tree) | 
|  */ | 
| import { curry, each, assert, extend, map, keys } from 'zrender/lib/core/util.js'; | 
| import { makeInner } from '../../util/model.js'; | 
| var inner = makeInner(); | 
| function linkSeriesData(opt) { | 
|   var mainData = opt.mainData; | 
|   var datas = opt.datas; | 
|   if (!datas) { | 
|     datas = { | 
|       main: mainData | 
|     }; | 
|     opt.datasAttr = { | 
|       main: 'data' | 
|     }; | 
|   } | 
|   opt.datas = opt.mainData = null; | 
|   linkAll(mainData, datas, opt); | 
|   // Porxy data original methods. | 
|   each(datas, function (data) { | 
|     each(mainData.TRANSFERABLE_METHODS, function (methodName) { | 
|       data.wrapMethod(methodName, curry(transferInjection, opt)); | 
|     }); | 
|   }); | 
|   // Beyond transfer, additional features should be added to `cloneShallow`. | 
|   mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); | 
|   // Only mainData trigger change, because struct.update may trigger | 
|   // another changable methods, which may bring about dead lock. | 
|   each(mainData.CHANGABLE_METHODS, function (methodName) { | 
|     mainData.wrapMethod(methodName, curry(changeInjection, opt)); | 
|   }); | 
|   // Make sure datas contains mainData. | 
|   assert(datas[mainData.dataType] === mainData); | 
| } | 
| function transferInjection(opt, res) { | 
|   if (isMainData(this)) { | 
|     // Transfer datas to new main data. | 
|     var datas = extend({}, inner(this).datas); | 
|     datas[this.dataType] = res; | 
|     linkAll(res, datas, opt); | 
|   } else { | 
|     // Modify the reference in main data to point newData. | 
|     linkSingle(res, this.dataType, inner(this).mainData, opt); | 
|   } | 
|   return res; | 
| } | 
| function changeInjection(opt, res) { | 
|   opt.struct && opt.struct.update(); | 
|   return res; | 
| } | 
| function cloneShallowInjection(opt, res) { | 
|   // cloneShallow, which brings about some fragilities, may be inappropriate | 
|   // to be exposed as an API. So for implementation simplicity we can make | 
|   // the restriction that cloneShallow of not-mainData should not be invoked | 
|   // outside, but only be invoked here. | 
|   each(inner(res).datas, function (data, dataType) { | 
|     data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); | 
|   }); | 
|   return res; | 
| } | 
| /** | 
|  * Supplement method to List. | 
|  * | 
|  * @public | 
|  * @param [dataType] If not specified, return mainData. | 
|  */ | 
| function getLinkedData(dataType) { | 
|   var mainData = inner(this).mainData; | 
|   return dataType == null || mainData == null ? mainData : inner(mainData).datas[dataType]; | 
| } | 
| /** | 
|  * Get list of all linked data | 
|  */ | 
| function getLinkedDataAll() { | 
|   var mainData = inner(this).mainData; | 
|   return mainData == null ? [{ | 
|     data: mainData | 
|   }] : map(keys(inner(mainData).datas), function (type) { | 
|     return { | 
|       type: type, | 
|       data: inner(mainData).datas[type] | 
|     }; | 
|   }); | 
| } | 
| function isMainData(data) { | 
|   return inner(data).mainData === data; | 
| } | 
| function linkAll(mainData, datas, opt) { | 
|   inner(mainData).datas = {}; | 
|   each(datas, function (data, dataType) { | 
|     linkSingle(data, dataType, mainData, opt); | 
|   }); | 
| } | 
| function linkSingle(data, dataType, mainData, opt) { | 
|   inner(mainData).datas[dataType] = data; | 
|   inner(data).mainData = mainData; | 
|   data.dataType = dataType; | 
|   if (opt.struct) { | 
|     data[opt.structAttr] = opt.struct; | 
|     opt.struct[opt.datasAttr[dataType]] = data; | 
|   } | 
|   // Supplement method. | 
|   data.getLinkedData = getLinkedData; | 
|   data.getLinkedDataAll = getLinkedDataAll; | 
| } | 
| export default linkSeriesData; |