{"id":13846470,"url":"https://github.com/suprematic/otplike","last_synced_at":"2026-02-19T07:31:00.103Z","repository":{"id":61651162,"uuid":"65310251","full_name":"suprematic/otplike","owner":"suprematic","description":"Erlang/OTP like processes and behaviours for Clojure on top of core.async","archived":false,"fork":false,"pushed_at":"2024-02-19T19:50:57.000Z","size":678,"stargazers_count":215,"open_issues_count":11,"forks_count":6,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-11-27T14:28:29.298Z","etag":null,"topics":[],"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/suprematic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License_EPL_1.0.html","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":"2016-08-09T16:21:38.000Z","updated_at":"2025-11-26T16:57:29.000Z","dependencies_parsed_at":"2024-02-19T20:56:48.303Z","dependency_job_id":null,"html_url":"https://github.com/suprematic/otplike","commit_stats":{"total_commits":579,"total_committers":6,"mean_commits":96.5,"dds":0.227979274611399,"last_synced_commit":"bc9d4e82c14053fac8a0ec141eaca897dd2cfe9b"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/suprematic/otplike","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suprematic%2Fotplike","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suprematic%2Fotplike/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suprematic%2Fotplike/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suprematic%2Fotplike/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suprematic","download_url":"https://codeload.github.com/suprematic/otplike/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suprematic%2Fotplike/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29606796,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T06:47:36.664Z","status":"ssl_error","status_checked_at":"2026-02-19T06:45:47.551Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":[],"created_at":"2024-08-04T18:00:34.803Z","updated_at":"2026-02-19T07:31:00.085Z","avatar_url":"https://github.com/suprematic.png","language":"Clojure","funding_links":[],"categories":["Clojure","\u003ca name=\"Clojure\"\u003e\u003c/a\u003eClojure"],"sub_categories":[],"readme":"# otplike\n\n[![Build Status][1]][2]\n\n_otplike_ is a framework built on top of [_core.async_][3]. It emulates basic\n[_Erlang/OTP_][4] concepts, such as processes, process linking, monitoring,\nstandard behaviours.\n\n## Rationale\n\nAlthough _core.async_ provides a solid foundation for asynchronous\napplications, our experience shows that there is a need in higher level\nsystem building blocks.\n\nIt appears that certain ideas can be taken from Erlang/OTP and implemented\non top of _core.async_.\n\nThe `gen_server` equivalent is used to serialize sync/async access to state\nand ensure that possibly inconsistent state data will be discarded in case\nof a crash.\n\nProcess linking/monitoring improves crash/error propagation and supervision\ncovers recovery. In addition process tracing facility helps a lot with\napplication debugging and profiling.\n\nIt is obvious that due to JVM limitations otplike cannot replace Erlang/OTP\nand otplike will `NEVER` be seen as Erlang/OTP alternative.\n\n## Example\n\n### Echo Server\n\n```clojure\n(require '[otplike.process :as process :refer [!]])\n\n(process/proc-defn server []\n  (println \"server: waiting for messages...\")\n  ; wait for messages\n  (process/receive!\n    [from msg]\n    (do\n      (println \"server: got\" msg)\n      ; send response\n      (! from [(process/self) msg])\n      (recur))\n    :stop\n    ; exit receive loop\n    (println \"server: stopped\")))\n\n(process/proc-defn client []\n  ; spawn process\n  (let [pid (process/spawn server)]\n    ; send message to it\n    (! pid [(process/self) :hello])\n\n    ;wait for response\n    (process/receive!\n      [pid msg]\n      (println \"client: got\" msg))\n\n    ; ask spawned process to stop\n    (! pid :stop)))\n\n(process/spawn client)\n```\n\nMore examples are available under the /examples directory.\n\n## Releases and Dependency Information\n\n[![Clojars Project][5]][6]\n\n[All Released Versions][7]\n\n_Leiningen_ dependency information:\n\n    [otplike \"0.6.0-alpha\"]\n\n## Documentation\n\n* [API docs][8]\n* [Examples][9]\n\n## Other materials\n\n* [EuroClojure 2017 presentation][12]\n\n## Known issues\n\n* A chain of N processes, when each next process is created by the previous\n  one, holds amount of memory proportional to N until the **last** process' exit\n\n## Plans\n\n* ClojureScript compatibility\n* `application` behaviour and related features as configuration\n* \"Simple\" supervisor (analogous to `simple_one_for_one` in Erlang) as\n  a separate module\n* Tracing and introspection\n* More advanced examples/tutorial\n\n## Contributing\n\nPlease use the project's GitHub issues page for all questions, ideas,\netc. Pull requests are welcome. See the project's GitHub contributors\npage for a list of contributors.\n\n## License\n\nCopyright © 2017 [SUPREMATIC][10] and contributors.\n\nDistributed under the Eclipse Public License v1.0,\nthe same as Clojure. License file is available under the project root.\n\n## Changelog\n\n* Release 0.6.0-alpha on 20.07.2019 [NOTES][17]\n* Release 0.5.0-alpha on 07.12.2018 [NOTES][16]\n* Release 0.4.0-alpha on 15.04.2018 [NOTES][15]\n* Release 0.3.0-alpha on 28.11.2017 [NOTES][14]\n* Release 0.2.1-alpha on 11.08.2017 [NOTES][13]\n* Release 0.2.0-alpha on 17.05.2017 [NOTES][11]\n* Release 0.1.0-SNAPSHOT on 15.08.2016\n\n[1]: https://travis-ci.org/suprematic/otplike.svg?branch=master\n[2]: https://travis-ci.org/suprematic/otplike\n[3]: https://github.com/clojure/core.async\n[4]: http://www.erlang.org/\n[5]: https://img.shields.io/clojars/v/otplike.svg\n[6]: https://clojars.org/otplike\n[7]: https://clojars.org/otplike\n[8]: https://suprematic.github.io/otplike/api/0.6.0-alpha/index.html\n[9]: https://github.com/suprematic/otplike/tree/master/examples/otplike/example\n[10]: http://suprematic.net/\n[11]: https://github.com/suprematic/otplike/releases/tag/0.2.0\n[12]: https://suprematic.github.io/otplike/euroclojure2017/\n[13]: https://github.com/suprematic/otplike/releases/tag/0.2.1\n[14]: https://github.com/suprematic/otplike/releases/tag/0.3.0\n[15]: https://github.com/suprematic/otplike/releases/tag/0.4.0-alpha\n[16]: https://github.com/suprematic/otplike/releases/tag/0.5.0-alpha\n[17]: https://github.com/suprematic/otplike/releases/tag/0.6.0-alpha\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuprematic%2Fotplike","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuprematic%2Fotplike","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuprematic%2Fotplike/lists"}