/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */ /** Used as the `TypeError` message for "Functions" methods. */ var FUNC_ERROR_TEXT = 'Expected a function' ; /** Used as references for various `Number` constants. */ var NAN = 0 / 0 ; /** `Object#toString` result references. */ var symbolTag = '[object Symbol]' ; /** Used to match leading and trailing whitespace. */ var reTrim = /^\s+|\s+$/g ; /** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i ; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i ; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i ; /** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt ; /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global . Object === Object && global ; /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self . Object === Object && self ; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function ( 'return this' ) ( ) ; /** Used for built-in method references. */ var objectProto = Object . prototype ; /**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */ var objectToString = objectProto . toString ; var nativeMax = Math . max , nativeMin = Math . min ; static memberOf since category returns { number } example var now = function ( ) { return Date . now ( ) ; } ; static memberOf since category param { Function } func param { number } wait param options param { boolean } options . leading param { number } options . maxWait param { boolean } options . trailing returns { Function } example function debounce ( func , wait , options ) { var lastArgs , lastThis , maxWait , result , timerId , lastCallTime , lastInvokeTime = 0 , leading = false , maxing = false , trailing = true ; if ( typeof func != 'function' ) { throw new TypeError ( FUNC_ERROR_TEXT ) ; } wait = toNumber ( wait ) || 0 ; if ( isObject ( options ) ) { leading = ! ! options . leading ; maxing = 'maxWait' in options ; maxWait = maxing ? nativeMax ( toNumber ( options . maxWait ) || 0 , wait ) : maxWait ; trailing = 'trailing' in options ? ! ! options . trailing : trailing ; } function invokeFunc ( time ) { var args = lastArgs , thisArg = lastThis ; lastArgs = lastThis = undefined ; lastInvokeTime = time ; result = func . apply ( thisArg , args ) ; return result ; } function leadingEdge ( time ) { lastInvokeTime = time ; timerId = setTimeout ( timerExpired , wait ) ; return leading ? invokeFunc ( time ) : result ; } function remainingWait ( time ) { var timeSinceLastCall = time - lastCallTime , timeSinceLastInvoke = time - lastInvokeTime , result = wait - timeSinceLastCall ; return maxing ? nativeMin ( result , maxWait - timeSinceLastInvoke ) : result ; } function shouldInvoke ( time ) { var timeSinceLastCall = time - lastCallTime , timeSinceLastInvoke = time - lastInvokeTime ; return ( lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || ( maxing && timeSinceLastInvoke >= maxWait ) ) ; } function timerExpired ( ) { var time = now ( ) ; if ( shouldInvoke ( time ) ) { return trailingEdge ( time ) ; } timerId = setTimeout ( timerExpired , remainingWait ( time ) ) ; } function trailingEdge ( time ) { timerId = undefined ; if ( trailing && lastArgs ) { return invokeFunc ( time ) ; } lastArgs = lastThis = undefined ; return result ; } function cancel ( ) { if ( timerId !== undefined ) { clearTimeout ( timerId ) ; } lastInvokeTime = 0 ; lastArgs = lastCallTime = lastThis = timerId = undefined ; } function flush ( ) { return timerId === undefined ? result : trailingEdge ( now ( ) ) ; } function debounced ( ) { var time = now ( ) , isInvoking = shouldInvoke ( time ) ; lastArgs = arguments ; lastThis = this ; lastCallTime = time ; if ( isInvoking ) { if ( timerId === undefined ) { return leadingEdge ( lastCallTime ) ; } if ( maxing ) { timerId = setTimeout ( timerExpired , wait ) ; return invokeFunc ( lastCallTime ) ; } } if ( timerId === undefined ) { timerId = setTimeout ( timerExpired , wait ) ; } return result ; } debounced . cancel = cancel ; debounced . flush = flush ; return debounced ; } static memberOf since category param { Function } func param { number } wait param options param { boolean } options . leading param { boolean } options . trailing returns { Function } example function throttle ( func , wait , options ) { var leading = true , trailing = true ; if ( typeof func != 'function' ) { throw new TypeError ( FUNC_ERROR_TEXT ) ; } if ( isObject ( options ) ) { leading = 'leading' in options ? ! ! options . leading : leading ; trailing = 'trailing' in options ? ! ! options . trailing : trailing ; } return debounce ( func , wait , { leading : leading , maxWait : wait , trailing : trailing } ) ; } static memberOf since category param { * } value returns { boolean } example function isObject ( value ) { var type = typeof value ; return ! ! value && ( type == 'object' || type == 'function' ) ; } static memberOf since category param { * } value returns { boolean } example function isObjectLike ( value ) { return ! ! value && typeof value == 'object' ; } static memberOf since category param { * } value returns { boolean } example function isSymbol ( value ) { return ( typeof value == 'symbol' || ( isObjectLike ( value ) && objectToString . call ( value ) == symbolTag ) ) ; } static memberOf since category param { * } value returns { number } example function toNumber ( value ) { if ( typeof value == 'number' ) { return value ; } if ( isSymbol ( value ) ) { return NAN ; } if ( isObject ( value ) ) { var other = typeof value . valueOf == 'function' ? value . valueOf ( ) : value ; value = isObject ( other ) ? other + '' : other ; } if ( typeof value != 'string' ) { return value === 0 ? value : + value ; } value = value . replace ( reTrim , '' ) ; var isBinary = reIsBinary . test ( value ) ; return isBinary || reIsOctal . test ( value ) ? freeParseInt ( value . slice ( 2 ) , isBinary ? 2 : 8 ) : reIsBadHex . test ( value ) ? NAN : + value ; } module . exports = throttle ;