aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/utils/Rx.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/reading/utils/Rx.scala')
-rw-r--r--src/main/scala/reading/utils/Rx.scala44
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)
+ }
+}