{"id":18579013,"url":"https://github.com/lpeterse/haskell-concurrent-rpc","last_synced_at":"2025-05-16T02:12:44.404Z","repository":{"id":62435750,"uuid":"54591407","full_name":"lpeterse/haskell-concurrent-rpc","owner":"lpeterse","description":"An abstraction for inter-thread RPC in Haskell","archived":false,"fork":false,"pushed_at":"2016-03-25T12:02:22.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-25T13:19:51.506Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/lpeterse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-23T20:36:41.000Z","updated_at":"2016-03-25T11:21:11.000Z","dependencies_parsed_at":"2022-11-01T21:16:57.871Z","dependency_job_id":null,"html_url":"https://github.com/lpeterse/haskell-concurrent-rpc","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpeterse%2Fhaskell-concurrent-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpeterse%2Fhaskell-concurrent-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpeterse%2Fhaskell-concurrent-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpeterse%2Fhaskell-concurrent-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lpeterse","download_url":"https://codeload.github.com/lpeterse/haskell-concurrent-rpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254453625,"owners_count":22073618,"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":[],"created_at":"2024-11-06T23:38:38.041Z","updated_at":"2025-05-16T02:12:44.386Z","avatar_url":"https://github.com/lpeterse.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"concurrent-rpc\n==============\n\n[![Available on Hackage][badge-hackage]][hackage]\n[![License MIT][badge-license]][license]\n[![Build Status][badge-travis]][travis]\n\n### Summary\n\nThis library is small wrapper around `Control.Concurrent.MVar.MVar`s that can\nbe used to implement request-response communication between different threads.\n\n### Example\n\n```haskell\nmodule MissileLauncher where\n\nimport Control.Exception\nimport Control.Monad\nimport Control.Concurrent\nimport Control.Concurrent.Async\nimport Control.Concurrent.RPC\nimport Data.Word\nimport System.Random\n\ntype Missile    = Word\ntype LaunchSite = String\n\nmain :: IO ()\nmain = do\n  (launchMissile, withMissile) \u003c- newRPC\n  runMissileProduction launchMissile\n    `race_` runLaunchSite withMissile \"Redmond\"\n    `race_` runLaunchSite withMissile \"Cambridge\"\n\nrunLaunchSite :: WithRPC Missile LaunchSite -\u003e LaunchSite -\u003e IO ()\nrunLaunchSite withMissile site = forever $ do\n  sleepRandom\n  catch\n    ( withMissile $ \\missile-\u003e do\n        r \u003c- random100\n        if r \u003c 10\n          then error $ \"bad weather in \" ++ site\n          else do\n            printThread $ site ++ \": LAUNCH THE MISSILE!\"\n            return site\n    )\n    ( \\e-\u003e do\n      let _ = e :: SomeException\n      printThread $ site ++ \": Couldn't launch. Waiting for next missile.\"\n    )\n\nrunMissileProduction :: RPC Missile LaunchSite -\u003e IO ()\nrunMissileProduction launchMissile =\n  produce  `race_` produce `race_` produce `race_` produce\n  where\n    produce = forever $ do\n      sleepRandom\n      missile \u003c- randomIO :: IO Missile\n      catch\n        ( do\n            printThread $ \"Production: Ready to launch missile \" ++ show missile\n            site \u003c- launchMissile missile\n            printThread $ \"Production: Missile \" ++ show missile ++ \" launched in \" ++ site\n        )\n        ( \\e-\u003e\n            printThread $ \"Production: Missile \" ++ show missile ++\n                          \" failed to launch due to \" ++ show (e :: SomeException)\n        )\n\nprintThread :: Show a =\u003e a -\u003e IO ()\nprintThread x = do\n  threadId \u003c- myThreadId\n  random100 \u003e\u003e= \\x-\u003e threadDelay (x * 100)\n  putStrLn $ show threadId ++ \": \" ++ show x\n\nrandom100 :: IO Int\nrandom100 = (`mod` 100) \u003c$\u003e randomIO\n\nsleepRandom :: IO ()\nsleepRandom = random100 \u003e\u003e= \\x-\u003e threadDelay (x * 100000)\n```\n\n### Dependencies\n\n   - base \u003e= 4.7 \u0026\u0026 \u003c 5\n\n[badge-travis]: https://img.shields.io/travis/lpeterse/haskell-concurrent-rpc.svg\n[travis]: https://travis-ci.org/lpeterse/haskell-concurrent-rpc\n[badge-hackage]: https://img.shields.io/hackage/v/concurrent-rpc.svg?dummy\n[hackage]: https://hackage.haskell.org/package/concurrent-rpc\n[badge-license]: https://img.shields.io/badge/license-MIT-green.svg?dummy\n[license]: https://github.com/lpeterse/haskell-concurrent-rpc/blob/master/LICENSE\n[issues]: https://github.com/lpeterse/haskell-concurrent-rpc/issues\n[Github]: https://github.com/lpeterse/haskell-concurrent-rpc\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flpeterse%2Fhaskell-concurrent-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flpeterse%2Fhaskell-concurrent-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flpeterse%2Fhaskell-concurrent-rpc/lists"}