Skip to content

Commit cf96a0c

Browse files
committed
add methods for try and pair
1 parent 3ffab12 commit cf96a0c

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

core/src/main/scala/cats/instances/try.scala

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,36 @@ trait TryInstances extends TryInstances1 {
120120

121121
override def map[A, B](ta: Try[A])(f: A => B): Try[B] = ta.map(f)
122122

123+
override def as[A, B](ta: Try[A], b: B): Try[B] =
124+
ta match {
125+
case Success(_) => Success(b)
126+
case err: Failure[?] => castFailure[B](err)
127+
}
128+
129+
override def tupleLeft[A, B](ta: Try[A], b: B): Try[(B, A)] =
130+
ta match {
131+
case Success(a) => Success((b, a))
132+
case err: Failure[?] => castFailure[(B, A)](err)
133+
}
134+
135+
override def tupleRight[A, B](ta: Try[A], b: B): Try[(A, B)] =
136+
ta match {
137+
case Success(a) => Success((a, b))
138+
case err: Failure[?] => castFailure[(A, B)](err)
139+
}
140+
141+
override def fproduct[A, B](ta: Try[A])(f: A => B): Try[(A, B)] =
142+
ta match {
143+
case Success(a) => Success((a, f(a)))
144+
case err: Failure[?] => castFailure[(A, B)](err)
145+
}
146+
147+
override def fproductLeft[A, B](ta: Try[A])(f: A => B): Try[(B, A)] =
148+
ta match {
149+
case Success(a) => Success((f(a), a))
150+
case err: Failure[?] => castFailure[(B, A)](err)
151+
}
152+
123153
override def reduceLeftToOption[A, B](fa: Try[A])(f: A => B)(g: (B, A) => B): Option[B] =
124154
fa.map(f).toOption
125155

@@ -165,6 +195,12 @@ trait TryInstances extends TryInstances1 {
165195
case Success(a) => a :: Nil
166196
}
167197

198+
override def unzip[A, B](fab: Try[(A, B)]): (Try[A], Try[B]) =
199+
fab match {
200+
case Success((a, b)) => (Success(a), Success(b))
201+
case err: Failure[?] => (castFailure[A](err), castFailure[B](err))
202+
}
203+
168204
override def isEmpty[A](fa: Try[A]): Boolean = fa.isFailure
169205

170206
override def catchNonFatal[A](a: => A)(implicit ev: Throwable <:< Throwable): Try[A] = Try(a)

core/src/main/scala/cats/instances/tuple.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,27 @@ private[instances] trait Tuple2InstancesBinCompat0 {
5050

5151
implicit val catsDataFunctorForPair: Functor[λ[P => (P, P)]] = new Functor[λ[P => (P, P)]] {
5252
override def map[A, B](fa: (A, A))(f: A => B): (B, B) = (f(fa._1), f(fa._2))
53+
54+
override def as[A, B](fa: (A, A), b: B): (B, B) = (b, b)
55+
56+
override def tupleLeft[A, B](fa: (A, A), b: B): ((B, A), (B, A)) =
57+
((b, fa._1), (b, fa._2))
58+
59+
override def tupleRight[A, B](fa: (A, A), b: B): ((A, B), (A, B)) =
60+
((fa._1, b), (fa._2, b))
61+
62+
override def fproduct[A, B](fa: (A, A))(f: A => B): ((A, B), (A, B)) =
63+
((fa._1, f(fa._1)), (fa._2, f(fa._2)))
64+
65+
override def fproductLeft[A, B](fa: (A, A))(f: A => B): ((B, A), (B, A)) =
66+
((f(fa._1), fa._1), (f(fa._2), fa._2))
67+
68+
override def unzip[A, B](fab: ((A, B), (A, B))): ((A, A), (B, B)) =
69+
((fab._1._1, fab._2._1), (fab._1._2, fab._2._2))
70+
71+
private val unit: (Unit, Unit) = ((), ())
72+
73+
override def void[A](fa: (A, A)): (Unit, Unit) = unit
5374
}
5475
}
5576

0 commit comments

Comments
 (0)