{"id":15405693,"url":"https://github.com/zverok/enumerator_generate","last_synced_at":"2025-10-16T21:45:53.822Z","repository":{"id":62558102,"uuid":"134306772","full_name":"zverok/enumerator_generate","owner":"zverok","description":"Enumerator#generate Ruby core proposal demo","archived":false,"fork":false,"pushed_at":"2018-06-06T09:07:30.000Z","size":11,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-04-24T08:26:15.969Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/zverok.png","metadata":{"files":{"readme":"README.md","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":"2018-05-21T18:07:55.000Z","updated_at":"2018-12-28T04:34:45.000Z","dependencies_parsed_at":"2022-11-03T06:45:21.786Z","dependency_job_id":null,"html_url":"https://github.com/zverok/enumerator_generate","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/zverok%2Fenumerator_generate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fenumerator_generate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fenumerator_generate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fenumerator_generate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zverok","download_url":"https://codeload.github.com/zverok/enumerator_generate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249299692,"owners_count":21246879,"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-01T16:18:16.714Z","updated_at":"2025-10-16T21:45:48.785Z","avatar_url":"https://github.com/zverok.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `Enumerator#generate`\n\nThis is an alternative to [`Object#enumerate`](https://github.com/zverok/object_enumerate) Ruby language core proposal. Goal is the same: generating enumerators which can idiomatically replace (most of) `while` and `loop` cycles.\n\nAfter some experiments, it turns out that \"start from initial value, and continue with this block\" (like `Object#enumerate` does) is not the only important use case. \"Just enumerate with this block\" is equally important, and `Enumerator#generate` supports this case finely. Also, the call sequence seems to be less confusing, it is pretty straight: `Enumerator#generate` generates an enumerator from block and optional initial value.\n\n## Synopsys\n\n`Enumerator#generate` takes a block and optional initial value, and generates (infinite) enumerator by applying the block to result of previous iteration. If initial value is not passed, first block receives no arguments.\n\n## Examples of usage\n\n### With initial value\n\n```ruby\n# Infinite sequence\np Enumerator.generate(1, \u0026:succ).take(5)\n# =\u003e [1, 2, 3, 4, 5]\n\n# Easy Fibonacci\np Enumerator.generate([0, 1]) { |f0, f1| [f1, f0 + f1] }.take(10).map(\u0026:first)\n#=\u003e [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n\nrequire 'date'\n\n# Find next Tuesday\np Enumerator.generate(Date.today, \u0026:succ).detect { |d| d.wday == 2 }\n# =\u003e #\u003cDate: 2018-05-22 ((2458261j,0s,0n),+0s,2299161j)\u003e\n```\n(Other examples from [`Object#enumerate`](https://github.com/zverok/object_enumerate) are easily translated, too.)\n\n### Without initial value\n\n```ruby\n# Random search\ntarget = 7\np Enumerator.generate { rand(10) }.take_while { |i| i != target }.to_a\n# =\u003e [0, 6, 3, 5,....]\n\n# External while condition\nrequire 'strscan'\nscanner = StringScanner.new('7+38/6')\np Enumerator.generate { scanner.scan(%r{\\d+|[-+*/]}) }.slice_after { scanner.eos? }.first\n# =\u003e [\"7\", \"+\", \"38\", \"/\", \"6\"]\n\n# Potential message loop system:\nEnumerator.generate { Message.receive }.take_while { |msg| msg != :exit }\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzverok%2Fenumerator_generate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzverok%2Fenumerator_generate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzverok%2Fenumerator_generate/lists"}