diff --git a/result/src/main/scala/uscala/result/Result.scala b/result/src/main/scala/uscala/result/Result.scala index 8cdddb7..e08c574 100644 --- a/result/src/main/scala/uscala/result/Result.scala +++ b/result/src/main/scala/uscala/result/Result.scala @@ -52,6 +52,8 @@ sealed abstract class Result[+A, +B] extends Product with Serializable { x } + def bitap[U](sideEffect: => U): Result[A, B] = this.bimap(a => { sideEffect; a }, b => { sideEffect; b }) + def swap: Result[B, A] = fold(Ok(_), Fail(_)) def merge[AA >: A](implicit ev: B <:< AA): AA = fold(identity, ev.apply) diff --git a/result/src/test/scala/uscala/result/ResultSpec.scala b/result/src/test/scala/uscala/result/ResultSpec.scala index e8f4bf0..f01242d 100644 --- a/result/src/test/scala/uscala/result/ResultSpec.scala +++ b/result/src/test/scala/uscala/result/ResultSpec.scala @@ -106,19 +106,33 @@ class ResultSpec extends Specification with ScalaCheck { "tap" >> { "should not execute the given f if Fail" >> prop { n: Int => var executed = false - Fail(n).tap { _ => executed = true } + Fail(n).tap(_ => executed = true) executed must beFalse } "should execute the given f if Ok, passing the Ok value" >> prop { n: Int => var received: Option[Int] = None - Ok(n).tap { x => received = Some(x) } + Ok(n).tap(x => received = Some(x)) received must beSome(n) } "should execute the given f if Ok, leaving the result untouched" >> prop { n: Int => var executed = false - Ok(n).tap { _ => executed = true } must_=== Ok(n) + Ok(n).tap(_ => executed = true) must_=== Ok(n) + executed must beTrue + } + } + + "bitap" >> { + "should execute the given effect if Fail, leaving the result untouched" >> prop { n: Int => + var executed = false + Fail(n).bitap { executed = true } must_=== Fail(n) + executed must beTrue + } + + "should execute the given effect if Ok, leaving the result untouched" >> prop { n: Int => + var executed = false + Ok(n).bitap { executed = true } must_=== Ok(n) executed must beTrue } }