View on GitHub

Decko

The 3 most useful ES7 decorators: bind, memoize and debounce

Download this project as a .zip file Download this project as a tar.gz file

decko NPM Version Build Status

A concise implementation of the three most useful decorators:

Decorators help simplify code by replacing the noise of common patterns with declarative annotations. Conversely, decorators can also be overused and create obscurity. Decko establishes 3 standard decorators that are immediately recognizable, so you can avoid creating decorators in your own codebase.

Note: Decorators work by default with Babel 5.x.

For Babel 6+, install transform-decorators-legacy.

Installation

Available on npm:

npm i -S decko

Usage

Each decorator method is available as a named import.

import { bind, memoize, debounce } from 'decko';

@bind

class Example {
    @bind
    foo() {
        // the value of `this` is always the object from which foo() was referenced.
        return this;
    }
}

let e = new Example();
assert.equal(e.foo(), e);

@memoize

Cache values returned from the decorated function. Uses the first argument as a cache key. Cache keys are always converted to strings.

Options:

caseSensitive: false - Makes cache keys case-insensitive

cache: {} - Presupply cache storage, for seeding or sharing entries

class Example {
    @memoize
    expensive(key) {
        let start = Date.now();
        while (Date.now()-start < 500) key++;
        return key;
    }
}

let e = new Example();

// this takes 500ms
let one = e.expensive(1);

// this takes 0ms
let two = e.expensive(1);

// this takes 500ms
let three = e.expensive(2);

@debounce

Throttle calls to the decorated function. To debounce means "call this at most once per N ms". All outward function calls get collated into a single inward call, and only the latest (most recent) arguments as passed on to the debounced function.

Options:

delay: 0 - The number of milliseconds to buffer calls for.

class Example {
    @debounce
    foo() {
        return this;
    }
}

let e = new Example();

// this will only call foo() once:
for (let i=1000; i--) e.foo();

License

MIT