Functional programming for Norwegians ⛷️
Not exactly. Well, not only for Norwegians. Inspired by Ramda, this an automatically curried, data-last, functional JavaScript library.
-
Declarative code
Much favored over "smart" code. As an example it is preferred to use existing higher-order functions likeArray.prototype.every()
instead of reimplementing similar logic using loops. -
Predictable behaviors
B.map(B.inc, 1)
should return2
. Not[]
,[undefined]
or[2]
. Just2
. -
ES6 compliant
It is totally fine to doB.map(B.inc, new Set([1, 2, 3]))
. This will simply returnSet {2, 3, 4}
. -
Feature-rich
As seen above,B.map
knows how to handleSets
. Similarly, otherB
functions that can operate on Arrays, typically knows how to operate on other data structures as well.
const incCollection = B.map(B.inc)
incCollection([1, 2, 3])
// => [2, 3, 4]
incCollection(new Set([1, 2, 3]))
// => Set {2, 3, 4}
const isFoo = B.equals('foo')
const allIsFoo = B.all(isFoo)
allIsFoo({x: 'foo', y: 'foo', z: 'foo'})
// => true
allIsFoo(['foo', 'bar', 'baz'])
// => false
const takeTwo = B.take(2)
takeTwo(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))
// => Map { 1 => 'a', 2 => 'b' }
takeTwo('foobar')
// => 'fo'
const double = B.multiply(2)
const addFive = B.add(5)
const incDoubleAndAddFive = B.compose(addFive, double, B.inc)
incDoubleAndAddFive(1)
// => 9
const sqrtOfProduct = B.pipe(B.multiply, Math.sqrt)
sqrtOfProduct(3, 12)
// => 6
const multiplyThree = (a, b, c) => a * b * c
const multiplyThreeCurried = B.curry(multiplyThree)
multiplyThreeCurried(2)
// => Function
multiplyThreeCurried(2)(3)
multiplyThreeCurried(2, 3)
// => Function
multiplyThreeCurried(2)(3)(4)
multiplyThreeCurried(2, 3)(4)
multiplyThreeCurried(2)(3, 4)
// => 24
Install using yarn
:
yarn add bukk
Or npm
:
npm install --save bukk
Import module:
import * as B from 'bukk'
import { compose, map, prop } from 'bukk'
Or add the B
variable to the global scope:
<script src="nodule_modules/bukk/dist/bukk.js"></script>
Install dependencies:
yarn install
Build:
yarn run build
Will lint the source code, run tests and generate code coverage, and build a minified version of the library.
Test once:
yarn run test
Test in watch mode:
yarn run dev
Reading coverage reports:
yarn run report
"Bukk" means "ram" in Norwegian :)
Number --> Number --> Number
(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean
a --> b --> a | b
(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean
* --> Array | Map | Set | String --> Array | Map | Set | String
(*... --> b) --> (*... --> d) --> b | d
Function... --> Function
Array | Map | Set | String --> Array | Map | Set | String --> Array | Map | Set | String
Function --> Function
Number --> Number
Number --> Number --> Number
(*... --> b) --> (*... --> d) --> b | d
* --> * --> Boolean
(* --> Boolean) --> Array | Map | Object | Set | String --> Array | Map | Object | Set | String
(* --> Boolean) --> Array | Map | Object | Set | String --> *
Array --> Array
Number --> Number --> Boolean
Number --> Number --> Boolean
Array | Map | Set | String --> *
Number --> Number
Array | Map | Set | String --> Array | Map | Set | String
* --> String
Array | Map | Set | String --> *
Number --> Number --> Boolean
Number --> Number --> Boolean
Function --> * --> *
Number --> Number --> Number
Object --> Object --> Object
Number --> Number --> Number
Number --> Number --> Number
(* --> Boolean) --> Array | Map | Object | Set | String --> Boolean
a --> b --> a | b
Function... --> Function
* --> Array | Map | Set | String --> Array | Map | Set | String
String --> Object --> *
Number --> Number --> Array
(a --> b --> a) --> a --> Array | Map | Object | Set | String --> a
(* --> Boolean) --> Array | Map | Object | Set | String --> Array | Map | Object | Set | String
Array | Map | Set | String --> Array | Map | Set | String
Number --> Number --> Array | Map | Set | String --> Array | Map | Set | String
Function --> Array | Map | Set --> Array | Map | Set
Number --> Number --> Number
Array | Map | Set | String --> Array | Map | Set | String
Number --> Array | Map | Set | String --> Array | Map | Set | String
String --> String
* --> String
Array --> Array --> Array