{"id":21089559,"url":"https://github.com/jeremykross/ulmus","last_synced_at":"2026-03-07T01:35:23.242Z","repository":{"id":62435035,"uuid":"51252799","full_name":"jeremykross/ulmus","owner":"jeremykross","description":"A functional-reactive style programming library for Clojure(script)","archived":false,"fork":false,"pushed_at":"2019-11-28T16:48:04.000Z","size":122,"stargazers_count":37,"open_issues_count":0,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-10-17T06:32:07.991Z","etag":null,"topics":["clojure","clojurescript","frp","functional-programming","functional-reactive-programming"],"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/jeremykross.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":"2016-02-07T15:36:54.000Z","updated_at":"2024-05-31T07:56:21.000Z","dependencies_parsed_at":"2022-11-01T20:46:02.618Z","dependency_job_id":null,"html_url":"https://github.com/jeremykross/ulmus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jeremykross/ulmus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremykross%2Fulmus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremykross%2Fulmus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremykross%2Fulmus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremykross%2Fulmus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeremykross","download_url":"https://codeload.github.com/jeremykross/ulmus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremykross%2Fulmus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30205212,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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","frp","functional-programming","functional-reactive-programming"],"created_at":"2024-11-19T21:29:33.033Z","updated_at":"2026-03-07T01:35:23.202Z","avatar_url":"https://github.com/jeremykross.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/jeremykross/ulmus/blob/master/resources/ulmus.svg\" width=\"600px\" /\u003e\n\n---\n\nUlmus is a library for doing Functional Reactive Programming (FRP) in Clojure and Clojurescript.\n\n### Usage\n\n`[ulmus \"0.2.3\"]` in `project.clj`\n\nor\n\n`{:deps {ulmus {:mvn/version \"0.2.3\"}}}` in `deps.edn`\n\n### Introduction\n\nUlmus is a library designed to facilitate a functional-reactive style of programming. It's primarily inspired by Elm and RX. Some of the API apes Elm although it makes no attempt to be complete or exclusive in doing so.\n\nSignals are the basic building blocks of ulmus.  Conceptually, a signal is a datatype which holds a particular value.  Signals can be composed with standard functional tooling (eg. map, filter, reduce), producing new, dependent, signals.  Changing a signal's value causes all of it's dependent signals to update as well.\n\nSo for the sake of illustration, we might define a signal representing the current position of the mouse.\n\n```clojure\n(defn mouse-pos\n  []\n  (let [sig-$ (ulmus/signal)]\n    (.addEventListener\n      js/body\n      \"mousemove\"\n      (fn [e]\n        (ulmus/\u003e! sig-$ [(.-clientX e) (.-clientY e)])))\n    sig-$))\n\n(def position-$ (mouse-pos))\n```\n\nWe now have a signal, `position-$` which represents the current mouse position.  Dereferencing the signal will return it's current value.\n\n```clojure\n@position-$\n```\n\nmight return [640 480] for instance. \n\nJust like static data, signals can be composed, yielding new signals.  So,\n\n```clojure\n(def mouse-x-$ (ulmus/map first position-$))\n```\n\nSignals can model functionally interactions that would otherwise require slipping into imperative coding.  To better understand how these ideas might be applied to user interface see [Recurrent](https://github.com/jeremykross/recurrent).\n\n### Examples\n\nVarious examples can be found at https://jeremykross.github.io/recurrent-examples.\n\n### API Docs\n\n[![cljdoc badge](https://cljdoc.org/badge/ulmus)](https://cljdoc.org/d/ulmus/ulmus/CURRENT)\n\n\n### Status\n\nUlmus is fairly well-tread at this point, but still beta quality.  It shouldn't be relied on yet for anything mission critical.\n\n### Todo\n\n* Spec\n\n### Thanks\n\nThe Ulmus logo was created by the eminently talented [@the_stritt](https://twitter.com/the_stritt).\n\n### License\n\nCopyright 2019 Jeremy Kross\n\nDistributed under the Eclipse Public License either version 1.0 or (at your option) any later version.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeremykross%2Fulmus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeremykross%2Fulmus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeremykross%2Fulmus/lists"}