From 97dc0c2ee6c6a24358f60d5907d27b7720ab3a1e Mon Sep 17 00:00:00 2001 From: "Kai(luo) Wang" Date: Fri, 9 Nov 2018 09:08:44 -0500 Subject: [PATCH] Optimize `Apply` methods in `FlatMap` (#2597) * optimize productL/R in FlatMap * slightly optimized ap2 and map2 as well * reorg * fmt --- core/src/main/scala/cats/FlatMap.scala | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/main/scala/cats/FlatMap.scala b/core/src/main/scala/cats/FlatMap.scala index 3eed2777f2..ccdc96fff9 100644 --- a/core/src/main/scala/cats/FlatMap.scala +++ b/core/src/main/scala/cats/FlatMap.scala @@ -89,6 +89,18 @@ import simulacrum.noop override def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] = flatMap(fa)(a => map(fb)(b => (a, b))) + override def ap2[A, B, Z](ff: F[(A, B) => Z])(fa: F[A], fb: F[B]): F[Z] = + flatMap(fa)(a => flatMap(fb)(b => map(ff)(_(a, b)))) + + override def map2[A, B, Z](fa: F[A], fb: F[B])(f: (A, B) => Z): F[Z] = + flatMap(fa)(a => map(fb)(b => f(a, b))) + + override def productR[A, B](fa: F[A])(fb: F[B]): F[B] = + flatMap(fa)(_ => fb) + + override def productL[A, B](fa: F[A])(fb: F[B]): F[A] = + map2(fa, fb)((a, _) => a) + /** * Pair `A` with the result of function application. *