| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
var ORIGIN_METHOD = '\0__throttleOriginMethod'; 
 | 
var RATE = '\0__throttleRate'; 
 | 
var THROTTLE_TYPE = '\0__throttleType'; 
 | 
; 
 | 
/** 
 | 
 * @public 
 | 
 * @param {(Function)} fn 
 | 
 * @param {number} [delay=0] Unit: ms. 
 | 
 * @param {boolean} [debounce=false] 
 | 
 *        true: If call interval less than `delay`, only the last call works. 
 | 
 *        false: If call interval less than `delay, call works on fixed rate. 
 | 
 * @return {(Function)} throttled fn. 
 | 
 */ 
 | 
export function throttle(fn, delay, debounce) { 
 | 
  var currCall; 
 | 
  var lastCall = 0; 
 | 
  var lastExec = 0; 
 | 
  var timer = null; 
 | 
  var diff; 
 | 
  var scope; 
 | 
  var args; 
 | 
  var debounceNextCall; 
 | 
  delay = delay || 0; 
 | 
  function exec() { 
 | 
    lastExec = new Date().getTime(); 
 | 
    timer = null; 
 | 
    fn.apply(scope, args || []); 
 | 
  } 
 | 
  var cb = function () { 
 | 
    var cbArgs = []; 
 | 
    for (var _i = 0; _i < arguments.length; _i++) { 
 | 
      cbArgs[_i] = arguments[_i]; 
 | 
    } 
 | 
    currCall = new Date().getTime(); 
 | 
    scope = this; 
 | 
    args = cbArgs; 
 | 
    var thisDelay = debounceNextCall || delay; 
 | 
    var thisDebounce = debounceNextCall || debounce; 
 | 
    debounceNextCall = null; 
 | 
    diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; 
 | 
    clearTimeout(timer); 
 | 
    // Here we should make sure that: the `exec` SHOULD NOT be called later 
 | 
    // than a new call of `cb`, that is, preserving the command order. Consider 
 | 
    // calculating "scale rate" when roaming as an example. When a call of `cb` 
 | 
    // happens, either the `exec` is called dierectly, or the call is delayed. 
 | 
    // But the delayed call should never be later than next call of `cb`. Under 
 | 
    // this assurance, we can simply update view state each time `dispatchAction` 
 | 
    // triggered by user roaming, but not need to add extra code to avoid the 
 | 
    // state being "rolled-back". 
 | 
    if (thisDebounce) { 
 | 
      timer = setTimeout(exec, thisDelay); 
 | 
    } else { 
 | 
      if (diff >= 0) { 
 | 
        exec(); 
 | 
      } else { 
 | 
        timer = setTimeout(exec, -diff); 
 | 
      } 
 | 
    } 
 | 
    lastCall = currCall; 
 | 
  }; 
 | 
  /** 
 | 
   * Clear throttle. 
 | 
   * @public 
 | 
   */ 
 | 
  cb.clear = function () { 
 | 
    if (timer) { 
 | 
      clearTimeout(timer); 
 | 
      timer = null; 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * Enable debounce once. 
 | 
   */ 
 | 
  cb.debounceNextCall = function (debounceDelay) { 
 | 
    debounceNextCall = debounceDelay; 
 | 
  }; 
 | 
  return cb; 
 | 
} 
 | 
/** 
 | 
 * Create throttle method or update throttle rate. 
 | 
 * 
 | 
 * @example 
 | 
 * ComponentView.prototype.render = function () { 
 | 
 *     ... 
 | 
 *     throttle.createOrUpdate( 
 | 
 *         this, 
 | 
 *         '_dispatchAction', 
 | 
 *         this.model.get('throttle'), 
 | 
 *         'fixRate' 
 | 
 *     ); 
 | 
 * }; 
 | 
 * ComponentView.prototype.remove = function () { 
 | 
 *     throttle.clear(this, '_dispatchAction'); 
 | 
 * }; 
 | 
 * ComponentView.prototype.dispose = function () { 
 | 
 *     throttle.clear(this, '_dispatchAction'); 
 | 
 * }; 
 | 
 * 
 | 
 */ 
 | 
export function createOrUpdate(obj, fnAttr, rate, throttleType) { 
 | 
  var fn = obj[fnAttr]; 
 | 
  if (!fn) { 
 | 
    return; 
 | 
  } 
 | 
  var originFn = fn[ORIGIN_METHOD] || fn; 
 | 
  var lastThrottleType = fn[THROTTLE_TYPE]; 
 | 
  var lastRate = fn[RATE]; 
 | 
  if (lastRate !== rate || lastThrottleType !== throttleType) { 
 | 
    if (rate == null || !throttleType) { 
 | 
      return obj[fnAttr] = originFn; 
 | 
    } 
 | 
    fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); 
 | 
    fn[ORIGIN_METHOD] = originFn; 
 | 
    fn[THROTTLE_TYPE] = throttleType; 
 | 
    fn[RATE] = rate; 
 | 
  } 
 | 
  return fn; 
 | 
} 
 | 
/** 
 | 
 * Clear throttle. Example see throttle.createOrUpdate. 
 | 
 */ 
 | 
export function clear(obj, fnAttr) { 
 | 
  var fn = obj[fnAttr]; 
 | 
  if (fn && fn[ORIGIN_METHOD]) { 
 | 
    // Clear throttle 
 | 
    fn.clear && fn.clear(); 
 | 
    obj[fnAttr] = fn[ORIGIN_METHOD]; 
 | 
  } 
 | 
} 
 |