From 4a453a41314137fffb422b3f107dc66830008ab0 Mon Sep 17 00:00:00 2001 From: Samuel Berthe Date: Mon, 20 Mar 2023 18:40:19 +0100 Subject: [PATCH] fix: Async and AsyncX now returns read-only channels --- CHANGELOG.md | 5 +++++ concurrency.go | 16 ++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8adade70..0d5c0e43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ @samber: I sometimes forget to update this file. Ping me on [Twitter](https://twitter.com/samuelberthe) or open an issue in case of error. We need to keep a clear changelog for easier lib upgrade. +## 1.38.0 (2023-xx-xx) + +Improvement: +- Async and AsyncX: now returns `<-chan T` instead of `chan T` + ## 1.38.0 (2023-03-20) Adding: diff --git a/concurrency.go b/concurrency.go index 4a5db1da..d0aca2aa 100644 --- a/concurrency.go +++ b/concurrency.go @@ -26,7 +26,7 @@ func Synchronize(opt ...sync.Locker) *synchronize { } // Async executes a function in a goroutine and returns the result in a channel. -func Async[A any](f func() A) chan A { +func Async[A any](f func() A) <-chan A { ch := make(chan A, 1) go func() { ch <- f() @@ -35,7 +35,7 @@ func Async[A any](f func() A) chan A { } // Async0 executes a function in a goroutine and returns a channel set once the function finishes. -func Async0(f func()) chan struct{} { +func Async0(f func()) <-chan struct{} { ch := make(chan struct{}, 1) go func() { f() @@ -45,12 +45,12 @@ func Async0(f func()) chan struct{} { } // Async1 is an alias to Async. -func Async1[A any](f func() A) chan A { +func Async1[A any](f func() A) <-chan A { return Async(f) } // Async2 has the same behavior as Async, but returns the 2 results as a tuple inside the channel. -func Async2[A any, B any](f func() (A, B)) chan Tuple2[A, B] { +func Async2[A any, B any](f func() (A, B)) <-chan Tuple2[A, B] { ch := make(chan Tuple2[A, B], 1) go func() { ch <- T2(f()) @@ -59,7 +59,7 @@ func Async2[A any, B any](f func() (A, B)) chan Tuple2[A, B] { } // Async3 has the same behavior as Async, but returns the 3 results as a tuple inside the channel. -func Async3[A any, B any, C any](f func() (A, B, C)) chan Tuple3[A, B, C] { +func Async3[A any, B any, C any](f func() (A, B, C)) <-chan Tuple3[A, B, C] { ch := make(chan Tuple3[A, B, C], 1) go func() { ch <- T3(f()) @@ -68,7 +68,7 @@ func Async3[A any, B any, C any](f func() (A, B, C)) chan Tuple3[A, B, C] { } // Async4 has the same behavior as Async, but returns the 4 results as a tuple inside the channel. -func Async4[A any, B any, C any, D any](f func() (A, B, C, D)) chan Tuple4[A, B, C, D] { +func Async4[A any, B any, C any, D any](f func() (A, B, C, D)) <-chan Tuple4[A, B, C, D] { ch := make(chan Tuple4[A, B, C, D], 1) go func() { ch <- T4(f()) @@ -77,7 +77,7 @@ func Async4[A any, B any, C any, D any](f func() (A, B, C, D)) chan Tuple4[A, B, } // Async5 has the same behavior as Async, but returns the 5 results as a tuple inside the channel. -func Async5[A any, B any, C any, D any, E any](f func() (A, B, C, D, E)) chan Tuple5[A, B, C, D, E] { +func Async5[A any, B any, C any, D any, E any](f func() (A, B, C, D, E)) <-chan Tuple5[A, B, C, D, E] { ch := make(chan Tuple5[A, B, C, D, E], 1) go func() { ch <- T5(f()) @@ -86,7 +86,7 @@ func Async5[A any, B any, C any, D any, E any](f func() (A, B, C, D, E)) chan Tu } // Async6 has the same behavior as Async, but returns the 6 results as a tuple inside the channel. -func Async6[A any, B any, C any, D any, E any, F any](f func() (A, B, C, D, E, F)) chan Tuple6[A, B, C, D, E, F] { +func Async6[A any, B any, C any, D any, E any, F any](f func() (A, B, C, D, E, F)) <-chan Tuple6[A, B, C, D, E, F] { ch := make(chan Tuple6[A, B, C, D, E, F], 1) go func() { ch <- T6(f())