diff --git a/build.sbt b/build.sbt index 22bcae8..4c0dd1a 100644 --- a/build.sbt +++ b/build.sbt @@ -75,3 +75,48 @@ lazy val plugin = project.in(file("sbt-plugin")). +lazy val monixInterop = project.in(file("interop/monix")). + settings(commonSettings: _*). + settings( + name := "scala-js-chrome-monix", + scalaVersion := "2.11.8", + crossScalaVersions := Seq("2.10.6", "2.11.8"), + persistLauncher := false, + persistLauncher in Test := false, + libraryDependencies ++= Seq( + "io.monix" %%% "monix" % "2.0-RC10" + ), + publishMavenStyle := true, + publishTo := { + val nexus = "https://oss.sonatype.org/" + if (isSnapshot.value) + Some("snapshots" at nexus + "content/repositories/snapshots") + else + Some("releases" at nexus + "service/local/staging/deploy/maven2") + } + ).dependsOn(bindings) + .enablePlugins(commonPlugins: _*) + .enablePlugins(ScalaJSPlugin) + +lazy val fs2Interop = project.in(file("interop/fs2")). + settings(commonSettings: _*). + settings( + name := "scala-js-chrome-fs2", + scalaVersion := "2.11.8", + crossScalaVersions := Seq("2.11.8"), + persistLauncher := false, + persistLauncher in Test := false, + libraryDependencies ++= Seq( + "co.fs2" %%% "fs2-core" % "0.9.0-RC1" + ), + publishMavenStyle := true, + publishTo := { + val nexus = "https://oss.sonatype.org/" + if (isSnapshot.value) + Some("snapshots" at nexus + "content/repositories/snapshots") + else + Some("releases" at nexus + "service/local/staging/deploy/maven2") + } + ).dependsOn(bindings) + .enablePlugins(commonPlugins: _*) + .enablePlugins(ScalaJSPlugin) diff --git a/interop/fs2/src/main/scala/chrome/interop/fs2/package.scala b/interop/fs2/src/main/scala/chrome/interop/fs2/package.scala new file mode 100644 index 0000000..1dfea0a --- /dev/null +++ b/interop/fs2/src/main/scala/chrome/interop/fs2/package.scala @@ -0,0 +1,30 @@ +package chrome.interop + +import _root_.fs2._ +import _root_.fs2.util._ +import chrome.events.bindings.Event + +import scala.scalajs.js + +package object fs2 { + + implicit class Event1FS2Ops[T1](val event: Event[js.Function1[T1, _]]) extends AnyVal { + + def toTask(implicit strategy: Strategy): Task[T1] = { + Task.async[T1] { register => + var fn = (t: T1) => () + fn = t => { + event.removeListener(fn) + register(Right(t)) + } + event.addListener(fn) + } + } + + + + def toStream(implicit strategy: Strategy): Stream[Task, T1] = Stream.repeatEval(toTask) + + } + +} diff --git a/interop/monix/src/main/scala/chrome/interop/monix/package.scala b/interop/monix/src/main/scala/chrome/interop/monix/package.scala new file mode 100644 index 0000000..91dda8d --- /dev/null +++ b/interop/monix/src/main/scala/chrome/interop/monix/package.scala @@ -0,0 +1,48 @@ +package chrome.interop + +import _root_.monix.reactive._ +import _root_.monix.execution._ +import chrome.events.bindings.Event + +import scala.scalajs.js + +package object monix { + + implicit class Event0MonixOps(val event: Event[js.Function0[_]]) extends AnyVal { + def toObservable(strategy: OverflowStrategy.Synchronous[Unit]): Observable[Unit] = + Observable.create(strategy){ sub => + val fn = () => sub.onNext(()) + event.addListener(fn) + Cancelable.apply(() => event.removeListener(fn)) + } + } + + implicit class Event1MonixOps[T1](val event: Event[js.Function1[T1, _]]) extends AnyVal { + def toObservable(strategy: OverflowStrategy.Synchronous[T1]): Observable[T1] = + Observable.create(strategy){ sub => + val fn = (t1: T1) => sub.onNext(t1) + event.addListener(fn) + Cancelable.apply(() => event.removeListener(fn)) + } + } + + implicit class Event2MonixOps[T1, T2](val event: Event[js.Function2[T1, T2, _]]) extends AnyVal { + def toObservable(strategy: OverflowStrategy.Synchronous[(T1, T2)]): Observable[(T1, T2)] = + Observable.create(strategy){ sub => + val fn = (t1: T1, t2: T2) => sub.onNext((t1, t2)) + event.addListener(fn) + Cancelable.apply(() => event.removeListener(fn)) + } + } + + implicit class Event3MonixOps[T1, T2, T3](val event: Event[js.Function3[T1, T2, T3, _]]) extends AnyVal { + def toObservable(strategy: OverflowStrategy.Synchronous[(T1, T2, T3)]): Observable[(T1, T2, T3)] = + Observable.create(strategy){ sub => + val fn = (t1: T1, t2: T2, t3: T3) => sub.onNext((t1, t2, t3)) + event.addListener(fn) + Cancelable.apply(() => event.removeListener(fn)) + } + } + + +}