β¬ οΈ Back to Table of Contents
π filters¶
π Analysis Summary¶
| Metric | Count |
|---|---|
| π§ Functions | 16 |
| π¦ Imports | 15 |
| β‘ Async/Await Patterns | 4 |
| π Interfaces | 6 |
| π Type Aliases | 3 |
π Table of Contents¶
π οΈ File Location:¶
π packages/shared/utils/filters.ts
π¦ Imports¶
| Name | Source |
|---|---|
MaybeRefOrGetter |
vue |
Ref |
vue |
AnyFn |
./types |
ArgumentsType |
./types |
Awaited |
./types |
Pausable |
./types |
Promisify |
./types |
PromisifyFn |
./types |
TimerHandle |
./types |
isRef |
vue |
shallowReadonly |
vue |
shallowRef |
vue |
toValue |
vue |
toRef |
../toRef |
noop |
./is |
Async/Await Patterns¶
| Type | Function | Await Expressions | Promise Chains |
|---|---|---|---|
| promise-chain | wrapper |
none | new Promise(...), Promise.resolve(filter(() => fn.apply(this, args), { fn, th... |
| promise-chain | debounceFilter |
none | Promise.resolve, new Promise(...) |
| promise-chain | handler |
none | Promise.resolve, new Promise(...) |
| promise-chain | filter |
none | new Promise(...) |
Functions¶
createFilterWrapper(filter: CancelableEventFilter, fn: T): CancelablePromisifyFn<T>¶
Tags: @internal
Code
bypassFilter(invoke: AnyFn): any¶
Parameters:
invokeAnyFn
Returns: any
Calls:
invoke
debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFilterOptions): CancelableEventFilter¶
Create an EventFilter that debounce the events
Calls:
shallowRef (from vue)clearTimeoutlastRejectortoValue (from vue)_clearTimeoutPromise.resolveinvokesetTimeoutresolvelastInvokerObject.assignshallowReadonly (from vue)
Internal Comments:
// Create the maxTimer. Clears the regular timer on invoke
// Create the regular timer. Clears the max timer on invoke (x3)
// Use native clearTimeout (not _clearTimeout) to avoid
// calling lastRejector β we resolve via lastResolve instead
Code
export function debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFilterOptions = {}): CancelableEventFilter {
let timer: TimerHandle
let maxTimer: TimerHandle
let lastRejector: AnyFn = noop
let lastResolve: AnyFn = noop
const _pending = shallowRef(false)
const _clearTimeout = (timer: TimerHandle) => {
clearTimeout(timer)
lastRejector()
lastRejector = noop
}
let lastInvoker: () => void
const handler = (invoke: AnyFn) => {
const duration = toValue(ms)
const maxDuration = toValue(options.maxWait)
if (timer)
_clearTimeout(timer)
if (duration <= 0 || (maxDuration !== undefined && maxDuration <= 0)) {
if (maxTimer) {
_clearTimeout(maxTimer)
maxTimer = undefined
}
_pending.value = false
return Promise.resolve(invoke())
}
_pending.value = true
return new Promise((resolve, reject) => {
lastRejector = options.rejectOnCancel ? reject : resolve
lastResolve = resolve
lastInvoker = invoke
// Create the maxTimer. Clears the regular timer on invoke
if (maxDuration && !maxTimer) {
maxTimer = setTimeout(() => {
if (timer)
_clearTimeout(timer)
maxTimer = undefined
_pending.value = false
resolve(lastInvoker())
}, maxDuration)
}
// Create the regular timer. Clears the max timer on invoke
timer = setTimeout(() => {
if (maxTimer)
_clearTimeout(maxTimer)
maxTimer = undefined
_pending.value = false
resolve(invoke())
}, duration)
})
}
const filter: CancelableEventFilter = Object.assign(handler, {
cancel: () => {
if (timer) {
_clearTimeout(timer)
timer = undefined
}
if (maxTimer) {
_clearTimeout(maxTimer)
maxTimer = undefined
}
_pending.value = false
lastResolve = noop
},
flush: () => {
if (_pending.value) {
// Use native clearTimeout (not _clearTimeout) to avoid
// calling lastRejector β we resolve via lastResolve instead
if (timer) {
clearTimeout(timer)
timer = undefined
}
if (maxTimer) {
clearTimeout(maxTimer)
maxTimer = undefined
}
_pending.value = false
const resolve = lastResolve
lastRejector = noop
lastResolve = noop
resolve(lastInvoker())
}
},
isPending: shallowReadonly(_pending),
})
return filter
}
throttleFilter(ms: MaybeRefOrGetter<number>, trailing: boolean, leading: boolean, rejectOnCancel: boolean): EventFilter¶
Create an EventFilter that throttle the events
Code
pausableFilter(extendFilter: EventFilter, options: PausableFilterOptions): Pausable & { eventFilter: EventFilter }¶
EventFilter that gives extra controls to pause and resume the filter
Parameters:
extendFilterany: Extra filter to apply when the PausableFilter is active, default to noneoptionsany: Options to configure the filter
Raw JSDoc
Calls:
toRef (from ../toRef)extendFiltershallowReadonly (from vue)
Code
export function pausableFilter(extendFilter: EventFilter = bypassFilter, options: PausableFilterOptions = {}): Pausable & { eventFilter: EventFilter } {
const {
initialState = 'active',
} = options
const isActive = toRef(initialState === 'active')
function pause() {
isActive.value = false
}
function resume() {
isActive.value = true
}
const eventFilter: EventFilter = (...args) => {
if (isActive.value)
extendFilter(...args)
}
return { isActive: shallowReadonly(isActive), pause, resume, eventFilter }
}
Internal helpers¶
Declared inside another function in this file.
wrapper(this: any, args: ArgumentsType<T>): Promise<Awaited<ReturnType<T>>>¶
Parameters:
thisanyargsArgumentsType<T>
Returns: Promise<Awaited<ReturnType<T>>>
Calls:
Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })) .then(resolve) .catch
Internal Comments:
Code
_clearTimeout(timer: TimerHandle): void¶
Parameters:
timerTimerHandle
Returns: void
Calls:
clearTimeoutlastRejector
handler(invoke: AnyFn): Promise<any>¶
Parameters:
invokeAnyFn
Returns: Promise<any>
Calls:
toValue (from vue)_clearTimeoutPromise.resolveinvokesetTimeoutresolvelastInvoker
Internal Comments:
// Create the maxTimer. Clears the regular timer on invoke
// Create the regular timer. Clears the max timer on invoke (x3)
Code
(invoke: AnyFn) => {
const duration = toValue(ms)
const maxDuration = toValue(options.maxWait)
if (timer)
_clearTimeout(timer)
if (duration <= 0 || (maxDuration !== undefined && maxDuration <= 0)) {
if (maxTimer) {
_clearTimeout(maxTimer)
maxTimer = undefined
}
_pending.value = false
return Promise.resolve(invoke())
}
_pending.value = true
return new Promise((resolve, reject) => {
lastRejector = options.rejectOnCancel ? reject : resolve
lastResolve = resolve
lastInvoker = invoke
// Create the maxTimer. Clears the regular timer on invoke
if (maxDuration && !maxTimer) {
maxTimer = setTimeout(() => {
if (timer)
_clearTimeout(timer)
maxTimer = undefined
_pending.value = false
resolve(lastInvoker())
}, maxDuration)
}
// Create the regular timer. Clears the max timer on invoke
timer = setTimeout(() => {
if (maxTimer)
_clearTimeout(maxTimer)
maxTimer = undefined
_pending.value = false
resolve(invoke())
}, duration)
})
}
cancel(): void¶
Returns: void
Calls:
_clearTimeout
Code
flush(): void¶
Returns: void
Calls:
clearTimeoutresolvelastInvoker
Internal Comments:
// Use native clearTimeout (not _clearTimeout) to avoid
// calling lastRejector β we resolve via lastResolve instead
Code
() => {
if (_pending.value) {
// Use native clearTimeout (not _clearTimeout) to avoid
// calling lastRejector β we resolve via lastResolve instead
if (timer) {
clearTimeout(timer)
timer = undefined
}
if (maxTimer) {
clearTimeout(maxTimer)
maxTimer = undefined
}
_pending.value = false
const resolve = lastResolve
lastRejector = noop
lastResolve = noop
resolve(lastInvoker())
}
}
clear(): void¶
Returns: void
Calls:
clearTimeoutlastRejector
Code
filter(_invoke: AnyFn): any¶
Parameters:
_invokeAnyFn
Returns: any
Calls:
toValue (from vue)Date.now_invokeclearinvokesetTimeoutresolveMath.max
Code
(_invoke) => {
const duration = toValue(ms)
const elapsed = Date.now() - lastExec
const invoke = () => {
return lastValue = _invoke()
}
clear()
if (duration <= 0) {
lastExec = Date.now()
return invoke()
}
if (elapsed > duration) {
lastExec = Date.now()
if (leading || !isLeading)
invoke()
}
else if (trailing) {
lastValue = new Promise((resolve, reject) => {
lastRejector = rejectOnCancel ? reject : resolve
timer = setTimeout(() => {
lastExec = Date.now()
isLeading = true
resolve(invoke())
clear()
}, Math.max(0, duration - elapsed))
})
}
if (!leading && !timer)
timer = setTimeout(() => isLeading = true, duration)
isLeading = false
return lastValue
}
invoke(): any¶
Returns: any
Calls:
_invoke
pause(): void¶
Returns: void
resume(): void¶
Returns: void
eventFilter(args: [invoke: AnyFn, options: FunctionWrappeβ¦): void¶
Parameters:
args[invoke: AnyFn, options: FunctionWrapperOptions<any[], any>]
Returns: void
Calls:
extendFilter
Interfaces¶
FunctionWrapperOptions<Args extends any[] = any[], This = any>¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
fn |
FunctionArgs<Args, This> |
β | not shown |
args |
Args |
β | not shown |
thisArg |
This |
β | not shown |
CancelableEventFilter<Args extends any[] = any[], This = any, Invoke extends AnyFn = AnyFn>¶
Interface Code
export interface CancelableEventFilter<Args extends any[] = any[], This = any, Invoke extends AnyFn = AnyFn> {
(invoke: Invoke, options: FunctionWrapperOptions<Args, This>): ReturnType<Invoke> | Promisify<ReturnType<Invoke>>
cancel: () => void
flush: () => void
readonly isPending: Readonly<Ref<boolean>>
}
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
cancel |
() => void |
β | not shown |
flush |
() => void |
β | not shown |
isPending |
Readonly<Ref<boolean>> |
β | not shown |
ConfigurableEventFilter¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
eventFilter |
EventFilter |
β | not shown |
DebounceFilterOptions¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
maxWait |
MaybeRefOrGetter<number> |
β | not shown |
rejectOnCancel |
boolean |
β | not shown |
ThrottleFilterOptions¶
Interface Code
export interface ThrottleFilterOptions {
/**
* The maximum time allowed to be delayed before it's invoked.
*/
delay: MaybeRefOrGetter<number>
/**
* Whether to invoke on the trailing edge of the timeout.
*/
trailing?: boolean
/**
* Whether to invoke on the leading edge of the timeout.
*/
leading?: boolean
/**
* Whether to reject the last call if it's been cancel.
*/
rejectOnCancel?: boolean
}
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
delay |
MaybeRefOrGetter<number> |
β | not shown |
trailing |
boolean |
β | not shown |
leading |
boolean |
β | not shown |
rejectOnCancel |
boolean |
β | not shown |
PausableFilterOptions¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
initialState |
'active' \| 'paused' |
β | not shown |
Type Aliases¶
FunctionArgs<Args extends any[] = any[], Return = unknown>¶
EventFilter<Args extends any[] = any[], This = any, Invoke extends AnyFn = AnyFn>¶
type EventFilter<Args extends any[] = any[], This = any, Invoke extends AnyFn = AnyFn> = (
invoke: Invoke,
options: FunctionWrapperOptions<Args, This>,
) => ReturnType<Invoke> | Promisify<ReturnType<Invoke>>;
CancelablePromisifyFn<T extends AnyFn>¶
type CancelablePromisifyFn<T extends AnyFn> = PromisifyFn<T> & {
cancel: () => void
flush: () => void
readonly isPending: Readonly<Ref<boolean>>
};
Generated by Syntax Scribe