1.0.0 • Published 8 years ago

@f/curry-transparently v1.0.0

Weekly downloads
4
License
MIT
Repository
github
Last release
8 years ago

curry-transparently

Build status Git tag NPM version Code style

Curry functions, but expose their accumulated arguments and underlying function so that they can be meaningfully compared against one another

Installation

$ npm install @f/curry-transparently

Usage

const curry = require('@f/curry-transparently')

const curriedAdd = curry(add)
const add1 = add(1)
const add2 = add(2)

add1(3) === 4
add2(3) === 5

add1.$$fn === add
add1.$$args === [1]

add2.$$fn === add
add2.$$args === [2]

function add (a, b) {
  return a + b
}

Why?

Traditional currying mechanisms isolate the information about what has been curried and what the underlying function is inside of an opaque closure. This prevents you from directly comparing two curried functions to determine their equivalence. This can be problematic for things like virtual DOM diffing where event handlers are constantly being created which, even though they may contain identical arguments and call an identical underlying function, are considered unique values.

Here's a comparator function to decide where two transparently curried functions are equivalent:

var arrayEqual = require('@f/array-equal')

function compareFns (a, b) {
  return a.$$fn === b.$$fn && arrayEqual(a.$$args, b.$$args)
}

API

curryTransparently(fn, arity, args)

  • fn - The function you want to curry
  • arity - Optional, if not supplied fn.length will be used.
  • args - Optional. An initial set of arguments to start out with.

Returns: A curried representation of fn, complete with $$args and $$fn properties that can be used to inspect it.

License

MIT