diff options
Diffstat (limited to 'src/main/scala/reading/utils/Rx.scala')
-rw-r--r-- | src/main/scala/reading/utils/Rx.scala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/main/scala/reading/utils/Rx.scala b/src/main/scala/reading/utils/Rx.scala new file mode 100644 index 0000000..83de617 --- /dev/null +++ b/src/main/scala/reading/utils/Rx.scala @@ -0,0 +1,44 @@ +package reading.utils + +import scala.util.{Failure, Success} + +import org.scalajs.dom.Element + +import scalatags.JsDom.all._ +import rx._ + +import Ctx.Owner.Unsafe._ + +object RxTag { + def apply(r: Ctx.Data => HtmlTag): HtmlTag = + rxMod(Rx(r(implicitly[Ctx.Data]))) + + private def rxMod(r: Rx[HtmlTag]): HtmlTag = { + def rSafe = r.toTry match { + case Success(v) => v.render + case Failure(e) => span(e.toString, backgroundColor := "red").render + } + var last = rSafe + r.trigger { + val newLast = rSafe + Option(last.parentElement).foreach { + _.replaceChild(newLast, last) + } + last = newLast + } + span( + bindNode(last) + ) + } +} + +object RxAttr { + def apply[Builder, T: AttrValue](attr: scalatags.generic.Attr, v: Rx[T]) = { + val attrValue = new AttrValue[Rx[T]] { + def apply(t: Element, a: Attr, r: Rx[T]): Unit = { + val _ = r.trigger { implicitly[AttrValue[T]].apply(t, a, r.now) } + } + } + scalatags.generic.AttrPair(attr, v, attrValue) + } +} |