0.1.2 • Published 5 years ago

define-args v0.1.2

Weekly downloads
4
License
CC0-1.0
Repository
github
Last release
5 years ago

define-args

NPM Version Build Status Support Chat

define-args lets you bind arguments to a function to create another function of smaller arity.

It is similar to bind, with the exception that args will not bind context.

Browser Usage

Add define-args to your document:

<script src="https://unpkg.com/define-args"></script><!-- 311 bytes -->

Alternatively, import the browser module script:

import defineArgs from 'https://unpkg.com/define-args/browser.mjs' // 314 bytes

Use define-args to enable args() on any function:

<script>
// creates a function that adds two numbers and supports args()
var addTwoNumbers = defineArgs(function (a, b) { return a + b })

// returns 5, because the arguments are 2 and 3
addTwoNumbers(2, 3) 

// creates an argument-bound function with args(1)
var addOneNumber = defineArgs(addTwoNumbers).args(1)

// returns 3, because the arguments are 1, 2, and 3
addOneNumber(2, 3)
</script>

Use define-args to extend classes:

<script>
// creates a class that stores a number and supports args()
var StoredNumber = defineArgs(function (number) { this.number = number })

// creates a new StoredNumber, where its "number" is 5
var someStoredNumber = new StoredNumber(5)

// creates an argument-bound class with args(1)
var StoredOne = StoredNumber.args(1)

// creates a new StoredOne, where its "number" is already 1 (and 5 is ignored)
var anotherStoredNumber = new SomeOneNumber(5)

// extends StoredNumber (and StoredOne) with "and"
SomeNumber.prototype.and = function (number) { return this.number + number }

// returns 10, because its "number" is 5 and the argument is 5
someStoredNumber.and(5)

// returns 6, because its "number" is 1 and the argument is 5
anotherStoredNumber.and(5)
</script>

The browser script works in all modern browsers, including Internet Explorer 9+.


Node Usage

Add define-args to your project:

npm install define-args

Use define-args to extend functions:

const defineArgs = require('define-args') // 403 bytes

Alternatively, import the module script:

import defineArgs from 'define-args' // 401 bytes

Both Node scripts work in Node 8+.


Example Usage: React Component

import defineArgs from 'https://unpkg.com/define-args/browser.mjs'

function BoundComponent () {
  const { constructor } = this

  // bind all prototype functions and allow them to predefine arguments
  Object.getOwnPropertyNames(constructor.prototype).forEach(
    name => this[name] !== constructor && typeof this[name] === 'function'
      ? this[name] = defineArgs(this[name].bind(this))
    : null
  )
} BoundComponent.prototype.isReactComponent = {}

class MyComponent extends BoundComponent {
  constructor () {
    super()

    this.state.items = [
      'Defeat Bowser',
      'Save the Princess'
    ]
  }

  remove (index) {
    const prevItems = this.state.items
    const nextItems = prevItems.slice().splice(index, 1)

    this.setState({ items: nextItems })
  }

  render () {
    return (
      <ul>
        this.state.items.map(
          (item, index) => (
            <li key={index}>
              <span>{item}</span>
              <button onClick={this.remove.args(index)}>remove</button>
            </li>
          )
        )
      </ul>
    )
  }
}