{"id":14008345,"url":"https://github.com/transient-haskell/transient","last_synced_at":"2025-05-16T01:07:11.349Z","repository":{"id":23395175,"uuid":"26757048","full_name":"transient-haskell/transient","owner":"transient-haskell","description":"A full stack, reactive architecture for general purpose programming.  Algebraic and monadically composable primitives for concurrency, parallelism, event handling, transactions, multithreading, Web, and distributed computing with complete de-inversion of control (No callbacks, no blocking, pure state)","archived":false,"fork":false,"pushed_at":"2021-03-06T12:24:35.000Z","size":21262,"stargazers_count":634,"open_issues_count":10,"forks_count":28,"subscribers_count":31,"default_branch":"master","last_synced_at":"2025-05-06T19:17:27.363Z","etag":null,"topics":["backtracking","composability","composition","concurrency","distributed-computing","events","haskell","threading","transaction","web"],"latest_commit_sha":null,"homepage":"","language":"Haskell","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/transient-haskell.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-17T13:10:18.000Z","updated_at":"2025-04-13T17:55:34.000Z","dependencies_parsed_at":"2022-08-09T03:30:21.430Z","dependency_job_id":null,"html_url":"https://github.com/transient-haskell/transient","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transient-haskell%2Ftransient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transient-haskell%2Ftransient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transient-haskell%2Ftransient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transient-haskell%2Ftransient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/transient-haskell","download_url":"https://codeload.github.com/transient-haskell/transient/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254448579,"owners_count":22072764,"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":["backtracking","composability","composition","concurrency","distributed-computing","events","haskell","threading","transaction","web"],"created_at":"2024-08-10T11:01:36.443Z","updated_at":"2025-05-16T01:07:06.338Z","avatar_url":"https://github.com/transient-haskell.png","language":"Haskell","readme":"IMPORTANT NOTE: Transient is being translated to a new repo\n\nTHIS REPO IS DEPRECATED\n\nPlease, for the last version, go to:\n\nhttps://github.com/transient-haskell/transient-stack\n\nThere is all the haskell packages, including distributed computing (transient-universe) and client-side web (axiom)\n\n![Transient logo](https://github.com/transient-haskell/transient/raw/master/logo.png)\n=========\n\n[![Hackage](https://img.shields.io/hackage/v/transient.svg)](http://hackage.haskell.org/package/transient)\n[![Stackage LTS](http://stackage.org/package/transient/badge/lts)](http://stackage.org/lts/package/transient)\n[![Stackage Nightly](http://stackage.org/package/transient/badge/nightly)](http://stackage.org/nightly/package/transient)\n[![Build Status](https://api.travis-ci.org/transient-haskell/transient.png?branch=master)](https://travis-ci.org/transient-haskell/transient)\n[![Gitter](https://badges.gitter.im/theam/haskell-do.svg)](https://gitter.im/Transient-Transient-Universe-HPlay/Lobby?utm_source=share-link\u0026utm_medium=link\u0026utm_campaign=share-link)\n\n [![Simple Haskell](http://simplehaskell.org/badges/badge.svg)](http://simplehaskell.org)\n[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://agocorona.github.io/donation.html)\n\nNOTE: distributed computing and web primitives Are in [transient-universe](https://github.com/transient-haskell/transient-universe) and [axiom](https://github.com/transient-haskell/axiom). Some examples at [transient-examples](https://github.com/transient-haskell/transient-examples) \n\n\n## Some feedback on `transient`:\n\n1. Rahul Muttineni @rahulmutt nov. 09 2016 03:40  Lead developper of ETA (the JVM Haskell compiler)\n\n   *It's a bit mind bending in that it's like using a higher-level list monad, but it's very, very cool. For beginning Haskellers, what would be really useful is a visualisation of what happens when you do various distributed/parallel stuff.* **It's almost shocking how effortlessly you can run computations across threads/nodes.**\n\n   *The cool part is the composability in the distributed setting. *You can make higher-order monadic functions that allow you to compose \u0026 reuse a long chain of distributed transactions via `wormhole` and `teleport`*. Another benefit is that the transaction becomes first class and* **you can see exactly what's going on in one place** *instead of distributing the logic across actors making the code equivalent to event callbacks, as you've stated.*\n\n  https://gitter.im/Transient-Transient-Universe-HPlay/Lobby?at=58228caa35e6cf054773303b\n\n## What is Transient?\n\nOne of the dreams of software engineering is unrestricted composability.\n\nThis may be put in these terms:\n\nlet `ap1` and `ap2` two applications with arbitrary complexity, with all effects including multiple threads, asynchronous IO, indeterminism, events and perhaps, distributed computing.\n\nThen the combinations:\n\n     - ap1 \u003c|\u003e ap2          -- Alternative expression\n     - ap1 \u003e\u003e= \\x -\u003e ap2    -- monadic sequence\n     - ap1 \u003c\u003e ap2           -- monoidal expression\n     - (,) \u003c$\u003e ap1 \u003c*\u003e ap2  -- Applicative expression\n\nare possible if the types match, and generate new applications that are composable as well.\n\nTransient does exactly that.\n\nThe operators `\u003c$\u003e` `\u003c*\u003e` and `\u003c\u003e` express concurrency, the operator `\u003c|\u003e` express parallelism and `\u003e\u003e=` for sequencing of threads, distributed processes or web widgets. So even in the presence of these effects and others, everything is composable.\n\nFor this purpose transient is an extensible effects monad with all major effects and primitives for parallelism, events, asynchronous IO, early termination, non-determinism logging and distributed computing. Since it is possible to extend it with more effects without adding monad transformers, the composability is assured.\n\nMotivating example\n==================\nThis program, will stream \"hello world\"  from N nodes if you enter \"fire\" in the console\n\n```Haskell\nmain= keep $ initNode $ inputNodes \u003c|\u003e distribStream\n\ndistribStream= do\n      local $ option \"fire\" \"fire\"\n      r \u003c- clustered . local . choose $ repeat \"hello world\"\n      localIO $ print r\n```\nRead the tutorial to know how to compile and invoke it.\n\nThis program will present a link in the browser and stream fibonnacci numbers to the browser when\nyo click it.  (if you have Docker, you can run it straigh from the console; See [this](https://github.com/transient-haskell/axiom#how-to-install--run-fast)\n\n```Haskell\nmain= keep . initNode $ webFib\n\nwebFib= onBrowser $ do\n    local . render $  wlink () (h1 \"hello fibonacci numbers\")\n\n    r \u003c-  atRemote $ do\n                r \u003c- local . threads 1 . choose $ take 10 fibs\n                localIO $ print r\n                localIO $ threadDelay 1000000\n                return r\n\n    local . render . rawHtml $ (h2 r)\n    where\n    fibs = 0 : 1 : zipWith (+) fibs (tail fibs) :: [Int]\n```\n\nThis program combines both functionalities:\n\n```haskell\nmain= keep . initNode $ inputNodes \u003c|\u003e webFib \u003c|\u003e distribStream\n```\n\nDocumentation\n=============\n\nThe [Wiki](https://github.com/agocorona/transient/wiki) is more user oriented\n\nMy video sessions in [livecoding.tv](https://www.livecoding.tv/agocorona/videos/) not intended as tutorials or presentations, but show some of the latest features running.\n\nThe articles are more technical:\n\n- [Philosophy, async, parallelism, thread control, events, Session state](https://www.schoolofhaskell.com/user/agocorona/EDSL-for-hard-working-IT-programmers)\n- [Backtracking and undoing IO transactions](https://www.schoolofhaskell.com/user/agocorona/the-hardworking-programmer-ii-practical-backtracking-to-undo-actions)\n- [Non-deterministic list like processing, multithreading](https://www.schoolofhaskell.com/user/agocorona/beautiful-parallel-non-determinism-transient-effects-iii)\n- [Distributed computing](https://www.schoolofhaskell.com/user/agocorona/moving-haskell-processes-between-nodes-transient-effects-iv)\n- [Publish-Subscribe variables](https://www.schoolofhaskell.com/user/agocorona/publish-subscribe-variables-transient-effects-v)\n- [Distributed streaming, map-reduce](https://www.schoolofhaskell.com/user/agocorona/estimation-of-using-distributed-computing-streaming-transient-effects-vi-1)\n\nThese articles contain executable examples (not now, since the site no longer support the execution of haskell snippets).\n\n\nPlans\n=====\nOnce composability in the large is possible, there are a infinite quantity of ideas that may be realized. There are short term and long term goals. An status of development is regularly published in [![Gitter](https://badges.gitter.im/theam/haskell-do.svg)](https://gitter.im/Transient-Transient-Universe-HPlay/Lobby?utm_source=share-link\u0026utm_medium=link\u0026utm_campaign=share-link).  \n\nAmong the most crazy ones is the possibility of extending this framework to other languages and make them interoperable. treating whole packaged applications as components, and docking them as lego pieces in a new layer of the Operating system where the shell allows such kind of type safe docking. this composable docker allows all kinds of composability, while the current docker platform is just a form of degraded monoid that do not compute.\n\nContribute:\n==========\nWanna contribute? Make sure that you've read our [contributor guidelines](https://github.com/transient-haskell/transient/blob/master/CONTRIBUTING.md). We'd like to hear from you and your ideas, get in touch with other contributors through:\n\n- [![Gitter](https://badges.gitter.im/theam/haskell-do.svg)](https://gitter.im/Transient-Transient-Universe-HPlay/Lobby?utm_source=share-link\u0026utm_medium=link\u0026utm_campaign=share-link)\n\n- [The issues page for transient](https://github.com/transient-haskell/transient/issues) \n- [The issues page for transient-universe](https://github.com/transient-haskell/transient-universe/issues) \n- [The issues page for axiom](https://github.com/transient-haskell/axiom/issues) \n\nOnce you learn something interesting, you can [contribute to the wiki](https://github.com/transient-haskell/transient/wiki)\n\n[You can also donate](https://agocorona.github.io/donation.html) to the lead developer in order to make possible the dedication of more time to fullfil the potential advantages of true software composability across the whole stack.\n\n","funding_links":[],"categories":["Haskell"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftransient-haskell%2Ftransient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftransient-haskell%2Ftransient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftransient-haskell%2Ftransient/lists"}