{"id":16660015,"url":"https://github.com/bsless/2021-nov-transducers-workshop","last_synced_at":"2025-12-29T00:30:03.570Z","repository":{"id":46018352,"uuid":"423969823","full_name":"bsless/2021-nov-transducers-workshop","owner":"bsless","description":null,"archived":false,"fork":false,"pushed_at":"2021-11-19T18:27:23.000Z","size":461,"stargazers_count":4,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-08T19:34:36.870Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","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/bsless.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-11-02T19:15:38.000Z","updated_at":"2023-03-22T04:06:53.000Z","dependencies_parsed_at":"2022-08-24T19:31:32.336Z","dependency_job_id":null,"html_url":"https://github.com/bsless/2021-nov-transducers-workshop","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/bsless%2F2021-nov-transducers-workshop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsless%2F2021-nov-transducers-workshop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsless%2F2021-nov-transducers-workshop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsless%2F2021-nov-transducers-workshop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bsless","download_url":"https://codeload.github.com/bsless/2021-nov-transducers-workshop/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243293768,"owners_count":20268139,"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-10-12T10:27:31.656Z","updated_at":"2025-12-29T00:30:03.542Z","avatar_url":"https://github.com/bsless.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"#+TITLE: re:Clojure transducers workshop\n\n\n* Description\n\nTransducers are a powerful abstraction added relatively recently to Clojure.\nIn spite of this and the noticeable performance benefits, they remain a\ndaunting subject for many Clojurians.\n\nThere is no reason such an important subject remain impenetrable.\n\nWe will approach them in this workshop from first principles and see how\nthey emerge naturally as a general property in many places.\n\nBy the end of the workshop, participants will have a better\nunderstanding of transducers, their use cases, and will be comfortable\nwriting their own simple transducers when the need arises.\n\n* Agenda\n\n- loop/reduce equivalence: everything written using a loop can be\n  written using reduce, and vice versa\n- implementing your own map and filter: for some it's easier with loop.\n  the previous point shows there is a transformation to reduce\n- understanding the invariant: in a reducing context, always one\n  quantity is decreased while the other is increased (reducible and\n  accumulator)\n- Factoring out accumulation and consumption from reduction step. doing\n  it twice for map and filter is sufficient\n- Understanding the underlying push-pull semantics\n- Understanding what's a reducing function\n- Transducers as a transformation of a reducing function\n- Stateful transducers\n\n* Material\n\nsee the [[PRESENTATION.org]] for a literate programming walk-through of the\nworkshop.\n\nGo along with the workshop by hacking on the scratch.clj file\n\nSee [[extra.org]] for further exercises and discussion\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsless%2F2021-nov-transducers-workshop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbsless%2F2021-nov-transducers-workshop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsless%2F2021-nov-transducers-workshop/lists"}