There's a trivial conversion from any shared option to a flavored 
optionFunc[T]:

type optionFunc[T any] func(*client)

func reflavor[T any]( shared func(*client)) optionFunc[T] {
    return optionFunc[T](shared)
}

I'm not sure exactly where reflavoring shared -> optionFunc[T] would fit in 
best, my first approach might be that the optionStructA and optionStructB 
could return appropriately flavored slices []optionFunc[A], []optionFunc[B].

Then, the A(), B() methods can accept only the right option flavor:

func (c *client) A( ...option[A])
func (c *client) B( ...option[B])
On Wednesday, July 27, 2022 at 9:44:15 PM UTC-7 Henry wrote:

> ```
> type WithSharedOption interface {
>    SomeMethod()
> }
>
> type OptionA struct {
> }
>
> func (a OptionA) SomeMethod(){}
>
> type OptionB struct {
> }
>
> func (b OptionB) SomeMethod(){}
>
> //without generics
> func WithShared(option WithSharedOption){}
> func WithANotShared(option OptionA){}
>
> //with generics
> func WithShared[T WithSharedOption](option T){}
> func WithANotShared(option OptionA){}
> ```
>
> On Thursday, July 28, 2022 at 6:12:16 AM UTC+7 John wrote:
>
>> As a note, this is how I solve this problem without generics:
>>
>> https://go.dev/play/p/nsDca0McADY
>>
>> On Wednesday, July 27, 2022 at 2:54:20 PM UTC-7 John wrote:
>>
>>> With 1.18 generics, I'm curious if anyone has a good solution using 
>>> generics to solve the optional argument that can be used in multiple method 
>>> problem.
>>>
>>> So say I have two methods, .A() and .B().  Both accept optional 
>>> arguments where some optional arguments might be shared.
>>>
>>> Here is a very loose (do not take any of this as the solution, just 
>>> trying to show what I'm kinda trying to achieve). 
>>>
>>> type AOptions struct{
>>>   Shared Opt string
>>>   NotSharedOpt bool
>>> }
>>>
>>> type BOptions struct{
>>>   Shared Opt string
>>>   NotSharedOpt int
>>> }
>>>
>>> func WithShared(shared string) CallOption {
>>>   ...
>>> }
>>>
>>> func WithANotShared(b bool) CallOption {
>>>   ...
>>> }
>>>
>>> func (c Client) A(options ...CallOption) {
>>>   opts := AOptions{}
>>>   for _, o := range options {
>>>     o(&opts)
>>>   }
>>>   ... 
>>> }
>>> func (c Client B(options ...CalOption) {
>>>   ...
>>> }
>>>
>>> We want to be able to use WithShared() with both A() and B(), but only  
>>> WithANotShared with the A() method.  
>>>
>>> I've had different solutions to this problem that would give runtime 
>>> errors, but I'm curious with generics if there is one for compile time that 
>>> anyone has come up with.
>>>
>>> Cheers.
>>>
>>

-- 
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/b1bd55ee-4298-4dee-809f-e4f0bfd7f942n%40googlegroups.com.

Reply via email to