{"id":19508141,"url":"https://github.com/localshred/clamda","last_synced_at":"2026-06-23T12:32:01.574Z","repository":{"id":62433437,"uuid":"253585080","full_name":"localshred/clamda","owner":"localshred","description":"clojure.core on ramda steroids","archived":false,"fork":false,"pushed_at":"2022-09-02T19:23:45.000Z","size":70,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-16T14:54:19.547Z","etag":null,"topics":["clojure","clojurescript","ramda","ramdajs"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/localshred.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}},"created_at":"2020-04-06T18:39:10.000Z","updated_at":"2024-06-19T12:05:19.000Z","dependencies_parsed_at":"2022-11-01T20:45:49.852Z","dependency_job_id":null,"html_url":"https://github.com/localshred/clamda","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/localshred/clamda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localshred%2Fclamda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localshred%2Fclamda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localshred%2Fclamda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localshred%2Fclamda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/localshred","download_url":"https://codeload.github.com/localshred/clamda/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localshred%2Fclamda/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34688052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["clojure","clojurescript","ramda","ramdajs"],"created_at":"2024-11-10T23:03:55.744Z","updated_at":"2026-06-23T12:32:01.339Z","avatar_url":"https://github.com/localshred.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# (= 'clamda (+ 'clojure 'ramda))\n\n\n[![Clojars Project](https://img.shields.io/clojars/v/localshred.clamda/clamda.svg)](https://clojars.org/localshred.clamda/clamda)\n[![cljdoc badge](https://cljdoc.org/badge/localshred/clamda)](https://cljdoc.org/d/localshred/clamda/CURRENT)\n[![CircleCI](https://circleci.com/gh/localshred/clamda/tree/master.svg?style=svg)](https://circleci.com/gh/localshred/clamda/tree/master)\n\n`clamda` is `clojure.core` on Ramda steroids.\n\nClojure is an utterly brilliant programming language that has fundamentally changed the way I think about writing software.\n\n[Ramda](https://ramdajs.com) is a fantastic functional library for the JavaScript/Node community, and though I am _loving_\nClojure, I do miss `Ramda`. Like... a lot.\n\n## `clojure.core` warts\n\nClojure is a fantastic functional language with an incredible core library. But some of the design choices\nand naming leave me wanting a more consistent way to work with the core utilities. The downside of _some_\nof `clojure.core` include:\n\n+ Reliance on variadic techniques which are in stark contrast to data-last/currying. (See `assoc`, `update`, et. al)\n+ Weird naming imbalances (e.g. `every?` vs `some`, not to be confused with `some?` which is `(complement nil?)`...)\n\n## Ramda saves the day?\n\nYes, I'm telling you Clojure could learn a few things from a scrappy JS library that I have really grown to love.\n`Ramda` has a pretty good API where:\n\n+ Most functions are curried and the data to be operated on comes last.\n+ Solid functional primitives for replacing logic flows like `ifElse`, `when`, `tryCatch`, etc.\n+ Advanced primitives like `applySpec` and `evolve` for functional map/object construction.\n\n---\n\nI wrote `clamda` to fill in some missing gaps in the clojure core API, and I hope you find them useful. Some things I did:\n\n+ Provided currying primitives `curry`, `curry-n`, and even a `defcurry` macro.\n+ Wrote pretty much the rest of clamda using `defcurry`.\n+ Used \"clojurized\" `Ramda` fn names (like `pathSatisfies` -\u003e `path-satisfies`, or `pathEq` -\u003e `pathEq`).\n+ Used \"clojure-y\" names where it seemed a better fit for layering on top of existing names (like `\u003e`, `\u003e=`, `if`, `when`, etc).\n+ Wrap existing clojure fns that had the arguments in the \"wrong\" order, and curried the fn (like `select-keys`, now called `pick`).\n+ Made thread-frist core fns curried/thread-last (see `assoc`, `assoc-in`, `update`, `update-in`).\n\nYou'll also notice that I haven't included everything from `Ramda`, at least not yet. My guess is that there are plenty of fns\nin `Ramda` that won't need translation simply because Clojure already supports (or negates the need for) some of them.\n\nAnd before you get all mad about Rich being \"Right About Everything\", I don't really care. Rich is brilliant and made an amazing\nlanguage, but I like curried/data-last fns more than I like variadic fns and macro thread rewriting of argument passing.\nBoth approaches have a lot of value and I plan on continuin to write variadic functions (sometimes with `curry-n` to really\nturn up the juice). I know, salty. How do you know you won't like it until you try it though...\n\n## Clojars Deployment\n\n1. Update `\u003cversion\u003e` in `pom.xml`\n1. Make a commit for the version bump.\n1. `./bin/swap` to go into \"maven mode\" directory structure.\n1. `mvn deploy` to push to clojars.\n1. `./bin/swap` back out of \"maven mode\".\n1. Go verify on [clojars](https://clojars.org/localshred/clamda) and [cljdoc.org](https://cljdoc.org/d/localshred/clamda/0.1.0/doc/readme).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocalshred%2Fclamda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flocalshred%2Fclamda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocalshred%2Fclamda/lists"}