Created
March 2, 2014 22:49
-
-
Save przemek-pokrywka/9315172 to your computer and use it in GitHub Desktop.
How to get None when reduction was not applied and Some(value) when it did in scala.rx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package frp | |
import rx._ | |
import rx.ops._ | |
object Demo extends App { | |
case class Val[+T](value: T, reduced: Boolean = false) { | |
def toOpt = if (reduced) Some(value) else None | |
} | |
implicit class MyRxOps[+T](val source: Rx[T]) extends AnyVal{ | |
def reducedOnly[A >: T](combiner: (A, A) => A): Rx[Option[A]] = { | |
source.map(Val(_)) reduce { (a: Val[A], b: Val[A]) => | |
Val(combiner(a.value, b.value), reduced = true) | |
} map (_.toOpt) | |
} | |
} | |
val price = Var(1) | |
val deltas = price.reducedOnly((oldVal, newVal) => newVal - oldVal) | |
println(deltas()) // there was only one price, so deltas should be None | |
price() = 2 | |
println(deltas()) // price went up by 1 | |
price() = 3 | |
println(deltas()) // price went up by 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment