Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/christianhg/bukk
Functional programming for Norwegians ⛷️
https://github.com/christianhg/bukk
curry data-last es2015 es6 functional-programming library
Last synced: about 1 month ago
JSON representation
Functional programming for Norwegians ⛷️
- Host: GitHub
- URL: https://github.com/christianhg/bukk
- Owner: christianhg
- License: mit
- Created: 2016-12-30T19:42:06.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2017-06-19T19:16:30.000Z (over 7 years ago)
- Last Synced: 2024-10-07T09:15:20.105Z (4 months ago)
- Topics: curry, data-last, es2015, es6, functional-programming, library
- Language: JavaScript
- Homepage:
- Size: 222 KB
- Stars: 5
- Watchers: 2
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# bukk 🐐
> Functional programming for Norwegians ⛷️
[![npm module](https://badge.fury.io/js/bukk.svg)](https://www.npmjs.org/package/bukk)
[![Coverage Status](https://coveralls.io/repos/github/christianhg/bukk/badge.svg?branch=master)](https://coveralls.io/github/christianhg/bukk?branch=master)
[![Build Status](https://travis-ci.org/christianhg/bukk.svg?branch=master)](https://travis-ci.org/christianhg/bukk)
[![Dependencies](https://david-dm.org/christianhg/bukk.svg)](https://david-dm.org/christianhg/bukk)
[![devDependencies Status](https://david-dm.org/christianhg/bukk/dev-status.svg)](https://david-dm.org/christianhg/bukk?type=dev)- [Why?](#why)
- [Goals and philosophies](#goals-and-philosophies)
- [Examples](#examples)
- [Installation](#installation)
- [Usage](#usage)
- [Development](#development)
- ["Bukk"?](#bukk)
- [API](#api)## Why?
Not exactly. Well, not only for Norwegians. Inspired by [Ramda](https://github.com/ramda/ramda), this an automatically curried, data-last, functional JavaScript library.
## Goals and philosophies
- **Declarative code**
*Much favored over "smart" code. As an example it is preferred to use existing higher-order functions like `Array.prototype.every()` instead of reimplementing similar logic using loops.*- **Predictable behaviors**
*`B.map(B.inc, 1)` should return `2`. Not `[]`, `[undefined]` or `[2]`. Just `2`.*- **ES6 compliant**
*It is totally fine to do `B.map(B.inc, new Set([1, 2, 3]))`. This will simply return `Set {2, 3, 4}`.*- **Feature-rich**
*As seen above, `B.map` knows how to handle `Sets`. Similarly, other `B` functions that can operate on Arrays, typically knows how to operate on other data structures as well.*- **[No dependencies](https://david-dm.org/christianhg/bukk)**
- **[Great code coverage](https://coveralls.io/github/christianhg/bukk)**
## Examples
```js
const incCollection = B.map(B.inc)incCollection([1, 2, 3])
// => [2, 3, 4]incCollection(new Set([1, 2, 3]))
// => Set {2, 3, 4}
``````js
const isFoo = B.equals('foo')
const allIsFoo = B.all(isFoo)allIsFoo({x: 'foo', y: 'foo', z: 'foo'})
// => trueallIsFoo(['foo', 'bar', 'baz'])
// => false
``````js
const takeTwo = B.take(2)takeTwo(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))
// => Map { 1 => 'a', 2 => 'b' }takeTwo('foobar')
// => 'fo'
``````js
const double = B.multiply(2)
const addFive = B.add(5)
const incDoubleAndAddFive = B.compose(addFive, double, B.inc)incDoubleAndAddFive(1)
// => 9
``````js
const sqrtOfProduct = B.pipe(B.multiply, Math.sqrt)sqrtOfProduct(3, 12)
// => 6
``````js
const multiplyThree = (a, b, c) => a * b * c
const multiplyThreeCurried = B.curry(multiplyThree)multiplyThreeCurried(2)
// => FunctionmultiplyThreeCurried(2)(3)
multiplyThreeCurried(2, 3)
// => FunctionmultiplyThreeCurried(2)(3)(4)
multiplyThreeCurried(2, 3)(4)
multiplyThreeCurried(2)(3, 4)
// => 24
```## Installation
Install using `yarn`:
```bash
yarn add bukk
```Or `npm`:
```bash
npm install --save bukk
```## Usage
Import module:
```js
import * as B from 'bukk'
``````js
import { compose, map, prop } from 'bukk'
```Or add the `B` variable to the global scope:
```html
```
## Development
Install dependencies:
```bash
yarn install
```Build:
```bash
yarn run build
```Will lint the source code, run tests and generate code coverage, and build a minified version of the library.
### Running tests
Test once:
```bash
yarn run test
```Test in watch mode:
```bash
yarn run dev
```Reading coverage reports:
```bash
yarn run report
```## "Bukk"?
"Bukk" means "ram" in Norwegian :)
## API
### `B.add`
`Number --> Number --> Number`
---
### `B.all`
`(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean`
---
### `B.and`
`a --> b --> a | b`
---
### `B.any`
`(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean`
---
### `B.append`
`* --> Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.both`
`(*... --> b) --> (*... --> d) --> b | d`
---
### `B.compose`
`Function... --> Function`
---
### `B.concat`
`Array | Map | Set | String --> Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.curry`
`Function --> Function`
---
### `B.dec`
`Number --> Number`
---
### `B.divide`
`Number --> Number --> Number`
---
### `B.either`
`(*... --> b) --> (*... --> d) --> b | d`
---
### `B.equals`
`* --> * --> Boolean`
---
### `B.filter`
`(* --> Boolean) --> Array | Map | Object | Set | String --> Array | Map | Object | Set | String`
---
### `B.find`
`(* --> Boolean) --> Array | Map | Object | Set | String --> *`
---
### `B.flatten`
`Array --> Array`
---
### `B.gt`
`Number --> Number --> Boolean`
---
### `B.gte`
`Number --> Number --> Boolean`
---
### `B.head`
`Array | Map | Set | String --> *`
---
### `B.inc`
`Number --> Number`
---
### `B.init`
`Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.kind`
`* --> String`
---
### `B.last`
`Array | Map | Set | String --> *`
---
### `B.lt`
`Number --> Number --> Boolean`
---
### `B.lte`
`Number --> Number --> Boolean`
---
### `B.map`
`Function --> * --> *`
---
### `B.max`
`Number --> Number --> Number`
---
### `B.merge`
`Object --> Object --> Object`
---
### `B.min`
`Number --> Number --> Number`
---
### `B.multiply`
`Number --> Number --> Number`
---
### `B.none`
`(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean`
---
### `B.or`
`a --> b --> a | b`
---
### `B.pipe`
`Function... --> Function`
---
### `B.prepend`
`* --> Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.prop`
`String --> Object --> *`
---
### `B.range`
`Number --> Number --> Array`
---
### `B.reduce`
`(a --> b --> a) --> a --> Array | Map | Object | Set | String --> a`
---
### `B.reject`
`(* --> Boolean) --> Array | Map | Object | Set | String --> Array | Map | Object | Set | String`
---
### `B.reverse`
`Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.slice`
`Number --> Number --> Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.sortBy`
`Function --> Array | Map | Set --> Array | Map | Set`
---
### `B.subtract`
`Number --> Number --> Number`
---
### `B.tail`
`Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.take`
`Number --> Array | Map | Set | String --> Array | Map | Set | String`
---
### `B.trim`
`String --> String`
---
### `B.type`
`* --> String`
---
### `B.zip`
`Array --> Array --> Array`