| 
/* 
 | 
* 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 { __extends } from "tslib"; 
 | 
import * as numberUtil from '../util/number.js'; 
 | 
import * as formatUtil from '../util/format.js'; 
 | 
import Scale from './Scale.js'; 
 | 
import * as helper from './helper.js'; 
 | 
var roundNumber = numberUtil.round; 
 | 
var IntervalScale = /** @class */function (_super) { 
 | 
  __extends(IntervalScale, _super); 
 | 
  function IntervalScale() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = 'interval'; 
 | 
    // Step is calculated in adjustExtent. 
 | 
    _this._interval = 0; 
 | 
    _this._intervalPrecision = 2; 
 | 
    return _this; 
 | 
  } 
 | 
  IntervalScale.prototype.parse = function (val) { 
 | 
    return val; 
 | 
  }; 
 | 
  IntervalScale.prototype.contain = function (val) { 
 | 
    return helper.contain(val, this._extent); 
 | 
  }; 
 | 
  IntervalScale.prototype.normalize = function (val) { 
 | 
    return helper.normalize(val, this._extent); 
 | 
  }; 
 | 
  IntervalScale.prototype.scale = function (val) { 
 | 
    return helper.scale(val, this._extent); 
 | 
  }; 
 | 
  IntervalScale.prototype.setExtent = function (start, end) { 
 | 
    var thisExtent = this._extent; 
 | 
    // start,end may be a Number like '25',so... 
 | 
    if (!isNaN(start)) { 
 | 
      thisExtent[0] = parseFloat(start); 
 | 
    } 
 | 
    if (!isNaN(end)) { 
 | 
      thisExtent[1] = parseFloat(end); 
 | 
    } 
 | 
  }; 
 | 
  IntervalScale.prototype.unionExtent = function (other) { 
 | 
    var extent = this._extent; 
 | 
    other[0] < extent[0] && (extent[0] = other[0]); 
 | 
    other[1] > extent[1] && (extent[1] = other[1]); 
 | 
    // unionExtent may called by it's sub classes 
 | 
    this.setExtent(extent[0], extent[1]); 
 | 
  }; 
 | 
  IntervalScale.prototype.getInterval = function () { 
 | 
    return this._interval; 
 | 
  }; 
 | 
  IntervalScale.prototype.setInterval = function (interval) { 
 | 
    this._interval = interval; 
 | 
    // Dropped auto calculated niceExtent and use user-set extent. 
 | 
    // We assume user wants to set both interval, min, max to get a better result. 
 | 
    this._niceExtent = this._extent.slice(); 
 | 
    this._intervalPrecision = helper.getIntervalPrecision(interval); 
 | 
  }; 
 | 
  /** 
 | 
   * @param expandToNicedExtent Whether expand the ticks to niced extent. 
 | 
   */ 
 | 
  IntervalScale.prototype.getTicks = function (expandToNicedExtent) { 
 | 
    var interval = this._interval; 
 | 
    var extent = this._extent; 
 | 
    var niceTickExtent = this._niceExtent; 
 | 
    var intervalPrecision = this._intervalPrecision; 
 | 
    var ticks = []; 
 | 
    // If interval is 0, return []; 
 | 
    if (!interval) { 
 | 
      return ticks; 
 | 
    } 
 | 
    // Consider this case: using dataZoom toolbox, zoom and zoom. 
 | 
    var safeLimit = 10000; 
 | 
    if (extent[0] < niceTickExtent[0]) { 
 | 
      if (expandToNicedExtent) { 
 | 
        ticks.push({ 
 | 
          value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) 
 | 
        }); 
 | 
      } else { 
 | 
        ticks.push({ 
 | 
          value: extent[0] 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    var tick = niceTickExtent[0]; 
 | 
    while (tick <= niceTickExtent[1]) { 
 | 
      ticks.push({ 
 | 
        value: tick 
 | 
      }); 
 | 
      // Avoid rounding error 
 | 
      tick = roundNumber(tick + interval, intervalPrecision); 
 | 
      if (tick === ticks[ticks.length - 1].value) { 
 | 
        // Consider out of safe float point, e.g., 
 | 
        // -3711126.9907707 + 2e-10 === -3711126.9907707 
 | 
        break; 
 | 
      } 
 | 
      if (ticks.length > safeLimit) { 
 | 
        return []; 
 | 
      } 
 | 
    } 
 | 
    // Consider this case: the last item of ticks is smaller 
 | 
    // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. 
 | 
    var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; 
 | 
    if (extent[1] > lastNiceTick) { 
 | 
      if (expandToNicedExtent) { 
 | 
        ticks.push({ 
 | 
          value: roundNumber(lastNiceTick + interval, intervalPrecision) 
 | 
        }); 
 | 
      } else { 
 | 
        ticks.push({ 
 | 
          value: extent[1] 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
    return ticks; 
 | 
  }; 
 | 
  IntervalScale.prototype.getMinorTicks = function (splitNumber) { 
 | 
    var ticks = this.getTicks(true); 
 | 
    var minorTicks = []; 
 | 
    var extent = this.getExtent(); 
 | 
    for (var i = 1; i < ticks.length; i++) { 
 | 
      var nextTick = ticks[i]; 
 | 
      var prevTick = ticks[i - 1]; 
 | 
      var count = 0; 
 | 
      var minorTicksGroup = []; 
 | 
      var interval = nextTick.value - prevTick.value; 
 | 
      var minorInterval = interval / splitNumber; 
 | 
      while (count < splitNumber - 1) { 
 | 
        var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval); 
 | 
        // For the first and last interval. The count may be less than splitNumber. 
 | 
        if (minorTick > extent[0] && minorTick < extent[1]) { 
 | 
          minorTicksGroup.push(minorTick); 
 | 
        } 
 | 
        count++; 
 | 
      } 
 | 
      minorTicks.push(minorTicksGroup); 
 | 
    } 
 | 
    return minorTicks; 
 | 
  }; 
 | 
  /** 
 | 
   * @param opt.precision If 'auto', use nice presision. 
 | 
   * @param opt.pad returns 1.50 but not 1.5 if precision is 2. 
 | 
   */ 
 | 
  IntervalScale.prototype.getLabel = function (data, opt) { 
 | 
    if (data == null) { 
 | 
      return ''; 
 | 
    } 
 | 
    var precision = opt && opt.precision; 
 | 
    if (precision == null) { 
 | 
      precision = numberUtil.getPrecision(data.value) || 0; 
 | 
    } else if (precision === 'auto') { 
 | 
      // Should be more precise then tick. 
 | 
      precision = this._intervalPrecision; 
 | 
    } 
 | 
    // (1) If `precision` is set, 12.005 should be display as '12.00500'. 
 | 
    // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. 
 | 
    var dataNum = roundNumber(data.value, precision, true); 
 | 
    return formatUtil.addCommas(dataNum); 
 | 
  }; 
 | 
  /** 
 | 
   * @param splitNumber By default `5`. 
 | 
   */ 
 | 
  IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) { 
 | 
    splitNumber = splitNumber || 5; 
 | 
    var extent = this._extent; 
 | 
    var span = extent[1] - extent[0]; 
 | 
    if (!isFinite(span)) { 
 | 
      return; 
 | 
    } 
 | 
    // User may set axis min 0 and data are all negative 
 | 
    // FIXME If it needs to reverse ? 
 | 
    if (span < 0) { 
 | 
      span = -span; 
 | 
      extent.reverse(); 
 | 
    } 
 | 
    var result = helper.intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); 
 | 
    this._intervalPrecision = result.intervalPrecision; 
 | 
    this._interval = result.interval; 
 | 
    this._niceExtent = result.niceTickExtent; 
 | 
  }; 
 | 
  IntervalScale.prototype.calcNiceExtent = function (opt) { 
 | 
    var extent = this._extent; 
 | 
    // If extent start and end are same, expand them 
 | 
    if (extent[0] === extent[1]) { 
 | 
      if (extent[0] !== 0) { 
 | 
        // Expand extent 
 | 
        // Note that extents can be both negative. See #13154 
 | 
        var expandSize = Math.abs(extent[0]); 
 | 
        // In the fowllowing case 
 | 
        //      Axis has been fixed max 100 
 | 
        //      Plus data are all 100 and axis extent are [100, 100]. 
 | 
        // Extend to the both side will cause expanded max is larger than fixed max. 
 | 
        // So only expand to the smaller side. 
 | 
        if (!opt.fixMax) { 
 | 
          extent[1] += expandSize / 2; 
 | 
          extent[0] -= expandSize / 2; 
 | 
        } else { 
 | 
          extent[0] -= expandSize / 2; 
 | 
        } 
 | 
      } else { 
 | 
        extent[1] = 1; 
 | 
      } 
 | 
    } 
 | 
    var span = extent[1] - extent[0]; 
 | 
    // If there are no data and extent are [Infinity, -Infinity] 
 | 
    if (!isFinite(span)) { 
 | 
      extent[0] = 0; 
 | 
      extent[1] = 1; 
 | 
    } 
 | 
    this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); 
 | 
    // let extent = this._extent; 
 | 
    var interval = this._interval; 
 | 
    if (!opt.fixMin) { 
 | 
      extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); 
 | 
    } 
 | 
    if (!opt.fixMax) { 
 | 
      extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); 
 | 
    } 
 | 
  }; 
 | 
  IntervalScale.prototype.setNiceExtent = function (min, max) { 
 | 
    this._niceExtent = [min, max]; 
 | 
  }; 
 | 
  IntervalScale.type = 'interval'; 
 | 
  return IntervalScale; 
 | 
}(Scale); 
 | 
Scale.registerClass(IntervalScale); 
 | 
export default IntervalScale; 
 |