# @github/mini-throttle

> This is a package which provides `throttle` and `debounce` functions, with both flow and TypeScript declarations, and a minimal code footprint (less than 60 lines, less than 350 bytes minified+gzipped)

Latest version **2.1.1** (published 2023-08-08) · MIT license · 0 weekly downloads

## Install

```sh
npm install @github/mini-throttle
pnpm add @github/mini-throttle
yarn add @github/mini-throttle
bun add @github/mini-throttle
```

## Health

**Score 45/100 (D)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high maintenance score; high quality score.

Warnings: low downloads.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 2.1.1 |
| Published | 2023-08-08 |
| First published | 2019-05-22 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 14.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 229 |
| Author | GitHub Inc. |
| Maintainers | andrialexandrou, jfuchs, githubbot, manuelpuyol, jonrohan, broccolini, mislav, mdo, primer-css, keithamus, mschoening, koddsson, emilybrick, lgarron, colebemis, smockle, simurai, khiga8, dustin.greif, srt32 |

## Links

- npm: https://www.npmjs.com/package/@github/mini-throttle
- Repository: https://github.com/github/mini-throttle
- Homepage: https://github.com/github/mini-throttle#readme
- Issues: https://github.com/github/mini-throttle/issues
- npm.io page: https://npm.io/package/@github/mini-throttle

## Recent versions

- 2.1.1 (latest) — 2023-08-08
- 2.1.0 — 2021-02-23
- 2.0.1 — 2020-03-24
- 2.0.0 — 2020-03-24
- 1.0.7 — 2019-11-05
- 1.0.5 — 2019-08-06
- 1.0.4 — 2019-08-06
- 1.0.3 — 2019-06-07
- 1.0.1 — 2019-05-22
- 1.0.0 — 2019-05-22

## README

# mini-throttle

This is a package which provides `throttle` and `debounce` functions, with both
flow and TypeScript declarations, and a minimal code footprint (less than 60
lines, less than 350 bytes minified+gzipped)


### throttling, debouncing, and everything inbetween

```js
type ThrottleOptions = {
  start?: boolean, // fire immediately on the first call
  middle?: boolean, // if true, fire as soon as `wait` has passed
  once?: boolean, // cancel after the first successful call
}
function throttle<T>(
  callback: (...args: T[]) => any,
  wait: number,
  opts?: ThrottleOptions
): (...args: T[]) => void

function debounce<T>(
  callback: (...args: T[]) => any,
  wait: number,
  opts?: ThrottleOptions
): (...args: T[]) => void
```

This package comes with two functions; `throttle` and `debounce`.

Both of these functions offer the exact same signature, because they're both
the same function - just with different `opts` defaults:

 - `throttle` opts default to `{ start: true, middle: true, once: false }`.
 - `debounce` opts default to `{ start: false, middle: false, once: false }`.

Each of the options changes when `callback` gets called. The best way to
illustrate this is with a marble diagram.

```js
for (let i = 1; i <= 10; ++i) {
  fn(i)
  await delay(50)
}
await delay(100)
```
```
| fn()                                         | 1 2 3 4 5 6 7 8 9 10 |
| throttle(fn, 100)                            | 1 2   4   6   8   10 |
| throttle(fn, 100, {start: false})            |   2   4   6   8   10 |
| throttle(fn, 100, {middle: false})           | 1                 10 |
| throttle(fn, 100, {once: true})              | 1                    |
| throttle(fn, 100, {once: true, start: false})|   2                  |
| debounce(fn, 100)                            |                   10 |
```

### TypeScript Decorators Support!

This package also includes a decorator module which can be used to provide [TypeScript Decorator](https://www.typescriptlang.org/docs/handbook/decorators.html#decorators) annotations to functions.

Here's an example, showing what you need to do:

```typescript
import {throttle} from '@github/mini-throttle/decorators'
//                                           ^ note: add `/decorators` to the import to get decorators

class MyClass {
  @throttle(100, { start: false }) // <- Just like normal throttle, but you omit the callback argument
  doThings() {
    // `MyClass.prototype.doThings` will be throttled!
  }
}
```

---
_Source: https://npm.io/package/@github/mini-throttle · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
