From 80b32b063ef3693a6f4be8eaf417bb8db10b37f7 Mon Sep 17 00:00:00 2001 From: Rohan Sircar Date: Sun, 20 Dec 2020 15:35:06 +0530 Subject: [PATCH] Added implicit conversion for fx obs filter methods --- .../MySfxObservableImplicits.scala} | 36 +++++++++++++++---- .../nova/monadic_sfx/implicits/package.scala | 2 +- 2 files changed, 30 insertions(+), 8 deletions(-) rename src/main/scala/nova/monadic_sfx/{util/Misc.scala => implicits/MySfxObservableImplicits.scala} (52%) diff --git a/src/main/scala/nova/monadic_sfx/util/Misc.scala b/src/main/scala/nova/monadic_sfx/implicits/MySfxObservableImplicits.scala similarity index 52% rename from src/main/scala/nova/monadic_sfx/util/Misc.scala rename to src/main/scala/nova/monadic_sfx/implicits/MySfxObservableImplicits.scala index 2886966..2b602d8 100644 --- a/src/main/scala/nova/monadic_sfx/util/Misc.scala +++ b/src/main/scala/nova/monadic_sfx/implicits/MySfxObservableImplicits.scala @@ -1,21 +1,42 @@ -package nova.monadic_sfx.util +package nova.monadic_sfx.implicits import scalafx.beans.property.ObjectProperty import scalafx.beans.property.ReadOnlyObjectProperty import scalafx.beans.value.ObservableValue -object Misc { +/** + * experimental implicits to be incorporated better later + */ +trait MySfxObservableImplicits { + import nova.monadic_sfx.implicits.ExtraObservableImplicits._ + implicit def myRichObservable[A, C]( + observable: ObservableValue[A, C] + ): MyRichObservable[A, C] = new MyRichObservable(observable) +} + +object ExtraObservableImplicits { - implicit final class MyRichObservable[A, C](val self: ObservableValue[A, C]) + final class MyRichObservable[A, C](val self: ObservableValue[A, C]) extends AnyVal { def filter(f: A => Boolean): ReadOnlyObjectProperty[A] = - Method.filter(self)(f) - def filterNull: ReadOnlyObjectProperty[A] = Method.filterNull(self) + Methods.filter(self)(f) + + /** + * Simply creates a new observable that mirrors the source observable but + * doesn't emit null values. JavaFX likes to work with null values in scene + * nodes/properties (shrugs) and observables by default emit null values + * that can cause crashes if you forget to null check. ScalaFX does not + * offer any *fixes* for this. + */ + def filterNull: ReadOnlyObjectProperty[A] = Methods.filterNull(self) } } -object Method { +object Types { type Observable[A] = ObservableValue[A, _] +} +object Methods { + import Types._ def filter[B]( a: Observable[B] @@ -38,7 +59,8 @@ object Method { * Simply creates a new observable that mirrors the source observable but * doesn't emit null values. JavaFX likes to work with null values in scene * nodes/properties (shrugs) and observables by default emit null values - * that can cause crashes. ScalaFX does not offer any *fixes* for this + * that can cause crashes if you forget to null check. ScalaFX does not + * offer any *fixes* for this. * * @param a * @return diff --git a/src/main/scala/nova/monadic_sfx/implicits/package.scala b/src/main/scala/nova/monadic_sfx/implicits/package.scala index ab34862..c069c65 100644 --- a/src/main/scala/nova/monadic_sfx/implicits/package.scala +++ b/src/main/scala/nova/monadic_sfx/implicits/package.scala @@ -7,7 +7,7 @@ import monix.reactive.Observable import monix.reactive.OverflowStrategy import scalafx.scene.control._ -package object implicits { +package object implicits extends MySfxObservableImplicits { implicit class MyButtonExt(val button: Button) extends AnyVal { def observableAction(): Observable[ActionEvent] = {