Skip to content

thisables/curry

Repository files navigation

curry

Build Status Coverage Status npm version Dependency Status API-style

Currying made simple.

– and we really mean simple:

import {curry, _} from '@thisables/curry';


// Got a simple function?

const plus = (
	(a, b, c) => a + b + c
)::curry();

plus(1, 2, 3);  //» 6
plus(1)(2, 3);  //» 6
plus(1, 2)(3);  //» 6
plus(1)(2)(3);  //» 6


// Got a monster function?

const {open} = require('fs');
const newScript = open::curry(_, 'w', 0755, _);

newScript('do-wonders.sh', (error, file) => {
  // The `file` is ready.
});

Installation

npm install @thisables/curry

Usage

Basic usage

The function curry is invoked using the function bind syntax and returns a curried function.

const add = (a, b) => a + b;
const curriedAdd = add::curry();

curriedAdd(1)(2); //» 3

Placeholders

A placeholder _ is a special value, which you import from 'curry-this'. Placeholders are replaced from left to right, the next call after a placeholder is passed replaces the previous placeholders one by one.

const foo = (a, b, c, d) => [a, b, c, d];

const curriedFoo = foo::curry(_, _, _, 4);

curriedFoo(1)(2)(3); //» [1, 2, 3, 4]

If you pass a placeholder to curry the length of the function is ignored instead the initial call of curry defines the length of the curried function.

const foo = (...values) => values;

const curriedFoo = foo::curry(_, _, _);

curriedFoo(1)(2)(3); //» [1, 2, 3]

Arity

The curried function has a fixed arity. Additional arguments aren't passed.

const foo = (...values) => values;

const curriedFoo = foo::curry(_, _, _);

curriedFoo(1)(2)(3, 5, 6, 7); //» [1, 2, 3]

Not experimental usage

You can still use curry without the experimental syntax

const add = (a, b) => a + b;
const curriedAdd = curry.call(add);

curriedAdd(1)(2); //» 3

Or with placeholders

const foo = (...values) => values;

const curriedFoo = curry.call(foo, _, _, _);

curriedFoo(1)(2)(3); //» [1, 2, 3]

API

fn::curry(...args)

Parameters

fn the function to curry
args curried arguments or placeholders

Returns

A curried function.

:: huh?

If you’re wondering what the :: thing means, you’d better read this excellent overview by @jussi-kalliokoski or have a look at the function bind syntax proposal.

Maintainers

stoeffel tomekwi
stoeffel tomekwi

License

MIT © Christoph Hermann