Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ryanve/fm

JavaScript function modulation
https://github.com/ryanve/fm

function functional-programming functions javascript

Last synced: 4 months ago
JSON representation

JavaScript function modulation

Awesome Lists containing this project

README

        

# fm
#### JavaScript function modulation module

```
npm install fm --save
```

## API
- [.late()](#late)
- [.bind()](#bind)
- [.partial()](#partial)
- [.slice()](#slice)
- [.stat()](#stat)
- [.flow()](#flow)
- [.constant()](#constant)
- [.eq()](#eq)
- [.got()](#got)
- [.mixin()](#mixin)

* * *

- methods can be used statically or via [OO syntax](#oo)


### fm()
#### `fm(value)` → OO wrapper
##### `fm()` inherits from `fm.prototype`

```js
var fm = require('fm')
fm(callback).partial(...arguments)
fm.prototype.partial.apply(callback, arguments)
```

### .late()
#### `fm.late(method)`
#### `fm(method).late()`
function that calls `this[method]`

```js
fm.late('yes').call({ yes:function() { return 1 } }) // => 1
fm.late(0).call([function() { return this.length }]) // => 1
```

### .bind()
#### `fm.bind(callback, scope, ...arguments)`
#### `fm(callback).bind(scope, ...arguments)`
function that calls callback with `this` binded to scope, and prepends leading arguments

```js
fm.bind(callback, scope) // basic bind
fm.bind(callback, scope, 'a', 'b', 'c') // bind with partial arguments
```

### .partial()
#### `fm.partial(callback, ...arguments)`
#### `fm(callback).partial(...arguments)`
function that calls callback with dynamic `this`, and prepends leading arguments

```js
fm.partial(fm.got, 'a', 'b')('c') // => ['a', 'b', 'c']
fm.partial('got', 'a', 'b').call(fm, 'c') // => ['a', 'b', 'c']
fm.prototype.partial.apply(callback, array) // useful for array partials
```

### .slice()
#### `fm.slice(callback, begin?, end?)`
#### `fm(callback).slice(begin?, end?)`
function that calls callback with dynamic `this`, and `arguments` sliced by `[].slice`

```js
fm.slice(function(a, b, c) {}, 0, 2) // => new function that accepts only 2 args
fm.slice(fm.bind, 0, 2) // => version of .bind that ignores extra arguments
fm.slice(fm.got, 1)('a', 'b', 'c') // => ['b', 'c']
fm.slice(fm.got, -2)('a', 'b', 'c') // => ['b', 'c']
fm.slice(fm.got, 1, 2)('a', 'b', 'c') // => ['b']
```

### .stat()
#### `fm.stat(method)`
#### `fm(method).stat()`
- Convert an instance method into a static one.
function

```js
fm.stat([].slice) // => static slice() function
fm.stat({}.hasOwnProperty) // => static has() function
```

### .flow()
#### `fm.flow(first, next)`
#### `fm(first).flow(next)`
- Create a new function that invokes the next function with the result the first function
function

```js
fm.flow(fm.constant(2), fm.constant(3))()// => 3
```

### .constant()
#### `fm.constant(value)`
#### `fm(value).constant()`
function that always returns value regardless of context or arguments

```js
fm.constant() // => noop function
fm.constant()() // => undefined
fm.constant(true)() // => true
```

### .eq()
#### `fm.eq(callback, index)`
#### `fm(callback).eq(index)`
function that reduces the arguments passed to callback to the argument at the specified index

```js
fm.eq(Number, 1)(10, 11, 12) // => 11
fm.eq(Number, -1)(10, 11, 12) // => 12
```

### .got()
#### `fm.got(...arguments)`
#### `fm(head).got(...arguments)`
array of arguments received

```js
fm.got() // => []
fm.got(0, 1, 2) // => [0, 1, 2]
```

### .mixin()
#### `fm.mixin(object)`
this

## Coverage
Works...everywhere! Tested in node, Chrome, FF, Opera, IE

## Contribute
```
npm install
npm test
```

## Playground
[Try `fm` in your browser](http://ryanve.github.io/fm/)