And again (no need to make a cancelable context)
https://go2goplay.golang.org/p/3UFUaXijuX9

On Tue, 1 Dec 2020 at 22:59, roger peppe <rogpe...@gmail.com> wrote:

> Slightly simpler again: https://go2goplay.golang.org/p/mKdishv4nhT
>
> On Tue, 1 Dec 2020 at 18:44, roger peppe <rogpe...@gmail.com> wrote:
>
>> I'm having difficulty understanding exactly what your code is trying to
>> do (and why), and that makes it hard to understand what
>> generic solution might be appropriate.
>>
>> However, here's one alternative implementation that doesn't seem to run
>> into the same kind of issues that you did.
>> It changes the contract a little bit, but it's still within the spirit, I
>> think and it's somewhat simpler:
>>
>>     https://go2goplay.golang.org/p/cEWEUrvfZBl
>>
>> FWIW when I've implemented this kind of logic in the past, the aim is
>> usually to obtain at most one result. I don't really understand the use
>> case being implemented here.
>>
>> To address the actual question you raised:
>>
>> I ran into the situation where I need to "map" the futures of type
>>> *F[int], and *F[T] to *F[timeoutOrResult[T]].
>>
>>
>> There's no reason why interface types won't still play a large role in
>> the future where Go has generics, and that's
>> how I'd probably represent timeoutOrResult there, with a dynamic type
>> switch to decide which one you've got.
>>
>>   cheers,
>>     rog.
>>
>> On Mon, 30 Nov 2020 at 02:09, Matt Joiner <anacro...@gmail.com> wrote:
>>
>>> I had a muck around with go2 generics with my toy-ish futures package
>>> https://github.com/anacrolix/futures. The go1 implementation is in
>>> master, and a working go2 implementation in the go2 branch (using channels
>>> of different types instead of the attempt that follows). The package
>>> provides one function AsCompletedDelayed, that allows to favour futures
>>> over others with timeouts. The timeouts are implemented using the future
>>> type *F[int], where as the futures the user provides as arguments are
>>> *F[T]. In the implementation for AsCompletedDelayed I need to pass both
>>> types of futures to another function AsCompleted[T](fs ...*F[T]) <-chan
>>> *F[T], then differentiate them when they're returned: I could get back a
>>> "timeout" future, or a user/argument future. To do this I created another
>>> type timeoutOrResult[T] struct { timeout bool; timeoutIndex int; result T
>>> }, however now I ran into the situation where I need to "map" the futures
>>> of type *F[int], and *F[T] to *F[timeoutOrResult[T]]. This seems
>>> non-trivial: I believe in another language I would make F a Functor, and
>>> map the timeouts to something like `Either int T`. It is possible to write
>>> an Fmap on my *F type, but now I need to create new types, and break out an
>>> interface, and the implementation quickly increases in complexity.
>>>
>>> This seems like a situation where the go1 style of doing this was easier
>>> albeit without enforcing the result types of the futures in the return chan
>>> for AsCompleted and AsCompletedDelayed: I could pass arbitrary *Fs to
>>> AsCompleted, and then compare the returning *F against a map[*F]struct{}
>>> that tracked which ones were timeouts.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts+unsubscr...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/golang-nuts/adb04bb6-bdda-41a9-a168-2541dd912171n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/golang-nuts/adb04bb6-bdda-41a9-a168-2541dd912171n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAJhgaciV6WG1FHOn7X2jpoB6HLZ5c9H_TRXTjTs7z8HwK1KQWw%40mail.gmail.com.

Reply via email to