package Apply import ( F "github.com/ibm/fp-go/function" ) // HKTFGA = HKT> // HKTFGB = HKT> // HKTFGAB = HKT B>> // HKTGA = HKT // HKTGB = HKT // HKTGAB = HKT B> func MonadAp[HKTGA, HKTGB, HKTGAB, HKTFGAB, HKTFGGAB, HKTFGA, HKTFGB any]( fap func(HKTFGGAB, HKTFGA) HKTFGB, fmap func(HKTFGAB, func(HKTGAB) func(HKTGA) HKTGB) HKTFGGAB, gap func(HKTGAB, HKTGA) HKTGB, fab HKTFGAB, fa HKTFGA) HKTFGB { return fap(fmap(fab, F.Bind1st(F.Bind1st[HKTGAB, HKTGA, HKTGB], gap)), fa) } // export function ap( // F: Apply, // G: Apply // ): (fa: HKT>) => (fab: HKT B>>) => HKT> { // return (fa: HKT>) => (fab: HKT B>>): HKT> => // F.ap( // F.map(fab, (gab) => (ga: HKT) => G.ap(gab, ga)), // fa // ) // } // function apFirst(A: Apply): (second: HKT) => (first: HKT) => HKT { // return (second) => (first) => // A.ap( // A.map(first, (a) => () => a), // second // ) // } // Functor.map: A>(fa: HKT, f: (a: A) => () => A) => HKT A> // Apply.ap: (fab: HKT A>, fa: HKT) => HKT func MonadApFirst[HKTGA, HKTGB, HKTGBA, A, B any]( fap func(HKTGBA, HKTGB) HKTGA, fmap func(HKTGA, func(A) func(B) A) HKTGBA, first HKTGA, second HKTGB, ) HKTGA { return fap( fmap(first, F.Constant1[B, A]), second, ) } func ApFirst[HKTGA, HKTGB, HKTGBA, A, B any]( fap func(HKTGBA, HKTGB) HKTGA, fmap func(HKTGA, func(A) func(B) A) HKTGBA, second HKTGB, ) func(HKTGA) HKTGA { return func(first HKTGA) HKTGA { return MonadApFirst(fap, fmap, first, second) } } func MonadApSecond[HKTGA, HKTGB, HKTGBB, A, B any]( fap func(HKTGBB, HKTGB) HKTGB, fmap func(HKTGA, func(A) func(B) B) HKTGBB, first HKTGA, second HKTGB, ) HKTGB { return fap( fmap(first, F.Constant1[A](F.Identity[B])), second, ) } func ApSecond[HKTGA, HKTGB, HKTGBB, A, B any]( fap func(HKTGBB, HKTGB) HKTGB, fmap func(HKTGA, func(A) func(B) B) HKTGBB, second HKTGB, ) func(HKTGA) HKTGB { return func(first HKTGA) HKTGB { return MonadApSecond(fap, fmap, first, second) } }