{"id":20042703,"url":"https://github.com/webcpu/sodium-swift","last_synced_at":"2026-05-10T13:34:01.683Z","repository":{"id":72215796,"uuid":"120931464","full_name":"webcpu/sodium-swift","owner":"webcpu","description":"Swift implementation of Sodium FRP (Functional Reactive Programming) library based on SodiumFRP/sodium-swift","archived":false,"fork":false,"pushed_at":"2019-05-02T21:13:11.000Z","size":970,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-12T19:35:52.742Z","etag":null,"topics":["frp","functional-reactive-programming","ios","macos","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webcpu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","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":"2018-02-09T16:51:31.000Z","updated_at":"2019-05-02T21:12:10.000Z","dependencies_parsed_at":"2023-05-31T09:00:30.036Z","dependency_job_id":null,"html_url":"https://github.com/webcpu/sodium-swift","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2Fsodium-swift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2Fsodium-swift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2Fsodium-swift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2Fsodium-swift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webcpu","download_url":"https://codeload.github.com/webcpu/sodium-swift/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241470630,"owners_count":19968071,"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":["frp","functional-reactive-programming","ios","macos","swift"],"created_at":"2024-11-13T10:52:53.940Z","updated_at":"2026-05-10T13:33:56.653Z","avatar_url":"https://github.com/webcpu.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sodium-swift\n## Introduction\nFunctional Reactive Programming (FRP) library.\n\nThis library is based on https://github.com/SodiumFRP/sodium-swift\nThe original sodium-swift only supports Swift 3, that's why I migrated sodium-swift to Swift 4 and created a new repo.\n\nIf you’re familiar with the idea of a domain-specific language (DSL), then you can understand FRP as a minimal complete DSL for stateful logic.\n\nSodium-swift replaces listeners (also known as callbacks) in the widely used observer pattern, making your code cleaner, clearer, more robust, and more maintainable—in a word, simpler.\n\n## Examples\n### Counter\nThis is a counter app. To increase the value, tap plus button; to decrease the value, tap minus button. The magic is that you don't have to use a mutable variable to store the value.\n\n\u003cimg width=\"540\" alt=\"counter\" src=\"https://user-images.githubusercontent.com/4646838/36064751-d8a00752-0e8f-11e8-81e9-13320a3b7234.png\"\u003e\n\n```swift\nimport UIKit\nimport SodiumCocoa\nimport SodiumSwift\n\nclass CounterViewController: UIViewController {\n    @IBOutlet weak var counterLabel: NALabel!\n    @IBOutlet weak var upButton: NAButton!\n    @IBOutlet weak var downButton: NAButton!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        counterLabel.txt = count(upButton, downButton)\n    }\n}\n\nfunc count(_ upButton: NAButton!, _ downButton: NAButton!) -\u003e Cell\u003cString\u003e {\n    let sUp          = upButton.clicked.mapTo(1)\n    let sDown        = downButton.clicked.mapTo(-1)\n    return sUp.orElse(sDown).accum(0, f: +).map({String($0)})\n}\n```\n\n### Math Quiz\nThis is a math app. When you tap the next button, it will show a new math question and the previous question's answer.\n\n\u003cimg src=\"https://user-images.githubusercontent.com/4646838/36061995-bd7bba2e-0e63-11e8-9bae-dcc525bfad99.png\"  width=\"540\"\u003e\n\n\n```swift\nimport UIKit\nimport SodiumSwift\nimport SodiumCocoa\n\nclass QuestionViewController: UIViewController {\n    @IBOutlet weak var questionLabel: NALabel!\n    @IBOutlet weak var answerLabel: NALabel!\n    @IBOutlet weak var nextButton: NAButton!\n\n    var count: Int64 = loadCount()\n\n    let sViewDidLoad = StreamSink\u003cSUnit\u003e()\n    let sNextButton  = StreamSink\u003cSUnit\u003e()\n\n    @IBAction func next(_ sender: AnyObject) {\n        sNextButton.send(SUnit.value)\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        sViewDidLoad.send(SUnit.value)\n        setupQuiz()\n    }\n\n    func setupQuiz() {\n        let sArithmeticExpression = sViewDidLoad.orElse(sNextButton).map(createQuestion)\n        questionLabel.txt         = createQuestionEndPoint(sArithmeticExpression)\n        answerLabel.txt           = createAnswerEndPoint(sArithmeticExpression)\n    }\n}\n```\n\n## Prerequisites\n- Xcode Command Line Tools\n   \n   ```\n   $ xcode-select --install\n   ```\n  \n- Brew\n\n  https://brew.sh\n  \n- Carthage\n\n   ```\n   $ brew install Carthage\n   ```  \n\n## Build \n### Carthage\n**Create a Cartfile in your project's root directory.**\n\n```\ngithub \"unchartedworks/sodium-swift\"\n```\n**Build**\n\n```\n$ carthage update\n```\n        \n**Add the framework(s) to your project**\n\n**iOS**\n\n./Carthage/Build/iOS/\n\nSodiumSwift.framework\n\nSodiumCocoa.framework\n\n**macOS**\n\n./Carthage/Build/Mac/\n\nSodiumSwift.framework\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcpu%2Fsodium-swift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebcpu%2Fsodium-swift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcpu%2Fsodium-swift/lists"}