{"id":49274006,"url":"https://github.com/mf42-dzh/transduction","last_synced_at":"2026-04-25T15:05:31.475Z","repository":{"id":153695699,"uuid":"502447562","full_name":"MF42-DZH/transduction","owner":"MF42-DZH","description":"Clojure's transducers in Scala.","archived":false,"fork":false,"pushed_at":"2022-06-14T08:31:30.000Z","size":1140,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2023-09-13T01:03:40.070Z","etag":null,"topics":["composable-functions","functional-programming","library","reducers","scala","transducers"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MF42-DZH.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,"governance":null}},"created_at":"2022-06-11T20:16:46.000Z","updated_at":"2023-09-13T01:03:44.575Z","dependencies_parsed_at":null,"dependency_job_id":"ffc5392d-1d97-4e41-a59a-ac901f1b6169","html_url":"https://github.com/MF42-DZH/transduction","commit_stats":null,"previous_names":["mf42-dzh/transduction"],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/MF42-DZH/transduction","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MF42-DZH%2Ftransduction","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MF42-DZH%2Ftransduction/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MF42-DZH%2Ftransduction/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MF42-DZH%2Ftransduction/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MF42-DZH","download_url":"https://codeload.github.com/MF42-DZH/transduction/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MF42-DZH%2Ftransduction/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32266029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: 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":["composable-functions","functional-programming","library","reducers","scala","transducers"],"created_at":"2026-04-25T15:05:19.179Z","updated_at":"2026-04-25T15:05:31.467Z","avatar_url":"https://github.com/MF42-DZH.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Transduction\n\nClojure's [transducers](https://clojure.org/reference/transducers) in Scala.\n\nInspired by Clojure's implementation (obviously) and [this Haskell\nimplementation and theory](https://hypirion.com/musings/haskell-transducers).\n\nDocumentation can be found [here](https://0xfc963f18dc21.github.io/transduction/).\n\n## What are they?\n\nTransducers are applicable objects that transform reducers. If you've ever\nworked with folding or reduction in a functional language, a reducer is\nsimply a representation of the reduction function used in those functions.\n\nA reducer has three effective signatures:\n\n- **Identity**: The identity of the reducer. Given when no initial value is used\n  for the reduction. E.g. for integer reducers, 0 is the default identity\n  for addition reductions, and 1 is the default identity for multiplication\n  reductions. (`identity: R`)\n- **Completion**: The \"finaliser\" of a reducer. Called upon the result of the\n  reduction as a final transformation. (`completion: R =\u003e R`)\n- **Step**: The actual reduction part of a reducer. Called with the current\n  accumulated reduction and the current item to be reduced. (`stepL: R =\u003e A =\u003e R`,\n  `stepR: A =\u003e R =\u003e R`)\n\nA transducer adds a layer of transformation onto these reducers, and can be both\nstateful or stateless. They are also composeable using simple function composition.\n\nThis library aims to provide interfaces for creating immutable and mutable state\ntransducers and the ability to use them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmf42-dzh%2Ftransduction","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmf42-dzh%2Ftransduction","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmf42-dzh%2Ftransduction/lists"}