{"id":23147304,"url":"https://github.com/christianhg/bukk","last_synced_at":"2025-08-17T17:33:31.497Z","repository":{"id":57191337,"uuid":"77706762","full_name":"christianhg/bukk","owner":"christianhg","description":"Functional programming for Norwegians ⛷️","archived":false,"fork":false,"pushed_at":"2017-06-19T19:16:30.000Z","size":227,"stargazers_count":5,"open_issues_count":7,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-07T09:15:20.105Z","etag":null,"topics":["curry","data-last","es2015","es6","functional-programming","library"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/christianhg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-30T19:42:06.000Z","updated_at":"2023-02-02T20:19:51.000Z","dependencies_parsed_at":"2022-09-15T22:23:02.860Z","dependency_job_id":null,"html_url":"https://github.com/christianhg/bukk","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhg%2Fbukk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhg%2Fbukk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhg%2Fbukk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhg%2Fbukk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/christianhg","download_url":"https://codeload.github.com/christianhg/bukk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230151950,"owners_count":18181318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["curry","data-last","es2015","es6","functional-programming","library"],"created_at":"2024-12-17T16:52:04.253Z","updated_at":"2024-12-17T16:52:04.836Z","avatar_url":"https://github.com/christianhg.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bukk 🐐\n\n\u003e Functional programming for Norwegians ⛷️\n\n[![npm module](https://badge.fury.io/js/bukk.svg)](https://www.npmjs.org/package/bukk)\n[![Coverage Status](https://coveralls.io/repos/github/christianhg/bukk/badge.svg?branch=master)](https://coveralls.io/github/christianhg/bukk?branch=master)\n[![Build Status](https://travis-ci.org/christianhg/bukk.svg?branch=master)](https://travis-ci.org/christianhg/bukk)\n[![Dependencies](https://david-dm.org/christianhg/bukk.svg)](https://david-dm.org/christianhg/bukk)\n[![devDependencies Status](https://david-dm.org/christianhg/bukk/dev-status.svg)](https://david-dm.org/christianhg/bukk?type=dev)\n\n- [Why?](#why)\n- [Goals and philosophies](#goals-and-philosophies)\n- [Examples](#examples)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Development](#development)\n- [\"Bukk\"?](#bukk)\n- [API](#api)\n\n## Why?\n\nNot exactly. Well, not only for Norwegians. Inspired by [Ramda](https://github.com/ramda/ramda), this an automatically curried, data-last, functional JavaScript library.\n\n## Goals and philosophies\n\n- **Declarative code**\u003cbr\u003e\n*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.*\n\n- **Predictable behaviors**\u003cbr\u003e\n*`B.map(B.inc, 1)` should return `2`. Not `[]`, `[undefined]` or `[2]`. Just `2`.*\n\n- **ES6 compliant**\u003cbr\u003e\n*It is totally fine to do `B.map(B.inc, new Set([1, 2, 3]))`. This will simply return `Set {2, 3, 4}`.*\n\n- **Feature-rich**\u003cbr\u003e\n*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.*\n\n- **[No dependencies](https://david-dm.org/christianhg/bukk)**\n\n- **[Great code coverage](https://coveralls.io/github/christianhg/bukk)**\n\n## Examples\n\n```js\nconst incCollection = B.map(B.inc)\n\nincCollection([1, 2, 3])\n// =\u003e [2, 3, 4]\n\nincCollection(new Set([1, 2, 3]))\n// =\u003e Set {2, 3, 4}\n```\n\n```js\nconst isFoo = B.equals('foo')\nconst allIsFoo = B.all(isFoo)\n\nallIsFoo({x: 'foo', y: 'foo', z: 'foo'})\n// =\u003e true\n\nallIsFoo(['foo', 'bar', 'baz'])\n// =\u003e false\n```\n\n```js\nconst takeTwo = B.take(2)\n\ntakeTwo(new Map([[1, 'a'], [2, 'b'], [3, 'c']]))\n// =\u003e Map { 1 =\u003e 'a', 2 =\u003e 'b' }\n\ntakeTwo('foobar')\n// =\u003e 'fo'\n```\n\n```js\nconst double = B.multiply(2)\nconst addFive = B.add(5)\nconst incDoubleAndAddFive = B.compose(addFive, double, B.inc)\n\nincDoubleAndAddFive(1)\n// =\u003e 9\n```\n\n```js\nconst sqrtOfProduct = B.pipe(B.multiply, Math.sqrt)\n\nsqrtOfProduct(3, 12)\n// =\u003e 6\n```\n\n```js\nconst multiplyThree = (a, b, c) =\u003e a * b * c\nconst multiplyThreeCurried = B.curry(multiplyThree)\n\nmultiplyThreeCurried(2)\n// =\u003e Function\n\nmultiplyThreeCurried(2)(3)\nmultiplyThreeCurried(2, 3)\n// =\u003e Function\n\nmultiplyThreeCurried(2)(3)(4)\nmultiplyThreeCurried(2, 3)(4)\nmultiplyThreeCurried(2)(3, 4)\n// =\u003e 24\n```\n\n## Installation\n\nInstall using `yarn`:\n\n```bash\nyarn add bukk\n```\n\nOr `npm`:\n\n```bash\nnpm install --save bukk\n```\n\n## Usage\n\nImport module:\n\n```js\nimport * as B from 'bukk'\n```\n\n```js\nimport { compose, map, prop } from 'bukk'\n```\n\nOr add the `B` variable to the global scope:\n\n```html\n\u003cscript src=\"nodule_modules/bukk/dist/bukk.js\"\u003e\u003c/script\u003e\n```\n\n## Development\n\nInstall dependencies:\n\n```bash\nyarn install\n```\n\nBuild:\n\n```bash\nyarn run build\n```\n\nWill lint the source code, run tests and generate code coverage, and build a minified version of the library.\n\n### Running tests\n\nTest once:\n\n```bash\nyarn run test\n```\n\nTest in watch mode:\n\n```bash\nyarn run dev\n```\n\nReading coverage reports:\n\n```bash\nyarn run report\n```\n\n## \"Bukk\"?\n\n\"Bukk\" means \"ram\" in Norwegian :)\n\n## API\n\n### `B.add`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.all`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e Boolean`\n\n---\n\n### `B.and`\n\n`a --\u003e b --\u003e a | b`\n\n---\n\n### `B.any`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e Boolean`\n\n---\n\n### `B.append`\n\n`* --\u003e Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.both`\n\n`(*... --\u003e b) --\u003e (*... --\u003e d) --\u003e b | d`\n\n---\n\n### `B.compose`\n\n`Function... --\u003e Function`\n\n---\n\n### `B.concat`\n\n`Array | Map | Set | String --\u003e Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.curry`\n\n`Function --\u003e Function`\n\n---\n\n### `B.dec`\n\n`Number --\u003e Number`\n\n---\n\n### `B.divide`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.either`\n\n`(*... --\u003e b) --\u003e (*... --\u003e d) --\u003e b | d`\n\n---\n\n### `B.equals`\n\n`* --\u003e * --\u003e Boolean`\n\n---\n\n### `B.filter`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e Array | Map | Object | Set | String`\n\n---\n\n### `B.find`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e *`\n\n---\n\n### `B.flatten`\n\n`Array --\u003e Array`\n\n---\n\n### `B.gt`\n\n`Number --\u003e Number --\u003e Boolean`\n\n---\n\n### `B.gte`\n\n`Number --\u003e Number --\u003e Boolean`\n\n---\n\n### `B.head`\n\n`Array | Map | Set | String --\u003e *`\n\n---\n\n### `B.inc`\n\n`Number --\u003e Number`\n\n---\n\n### `B.init`\n\n`Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.kind`\n\n`* --\u003e String`\n\n---\n\n### `B.last`\n\n`Array | Map | Set | String --\u003e *`\n\n---\n\n### `B.lt`\n\n`Number --\u003e Number --\u003e Boolean`\n\n---\n\n### `B.lte`\n\n`Number --\u003e Number --\u003e Boolean`\n\n---\n\n### `B.map`\n\n`Function --\u003e * --\u003e *`\n\n---\n\n### `B.max`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.merge`\n\n`Object --\u003e Object --\u003e Object`\n\n---\n\n### `B.min`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.multiply`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.none`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e Boolean`\n\n---\n\n### `B.or`\n\n`a --\u003e b --\u003e a | b`\n\n---\n\n### `B.pipe`\n\n`Function... --\u003e Function`\n\n---\n\n### `B.prepend`\n\n`* --\u003e Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.prop`\n\n`String --\u003e Object --\u003e *`\n\n---\n\n### `B.range`\n\n`Number --\u003e Number --\u003e Array`\n\n---\n\n### `B.reduce`\n\n`(a --\u003e b --\u003e a) --\u003e a --\u003e Array | Map | Object | Set | String --\u003e a`\n\n---\n\n### `B.reject`\n\n`(* --\u003e Boolean) --\u003e Array | Map | Object | Set | String --\u003e Array | Map | Object | Set | String`\n\n---\n\n### `B.reverse`\n\n`Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.slice`\n\n`Number --\u003e Number --\u003e Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.sortBy`\n\n`Function --\u003e Array | Map | Set --\u003e Array | Map | Set`\n\n---\n\n### `B.subtract`\n\n`Number --\u003e Number --\u003e Number`\n\n---\n\n### `B.tail`\n\n`Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.take`\n\n`Number --\u003e Array | Map | Set | String --\u003e Array | Map | Set | String`\n\n---\n\n### `B.trim`\n\n`String --\u003e String`\n\n---\n\n### `B.type`\n\n`* --\u003e String`\n\n---\n\n### `B.zip`\n\n`Array --\u003e Array --\u003e Array`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristianhg%2Fbukk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchristianhg%2Fbukk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristianhg%2Fbukk/lists"}