Open kcmvp opened 4 months ago
hi @kcmvp
I'm not sure to understand your requirements. Can you make a quick demo?
either := lo.IfF(typ.Interface(), func() mo.Either[*types.Interface, *types.Named] { return mo.Left[*types.Interface, *types.Named](typ.Type().Underlying().(*types.Interface)) }).ElseF(func() mo.Either[*types.Interface, *types.Named] { return mo.Right[*types.Interface, *types.Named](typ.Type().(*types.Named)) }) mo.Fold[*types.Interface, *types.Named, string](either, func(named *types.Named) string { panic("1:should be the same" + "2: the method may return nothing") }, func(t *types.Interface) string { panic("1:should be the same" + "2: the method may return nothing") })
1: in either case(case1, case2) the logic should be the same, as types.Interface and types.Named may inherit from same interface type.TypeSet (explict or implict) So In my case I hope there is just one function as parameter as below
Fold[T, U, R any](f Foldable[T, U], process func(ts type.TypeSet) string) string
T -> types.Interface
U -> types.Named
just as I high-light in red, some times this method return nothing just do some side effect.
type Foldable[T any, U any] interface { leftValue() T rightValue() U hasLeftValue() bool }
here is the my case: 1: I build a mo.Either base on a if/else, saying Either[A,B], A and B implement same interface C 2: I build a Foldable from the either. but I want to execute same function on the foldable.
right now the API must pass in two method "successFunc" and "failureFunc", for the case i describe seems redundant
by the way, of course, I can use case assert cast A or B to C. and then call the method.