{"id":21278623,"url":"https://github.com/wdalmut/fn","last_synced_at":"2025-06-28T18:32:58.623Z","repository":{"id":142589568,"uuid":"141045638","full_name":"wdalmut/fn","owner":"wdalmut","description":"An example of how a group of tiny functions can finally resolve complex problems","archived":false,"fork":false,"pushed_at":"2018-08-26T14:36:50.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T13:41:46.851Z","etag":null,"topics":["functional-programming","kata","katas"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wdalmut.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-15T17:35:43.000Z","updated_at":"2019-07-09T11:59:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"d52e0032-7a34-41d4-b644-22e099ea9a54","html_url":"https://github.com/wdalmut/fn","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wdalmut/fn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdalmut%2Ffn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdalmut%2Ffn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdalmut%2Ffn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdalmut%2Ffn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wdalmut","download_url":"https://codeload.github.com/wdalmut/fn/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdalmut%2Ffn/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262476446,"owners_count":23317282,"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":["functional-programming","kata","katas"],"created_at":"2024-11-21T10:15:24.583Z","updated_at":"2025-06-28T18:32:58.617Z","avatar_url":"https://github.com/wdalmut.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n## Example\n\n### Exec a secondary function example\n\n```js\nconst { map, tap, inc, pipe } = require('./src');\n\nconst log = tap(console.log);\n\nmap(pipe([log, inc]))([1,2,3]);\n1\n2\n3\n[ 2, 3, 4 ]\n```\n\n### Average example\n\n```js\nconst { length, sum, divide, converge } = require('./src');\n\nconverge(divide)([sum, length])([1,2,3]); // 2\n```\n\n### Sort list of users by name\n\n```js\nconst { sortBy, prop, toLower, pipe } = require('./src');\n\nlet user1 = {name: \"walter\"};\nlet user2 = {name: \"Wally\"};\nlet user3 = {name: \"Pippo\"};\nlet users = [user1, user2, user3];\n\nconst byName = pipe([prop('name'), toLower])\nconst sortByName = sortBy(byName);\n\nsortByName(users)\n[ { name: 'Pippo' }, { name: 'Wally' }, { name: 'walter' } ]\n```\n\n### Sort list of users by age\n\n```js\nconst { sort, prop, ascend } = require('./src');\n\nlet user1 = {name: \"walter\", age: 35};\nlet user2 = {name: \"Wally\", age: 21};\nlet user3 = {name: \"Pippo\", age: 41};\nlet users = [user1, user2, user3];\n\nconst sortByAge = sort(ascend(prop('age')));\n\nsortByAge(users)\n[ { name: 'Wally', age: 21 },\n  { name: 'walter', age: 35 },\n  { name: 'Pippo', age: 41 } ]\n```\n\n### Filter list of users with a given name\n\n```js\nlet user1 = {name: \"walter\"};\nlet user2 = {name: \"Wally\"};\nlet user3 = {name: \"Pippo\"};\nlet users = [user1, user2, user3];\n\nconst { filter, pathEq } = require('./src');\n\nconst nameIsWalter = pathEq(['name'])('walter');\nconst filterByNameEqualsToWalter = filter(nameIsWalter);\n\nfilterByNameEqualsToWalter(users)\n[ { name: 'walter' } ]\n```\n\n### Group by age a list of users\n\n```js\nconst { groupBy, prop } = require('./src');\n\nlet user1 = {name: \"walter\", age: 35};\nlet user2 = {name: \"Wally\", age: 35};\nlet user3 = {name: \"Pippo\", age: 41};\nlet user4 = {name: \"Paperino\", age: 14};\nlet users = [user1, user2, user3, user4];\n\nconst groupByAge = groupBy(prop('age'));\n\ngroupByAge(users)\n{ '14': [ { name: 'Paperino', age: 14 } ],\n  '35': [ { name: 'walter', age: 35 }, { name: 'Wally', age: 35 } ],\n  '41': [ { name: 'Pippo', age: 41 } ] }\n```\n\n### Group by age a list of users (2)\n\n```js\nconst { groupBy, path } = require('./src');\n\nlet user1 = {name: \"walter\", profile: {age: 35}};\nlet user2 = {name: \"Wally\", profile: {age: 35}};\nlet user3 = {name: \"Pippo\", profile: {age: 41}};\nlet user4 = {name: \"Paperino\", profile: {age: 14}};\nlet users = [user1, user2, user3, user4];\n\nconst groupByAge = groupBy(path(['profile', 'age']));\n\ngroupByAge(users)\n{ '14': [ { name: 'Paperino', profile: [Object] } ],\n  '35':\n   [ { name: 'walter', profile: [Object] },\n     { name: 'Wally', profile: [Object] } ],\n  '41': [ { name: 'Pippo', profile: [Object] } ] }\n```\n\n### Update a property of a list of users\n\n```js\nconst { map, lensProp, inc, over } = require('./src');\n\nlet user1 = {name: \"walter\", value: 2};\nlet user2 = {name: \"Wally\", value: 4};\nlet user3 = {name: \"Pippo\", value: 1};\nlet users = [user1, user2, user3];\n\nconst xLens = lensProp('value');\nconst increaseValue = over(xLens)(inc);\n\nmap(increaseValue)(users);\n[ { name: 'walter', value: 3 },\n  { name: 'Wally', value: 5 },\n  { name: 'Pippo', value: 2 } ]\n```\n\n### Update a deeply nested property of a list of users\n\n```js\nconst { map, lensPath, inc, over } = require('./src');\n\nlet user1 = {name: \"walter\", profile: {value: 2}};\nlet user2 = {name: \"Wally\", profile: {value: 4}};\nlet user3 = {name: \"Pippo\", profile: {value: 1}};\nlet users = [user1, user2, user3];\n\nconst xLens = lensPath(['profile', 'value']);\nconst increaseValue = over(xLens)(inc);\n\nmap(increaseValue)(users);\n[ { name: 'walter', profile: { value: 3 } },\n  { name: 'Wally', profile: { value: 5 } },\n  { name: 'Pippo', profile: { value: 2 } } ]\n```\n\n### Update a deeply nested property of a list of users (2)\n\n```js\nconst { map, lensPath, inc, over } = require('./src');\n\nlet user1 = {name: \"walter\", comments: [{name: 'Laura', score: 2}, {name: 'Michele', score: 0}]};\nlet user2 = {name: \"Wally\", comments: [{name: 'Michele', score: 0}]};\nlet user3 = {name: \"Pippo\", comments: [{name: 'Giovanni', score: 8}, {name: 'Michele', score: 3}]};\nlet users = [user1, user2, user3];\n\nconst xLens = lensPath(['comments', 0, 'score']);\nconst increaseValue = over(xLens)(inc);\n\nmap(increaseValue)(users);\n[ { name: 'walter', comments: [{name: 'Laura', score: 3}, {name: 'Michele', score: 0}] },\n  { name: 'Wally', comments: [{name: 'Michele', score: 1}] },\n  { name: 'Pippo', comments: [{name: 'Giovanni', score: 9}, {name: 'Michele', score: 3}] } ]\n\n```\n\n### fizzbuzz\n\n```js\nconst {T, flip, pipe, cond, curry2, equals, always, modulo, identity} = require('./src');\n\n\ncond([\n  [pipe([curry2(flip(modulo))(15), equals(0)]), always(\"fizzbuzz\")],\n  [pipe([curry2(flip(modulo))(3), equals(0)]), always(\"fizz\")],\n  [pipe([curry2(flip(modulo))(5), equals(0)]), always(\"buzz\")],\n  [T, identity],\n])(3)\n```\n\n### Max Min\n\n```js\nconst {\n  T, flip, converge, concat, or, last, head, append, pipe,\n  cond, curry2, uncurry2, equals, length, sort, reverse,\n  always, slice, identity, subtract, gte\n} = require('./src');\n\nconst length_is_less_than_1 = pipe([length, gte(1)]);\nconst first_element = pipe([head, curry2(flip(uncurry2(append)))([])]);\nconst last_element = pipe([last, curry2(flip(uncurry2(append)))([])]);\n\nconst create_min_max_tuple = converge(uncurry2(concat))([first_element, last_element]);\n\nconst descending_sort = sort(flip(subtract));\n\nconst without_first_and_last_element = slice(1)(-1);\n\nfunction max_min(rem, fin) {\n  return cond([\n    [length_is_less_than_1, always(fin)],\n    [T, pipe([\n      create_min_max_tuple,\n      concat(fin),\n      curry2(max_min)(without_first_and_last_element(rem))\n    ])]\n  ])(rem)\n}\n\nlet numbers = [1,2,3,4,5,6,7,8,9,10]\n\nnumbers = descending_sort(numbers)\n\nmax_min(numbers, [])\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwdalmut%2Ffn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwdalmut%2Ffn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwdalmut%2Ffn/lists"}