samber / mo

🦄 Monads and popular FP abstractions, powered by Go 1.18+ Generics (Option, Result, Either...)
https://pkg.go.dev/github.com/samber/mo
MIT License
2.68k stars 87 forks source link

Feature Request: (or How-To) about call a method on Foldable when "T", "U" inherit from same interface #48

Open kcmvp opened 4 months ago

kcmvp commented 4 months ago

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.

samber commented 4 months ago

hi @kcmvp

I'm not sure to understand your requirements. Can you make a quick demo?

kcmvp commented 4 months ago

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") })

kcmvp commented 4 months ago
image

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

image

just as I high-light in red, some times this method return nothing just do some side effect.