![entrust](https://cdn.rawgit.com/brekk/entrust/88ecfa3/logo.svg)

> Delegatee-last curried functions for great justice

[![Greenkeeper badge](https://badges.greenkeeper.io/brekk/entrust.svg)](https://greenkeeper.io/)

You can use `entrust` to easily transform methods into a curried, delegatee-last (data-last) form. If you are used to functional programming (FP) paradigms, this makes FP in JS much easier.

Example:

```js
// native map looks like: array.map(fn)
// entrust map looks like: e1(`map`, fn, array)
import {e1} from 'entrust'
const map = e1(`map`) // this takes a function first, and then the data
map(x => x * 2, [1,2,3]) // [2,4,6]
```

Here's an example of how to apply the same approach to a tertiary function, like `reduce`:

```js
import {e2} from 'entrust'
// native reduce looks like: array.reduce(fn, initial)
const reduce = e2(`reduce`) // e2(`reduce`, fn, initial, array)
const sum = reduce((a, b) => a + b, 0)
sum([1,2,3]) // 6
sum([1,2,3,4]) // 10
sum([1,2,3,4,5]) // 15
```

_NB: This approach is used extensively in the `f-utility` module. You may want to take a look at it [here](https://www.npmjs.com/package/f-utility)._

`entrust` is built using `katsu-curry`'s `curry` implementation. However, if you would like to use a different curry implementation, this is easily accomplished using the [custom API](#custom). This specific technque is used to generate entrust's "debug-mode" export: `entrust/debug.js`.

# API

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

### Table of Contents

-   [custom](#custom)
-   [eN](#en)
-   [eD](#ed)
-   [e0](#e0)
-   [e1](#e1)
-   [e10](#e10)
-   [e2](#e2)
-   [e3](#e3)
-   [e4](#e4)
-   [e5](#e5)
-   [e6](#e6)
-   [e7](#e7)
-   [e8](#e8)
-   [e9](#e9)

## custom

generate a customized version of entrust's API

**Parameters**

-   `curry` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** a function which curries

**Examples**

```javascript
import {custom} from 'entrust'
import curry from 'lodash/fp/curry'
const {e0} = custom(curry)
```

Returns **[object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** raw+ an augmented version of the raw API

## eN

invoke a delegated method with arguments as an array. enforces specific arity

**Parameters**

-   `n` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 0 - 10
-   `method` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name on your delegatee
-   `args` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)** arguments to pass to your delegatee's method
-   `delegatee` **any** something with methods

**Examples**

```javascript
import {eN} from 'entrust'
eN(0, `toUpperCase`, [], `cool`) // `COOL`
eN(1, `map`, [(x) => x * 2], [1,2,3]) // [2,4,6]
eN(2, `reduce`, [(a, b) => (a + b), 0], [1,2,3]) // 6
```

Returns **any** the result of delegating to the method with some arguments

## eD

invoke a delegated method with arguments as an array. enforces specific arity
Yells at you if you give arguments that don't match the expected arity.

**Parameters**

-   `n` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 0 - 10
-   `method` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name on your delegatee
-   `args` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)** arguments to pass to your delegatee's method
-   `delegatee` **any** something with methods

**Examples**

```javascript
import {eD} from 'entrust'
eD(0, `toUpperCase`, [], `cool`) // `COOL`
eD(1, `map`, [(x) => x * 2], [1,2,3]) // [2,4,6]
eD(2, `reduce`, [(a, b) => (a + b), 0], [1,2,3]) // 6
eD(2, `reduce`, [(a, b) => (a + b)], [1, 2, 3]) // throws error
```

Returns **any** the result of delegating to the method with some arguments

## e0

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

**Examples**

```javascript
import {e0} from 'entrust'
const toLowerCase = e0(`toLowerCase`)
toLowerCase(`COOL`) // cool
```

Returns **any** 

## e1

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

**Examples**

```javascript
import {e1} from 'entrust'
const split = e1(`split`)
split(`:`, `c:o:o:l`) // [`c`,`o`,`o`,`l`]
```

Returns **any** 

## e10

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `f` **any** some parameter
-   `g` **any** some parameter
-   `h` **any** some parameter
-   `i` **any** some parameter
-   `j` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e2

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

**Examples**

```javascript
import {e2} from 'entrust'
const replace = e2(`replace`)
replace(`old`, `new`, `oldnew`) // newnew
```

Returns **any** 

## e3

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e4

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e5

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e6

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `f` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e7

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `f` **any** some parameter
-   `g` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e8

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `f` **any** some parameter
-   `g` **any** some parameter
-   `h` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 

## e9

**Parameters**

-   `fn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** a function name
-   `a` **any** some parameter
-   `b` **any** some parameter
-   `c` **any** some parameter
-   `d` **any** some parameter
-   `e` **any** some parameter
-   `f` **any** some parameter
-   `g` **any** some parameter
-   `h` **any** some parameter
-   `i` **any** some parameter
-   `x` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** an object

Returns **any** 
