{"id":25184578,"url":"https://github.com/xuender/flow","last_synced_at":"2025-04-04T08:40:33.361Z","repository":{"id":256929055,"uuid":"856847821","full_name":"xuender/flow","owner":"xuender","description":"A streaming programming library based on iterators for Go 1.23","archived":false,"fork":false,"pushed_at":"2024-11-08T02:50:58.000Z","size":209,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-09T19:40:49.505Z","etag":null,"topics":["go","go-iter","go123","goiter","golang","golang-iter","golang-library","library","streaming"],"latest_commit_sha":null,"homepage":"","language":"Go","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/xuender.png","metadata":{"files":{"readme":"README.md","changelog":"History.md","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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-13T10:16:02.000Z","updated_at":"2024-11-08T02:50:56.000Z","dependencies_parsed_at":"2024-11-08T03:31:22.314Z","dependency_job_id":"ac353af5-b333-480d-96e8-36489be9d005","html_url":"https://github.com/xuender/flow","commit_stats":null,"previous_names":["xuender/flow"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuender%2Fflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuender%2Fflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuender%2Fflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuender%2Fflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xuender","download_url":"https://codeload.github.com/xuender/flow/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247148980,"owners_count":20891948,"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":["go","go-iter","go123","goiter","golang","golang-iter","golang-library","library","streaming"],"created_at":"2025-02-09T19:33:16.201Z","updated_at":"2025-04-04T08:40:33.330Z","avatar_url":"https://github.com/xuender.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# flow\n\n[![Action][action-svg]][action-url]\n[![Report Card][goreport-svg]][goreport-url]\n[![codecov][codecov-svg]][codecov-url]\n[![Lines of code][lines-svg]][lines-url]\n[![godoc][godoc-svg]][godoc-url]\n[![License][license-svg]][license-url]\n\n✨ **`xuender/flow` is a streaming programming library based on `iter` for Go 1.23.**\n\n## ❗ Prerequirement\n\n- Go 1.23+\n- Not dependent on other libraries\n\n## 🚀 Install\n\n```shell\ngo get github.com/xuender/flow@latest\n```\n\n## 💡 Usage\n\n### Chain\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"github.com/xuender/flow\"\n  \"github.com/xuender/flow/seq\"\n)\n\nfunc main() {\n  start := time.Now()\n\n  for num :=range flow.Chain(\n    seq.Range(100),\n    flow.Filter(func(num int) bool { return num%3 == 0 }),\n    flow.Skip[int](5),\n    flow.Limit[int](4),\n    flow.Peek(func(num int) {\n      fmt.Println(\"peek\", num)\n      time.Sleep(time.Second)\n    }),\n    flow.Reverse[int](),\n  ) {\n    fmt.Println(num)\n  }\n\n  fmt.Printf(\"Chain: %v\\n\", time.Since(start))\n}\n```\n\nOutput:\n\n```shell\npeek 15\npeek 18\npeek 21\npeek 24\n24\n21\n18\n15\nChain: 4s\n```\n\n[[play](https://go.dev/play/p/-qmIigTfHXt)]\n\n### Parallel\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"github.com/xuender/flow\"\n  \"github.com/xuender/flow/seq\"\n)\n\nfunc main() {\n  start := time.Now()\n\n  for num := range flow.Parallel(3,\n    seq.Range(100),\n    flow.Filter(func(num int) bool { return num%3 == 0 }),\n    flow.Skip[int](5),\n    flow.Limit[int](4),\n    flow.Peek(func(num int) {\n      fmt.Println(\"peek\", num)\n      time.Sleep(time.Second)\n    }),\n    flow.Reverse[int](),\n  ) {\n    fmt.Println(num)\n  }\n\n  fmt.Printf(\"Parallel: %v\\n\", time.Since(start))\n}\n```\n\nOutput:\n\n```shell\npeek 15\npeek 18\npeek 21\npeek 24\n24\n21\n18\n15\nParallel: 2s\n```\n\n[[play](https://go.dev/play/p/1E76NdEwaoP)]\n\n### seq.Range\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n\n  \"github.com/xuender/flow/seq\"\n)\n\nfunc main() {\n  fmt.Println(\"seq.Range(3)\")\n\n  for num := range seq.Range(3) {\n    fmt.Println(num)\n  }\n\n  fmt.Println(\"\\nseq.Range(-2, -6)\")\n\n  for num := range seq.Range(-2, -6) {\n    fmt.Println(num)\n  }\n\n  fmt.Println(\"\\nseq.Range(2, 10, 3)\")\n\n  for num := range seq.Range(2, 10, 3) {\n    fmt.Println(num)\n  }\n\n  fmt.Println(\"\\nseq.Range(3, 7, 0)\")\n\n  for num := range seq.Range(3, 7, 0) {\n    fmt.Println(num)\n  }\n}\n```\n\nOutput:\n\n```shell\nseq.Range(3)\n0\n1\n2\n\nseq.Range(-2, -6)\n-2\n-3\n-4\n-5\n\nseq.Range(2, 10, 3)\n2\n5\n8\n\nseq.Range(3, 7, 0)\n3\n3\n3\n3\n```\n\n[[play](https://go.dev/play/p/-FZJfetngJY)]\n\n### Flow Functions\n\n| iter.Seq[V] | iter.Seq2[K,V] |\n| ----------- | -------------- |\n| Chain       | Chain2         |\n| Parallel    | Parallel2      |\n\n### Intermediate Functions\n\n| iter.Seq[V]       | iter.Seq2[K,V]  | Note                         |\n| ----------------- | --------------- | ---------------------------- |\n| Append            | Append2         |                              |\n| CenteredMovingAvg |                 |                              |\n| Concat            | Concat2         |                              |\n| Distinct          | Distinct2       |                              |\n| DropWhile         | DropWhile2      |                              |\n| Filter            | Filter2         | Parallel                     |\n| Limit             | Limit2          |                              |\n| Map               | Map2            | Parallel, Cannot change type |\n| Merge             | Merge2          |                              |\n| MovingAvg         |                 |                              |\n| Peek              | Peek2           | Parallel                     |\n| Prepend           | Prepend2        |                              |\n| Repeat            | Repeat2         |                              |\n| Reverse           | Reverse2        | Collecting                   |\n| Shuffle           | Shuffle2        | Collecting                   |\n| Skip              | Skip2           |                              |\n| Sort              | Sort2           | Collecting                   |\n| SortFunc          | SortFunc2       | Collecting                   |\n| SortStableFunc    | SortStableFunc2 | Collecting                   |\n| TakeWhile         | TakeWhile2      |                              |\n\n### Terminal Functions\n\n| iter.Seq[V]   | iter.Seq2[K,V] |\n| ------------- | -------------- |\n| seq.AllMatch  | seq.AllMatch2  |\n| seq.AnyMatch  | seq.AnyMatch2  |\n| seq.Clone     | seq.Clone2     |\n| seq.Chunk     | seq.Chunk2     |\n| seq.Count     | seq.Count2     |\n| seq.Each      | seq.Each2      |\n| seq.Emit      | seq.Emit2      |\n| seq.First     | seq.First2     |\n| seq.Last      | seq.Last2      |\n| seq.Join      |                |\n| seq.Max       | seq.Max2       |\n| seq.Min       | seq.Min2       |\n| seq.NoneMatch | seq.NoneMatch2 |\n| seq.Reduce    | seq.Reduce2    |\n| seq.Sum       |                |\n\n### Other Seq Functions\n\n| iter.Seq[V]           | iter.Seq2[K,V]        | Note                     |\n| --------------------- | --------------------- | ------------------------ |\n| seq.Append            | seq.Append2           |                          |\n| seq.CenteredMovingAvg |                       | Boundary effect at end   |\n| seq.Chan              | seq.Chan2             |                          |\n| seq.Concat            | seq.Concat2           |                          |\n| seq.Collect           | seq.Collect2          |                          |\n| seq.Distinct          | seq.Distinct2         |                          |\n| seq.DropWhile         | seq.DropWhile2        |                          |\n| seq.Filter            | seq.Filter2           |                          |\n| seq.FlatMap           |                       |                          |\n|                       | seq.Keys              |                          |\n| seq.Limit             | seq.Limit2            |                          |\n| seq.Map               | seq.Map2              |                          |\n| seq.Merge             | seq.Merge2            |                          |\n| seq.MovingAvg         |                       | Boundary effect at start |\n| seq.Partition         | seq.Partition2        | Block                    |\n| seq.Peek              | seq.Peek2             |                          |\n| seq.Prepend           | seq.Prepend2          |                          |\n| seq.Range             | seq.Range2            |                          |\n| seq.Reduce            | seq.Reduce2           |                          |\n| seq.Repeat            | seq.Repeat2           |                          |\n| seq.Reverse           | seq.Reverse2          |                          |\n| seq.Send              | seq.Send2             |                          |\n| seq.Seq               | seq.Seq2              |                          |\n| seq.Shuffle           | seq.Shuffle2          |                          |\n| seq.Skip              | seq.Skip2             |                          |\n| seq.Sorted            | seq.Sorted2           |                          |\n| seq.SortedFunc        | seq.SortedFunc2       |                          |\n| seq.SortedStableFunc  | seq.SortedStableFunc2 |                          |\n| seq.TakeWhile         | seq.TakeWhile2        |                          |\n| seq.ToChans           | seq.ToChans2          |                          |\n|                       | seq.Tuples            |                          |\n|                       | seq.Values            |                          |\n| seq.Window            | seq.Window2           |                          |\n| seq.Zip               |                       |                          |\n\n### Custom Step[V] / Step2[K,V] function\n\nRefer to `Append`, `Sored`, `Filter`, etc.\n\nps: Attention Parallel.\n\n## 👤 Contributors\n\n![Contributors][contributors-svg]\n\n## 📝 License\n\n© ender, 2024~time.Now\n\n[MIT LICENSE][license-url]\n\n[action-url]: https://github.com/xuender/flow/actions\n[action-svg]: https://github.com/xuender/flow/workflows/Go/badge.svg\n\n[goreport-url]: https://goreportcard.com/report/github.com/xuender/flow\n[goreport-svg]: https://goreportcard.com/badge/github.com/xuender/flow\n\n[codecov-url]: https://codecov.io/gh/xuender/flow\n[codecov-svg]: https://codecov.io/gh/xuender/flow/graph/badge.svg?token=1VAC5OJJZR\n\n[godoc-url]: https://godoc.org/github.com/xuender/flow\n[godoc-svg]: https://godoc.org/github.com/xuender/flow?status.svg\n\n[license-url]: https://github.com/xuender/flow/blob/master/LICENSE\n[license-svg]: https://img.shields.io/badge/license-MIT-blue.svg\n\n[contributors-svg]: https://contrib.rocks/image?repo=xuender/flow\n\n[lines-svg]: https://sloc.xyz/gitee/xuender/flow\n[lines-url]: https://github.com/boyter/scc\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuender%2Fflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxuender%2Fflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuender%2Fflow/lists"}