bukk 🐐
Functional programming for Norwegians ⛷️
Why?
Not exactly. Well, not only for Norwegians. Inspired by 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 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.
Examples
const incCollection = B // => [2, 3, 4] // => Set {2, 3, 4}
const isFoo = Bconst allIsFoo = BallisFoo // => true // => false
const takeTwo = B // => Map { 1 => 'a', 2 => 'b' } // => 'fo'
const double = Bconst addFive = Bconst incDoubleAndAddFive = B // => 9
const sqrtOfProduct = B // => 6
const multiplyThree = a * b * cconst multiplyThreeCurried = B // => Function 3// => Function 3443 4// => 24
Installation
Install using yarn
:
yarn add bukk
Or npm
:
npm install --save bukk
Usage
Import module:
Or add the B
variable to the global scope:
Development
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.
Running tests
Test once:
yarn run test
Test in watch mode:
yarn run dev
Reading coverage reports:
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