diff --git a/build.sbt b/build.sbt index 0cd314c9..8227cd8d 100644 --- a/build.sbt +++ b/build.sbt @@ -80,26 +80,6 @@ val generateTupleCombinatorsTo = 9 Compile / sourceGenerators += Def.task { Seq.concat( - GenerateCombineStreams( - (Compile / sourceDirectory).value, - from = generateTupleCombinatorsFrom, - to = generateTupleCombinatorsTo - ).run, - GenerateCombineSignals( - (Compile / sourceDirectory).value, - from = generateTupleCombinatorsFrom, - to = generateTupleCombinatorsTo - ).run, - GenerateSampleCombineStreams( - (Compile / sourceDirectory).value, - from = generateTupleCombinatorsFrom, - to = generateTupleCombinatorsTo - ).run, - GenerateSampleCombineSignals( - (Compile / sourceDirectory).value, - from = generateTupleCombinatorsFrom, - to = generateTupleCombinatorsTo - ).run, GenerateTupleStreams( (Compile / sourceDirectory).value, from = generateTupleCombinatorsFrom, diff --git a/project/GenerateCombinableSignal.scala b/project/GenerateCombinableSignal.scala index 317bb18f..154b465f 100644 --- a/project/GenerateCombinableSignal.scala +++ b/project/GenerateCombinableSignal.scala @@ -14,8 +14,10 @@ case class GenerateCombinableSignal( line("package com.raquo.airstream.combine.generated") line() line("import app.tulz.tuplez.Composition") + line("import com.raquo.airstream.combine.SampleCombineSignalN") line("import com.raquo.airstream.core.Signal") line("import com.raquo.airstream.core.Source.SignalSource") + line("import com.raquo.ew.JsArray") line() line("// #Warning do not edit this file directly, it is generated by GenerateCombinableSignal.scala") line() @@ -40,22 +42,29 @@ case class GenerateCombinableSignal( line(s"combinator: (A, ${tupleType(n)}) => Out") } enter(s"): Signal[Out] = {", "}") { - line(s"new CombineSignal${n + 1}(signal, ${tupleType(n, "s")}, combinator)") + line(s"StaticSignalCombineOps.combineWithFn(signal, ${tupleType(n, "s")})(combinator)") } line() enter(s"def withCurrentValueOf[${tupleType(n)}](") { line((1 to n).map(i => s"s${i}: SignalSource[T${i}]").mkString(", ")) } enter(s")(implicit c: Composition[A, (${tupleType(n)})]): Signal[c.Composed] = {", "}") { - line(s"val combinator = (a: A, ${(1 to n).map(i => s"v${i}: T${i}").mkString(", ")}) => c.compose(a, (${tupleType(n, "v")}))") - line(s"new SampleCombineSignal${n + 1}(signal, ${tupleType(n, "s")}, combinator)") + line(s"val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (${(1 to n).map(i => s"arr(${i}).asInstanceOf[T${i}]").mkString(", ")}))") + line(s"val sampledSignals = JsArray[Signal[Any]](${tupleType(n, "s", ".toObservable")})") + enter(s"new SampleCombineSignalN(", ")") { + line("signal, sampledSignals, combinator") + } } line() enter(s"def sample[${tupleType(n)}](") { line((1 to n).map(i => s"s${i}: SignalSource[T${i}]").mkString(", ")) } enter(s"): Signal[(${tupleType(n)})] = {", "}") { - line(s"new SampleCombineSignal${n + 1}[A, ${tupleType(n)}, (${tupleType(n)})](signal, ${tupleType(n, "s")}, (_, ${tupleType(n, "v")}) => (${tupleType(n, "v")}))") + line(s"val combinator = (arr: JsArray[Any]) => (${(1 to n).map(i => s"arr(${i}).asInstanceOf[T${i}]").mkString(", ")})") + line(s"val sampledSignals = JsArray[Signal[Any]](${tupleType(n, "s", ".toObservable")})") + enter(s"new SampleCombineSignalN[Any, (${tupleType(n)})](", ")") { + line("signal, sampledSignals, combinator") + } } line() line("// --") diff --git a/project/GenerateCombinableStream.scala b/project/GenerateCombinableStream.scala index e3e76537..9ed77a6d 100644 --- a/project/GenerateCombinableStream.scala +++ b/project/GenerateCombinableStream.scala @@ -14,8 +14,10 @@ case class GenerateCombinableStream( line("package com.raquo.airstream.combine.generated") line() line("import app.tulz.tuplez.Composition") - line("import com.raquo.airstream.core.EventStream") + line("import com.raquo.airstream.combine.SampleCombineStreamN") + line("import com.raquo.airstream.core.{EventStream, Signal}") line("import com.raquo.airstream.core.Source.{EventSource, SignalSource}") + line("import com.raquo.ew.JsArray") line() line("// #Warning do not edit this file directly, it is generated by GenerateCombinableStream.scala") line() @@ -40,22 +42,29 @@ case class GenerateCombinableStream( line(s"combinator: (A, ${tupleType(n)}) => Out") } enter(s"): EventStream[Out] = {", "}") { - line(s"new CombineStream${n + 1}(stream, ${tupleType(n, "s")}, combinator)") + line(s"StaticStreamCombineOps.combineWithFn(stream, ${tupleType(n, "s")})(combinator)") } line() enter(s"def withCurrentValueOf[${tupleType(n)}](") { line((1 to n).map(i => s"s${i}: SignalSource[T${i}]").mkString(", ")) } enter(s")(implicit c: Composition[A, (${tupleType(n)})]): EventStream[c.Composed] = {", "}") { - line(s"val combinator = (a: A, ${(1 to n).map(i => s"v${i}: T${i}").mkString(", ")}) => c.compose(a, (${tupleType(n, "v")}))") - line(s"new SampleCombineStream${n + 1}(stream, ${tupleType(n, "s")}, combinator)") + line(s"val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (${(1 to n).map(i => s"arr(${i}).asInstanceOf[T${i}]").mkString(", ")}))") + line(s"val sampledSignals = JsArray[Signal[Any]](${tupleType(n, "s", ".toObservable")})") + enter(s"new SampleCombineStreamN(", ")") { + line("stream, sampledSignals, combinator") + } } line() enter(s"def sample[${tupleType(n)}](") { line((1 to n).map(i => s"s${i}: SignalSource[T${i}]").mkString(", ")) } enter(s"): EventStream[(${tupleType(n)})] = {", "}") { - line(s"new SampleCombineStream${n + 1}[A, ${tupleType(n)}, (${tupleType(n)})](stream, ${tupleType(n, "s")}, (_, ${tupleType(n, "v")}) => (${tupleType(n, "v")}))") + line(s"val combinator = (arr: JsArray[Any]) => (${(1 to n).map(i => s"arr(${i}).asInstanceOf[T${i}]").mkString(", ")})") + line(s"val sampledSignals = JsArray[Signal[Any]](${tupleType(n, "s", ".toObservable")})") + enter(s"new SampleCombineStreamN[Any, (${tupleType(n)})](", ")") { + line("stream, sampledSignals, combinator") + } } line() line("// --") diff --git a/project/GenerateCombineSignals.scala b/project/GenerateCombineSignals.scala deleted file mode 100644 index b1ea7673..00000000 --- a/project/GenerateCombineSignals.scala +++ /dev/null @@ -1,44 +0,0 @@ -import sbt._ - -import java.io.File - -case class GenerateCombineSignals( - sourceDir: File, - from: Int, - to: Int -) extends SourceGenerator( - sourceDir / "scala" / "com" / "raquo" / "airstream" / "combine" / "generated" / s"CombineSignals.scala" -) { - - override def apply(): Unit = { - line("package com.raquo.airstream.combine.generated") - line() - line("import com.raquo.airstream.combine.CombineSignalN") - line("import com.raquo.airstream.core.Source.SignalSource") - line() - line("// #Warning do not edit this file directly, it is generated by GenerateCombineSignals.scala") - line() - line("// These are implementations of CombineSignalN used for Signal's `combine` and `combineWith` methods") - line() - for (n <- from to to) { - line("/** @param combinator Must not throw! */") - enter(s"class CombineSignal${n}[${tupleType(n)}, Out](") { - for (i <- 1 to n) { - line(s"parent${i}: SignalSource[T${i}],") - } - line(s"combinator: (${tupleType(n)}) => Out") - } - enter(s") extends CombineSignalN[Any, Out](", ")") { - line("parents = " + tupleType(n, prefix = "parent", suffix = ".toObservable", separator = " :: ") + " :: Nil,") - enter("combinator = seq => combinator(", ")") { - for (i <- 1 to n) { - line(s"seq(${i - 1}).asInstanceOf[T${i}],") - } - } - } - line() - } - line() - } - -} diff --git a/project/GenerateCombineStreams.scala b/project/GenerateCombineStreams.scala deleted file mode 100644 index ef3f7aef..00000000 --- a/project/GenerateCombineStreams.scala +++ /dev/null @@ -1,43 +0,0 @@ -import sbt._ - -import java.io.File - -case class GenerateCombineStreams( - sourceDir: File, - from: Int, - to: Int -) extends SourceGenerator( - sourceDir / "scala" / "com" / "raquo" / "airstream" / "combine" / "generated" / s"CombineStreams.scala" -) { - - override def apply(): Unit = { - line("package com.raquo.airstream.combine.generated") - line() - line("import com.raquo.airstream.combine.CombineStreamN") - line("import com.raquo.airstream.core.Source.EventSource") - line() - line("// #Warning do not edit this file directly, it is generated by GenerateCombineStreams.scala") - line() - line("// These are implementations of CombineStreamN used for EventStream's `combine` and `combineWith` methods") - line() - for (n <- from to to) { - line("/** @param combinator Must not throw! */") - enter(s"class CombineStream${n}[${tupleType(n)}, Out](") { - for (i <- 1 to n) { - line(s"parent${i}: EventSource[T${i}],") - } - line(s"combinator: (${tupleType(n)}) => Out") - } - enter(s") extends CombineStreamN[Any, Out](", ")") { - line("parents = " + tupleType(n, prefix = "parent", suffix = ".toObservable", separator = " :: ") + " :: Nil,") - enter("combinator = seq => combinator(", ")") { - for (i <- 1 to n) { - line(s"seq(${i - 1}).asInstanceOf[T${i}],") - } - } - } - line() - } - } - -} diff --git a/project/GenerateSampleCombineSignals.scala b/project/GenerateSampleCombineSignals.scala deleted file mode 100644 index 1b16d8b0..00000000 --- a/project/GenerateSampleCombineSignals.scala +++ /dev/null @@ -1,47 +0,0 @@ -import sbt._ - -import java.io.File - -case class GenerateSampleCombineSignals( - sourceDir: File, - from: Int, - to: Int -) extends SourceGenerator( - sourceDir / "scala" / "com" / "raquo" / "airstream" / "combine" / "generated" / s"SampleCombineSignals.scala" -) { - - override def apply(): Unit = { - line("package com.raquo.airstream.combine.generated") - line() - line("import com.raquo.airstream.combine.SampleCombineSignalN") - line("import com.raquo.airstream.core.Signal") - line("import com.raquo.airstream.core.Source.SignalSource") - line() - line("// #Warning do not edit this file directly, it is generated by GenerateSampleCombineSignals.scala") - line() - line("// These are implementations of SampleCombineSignalN used for Signal's `withCurrentValueOf` and `sample` methods") - line() - for (n <- from to to) { - line("/** @param combinator Must not throw! */") - enter(s"class SampleCombineSignal${n}[T0, ${tupleType(n - 1)}, Out](") { - line("samplingSignal: Signal[T0],") - for (i <- 1 until n) { - line(s"sampledSignal${i}: SignalSource[T${i}],") - } - line(s"combinator: (T0, ${tupleType(n - 1)}) => Out") - } - enter(s") extends SampleCombineSignalN[Any, Out](", ")") { - line("samplingSignal = samplingSignal,") - line("sampledSignals = " + tupleType(n - 1, prefix = "sampledSignal", suffix = ".toObservable", separator = " :: ") + " :: Nil,") - enter("combinator = seq => combinator(", ")") { - for (i <- 0 until n) { - line(s"seq(${i}).asInstanceOf[T${i}],") - } - } - } - line() - } - line() - } - -} diff --git a/project/GenerateSampleCombineStreams.scala b/project/GenerateSampleCombineStreams.scala deleted file mode 100644 index 87017d4f..00000000 --- a/project/GenerateSampleCombineStreams.scala +++ /dev/null @@ -1,47 +0,0 @@ -import sbt._ - -import java.io.File - -case class GenerateSampleCombineStreams( - sourceDir: File, - from: Int, - to: Int -) extends SourceGenerator( - sourceDir / "scala" / "com" / "raquo" / "airstream" / "combine" / "generated" / s"SampleCombineStreams.scala" -) { - - override def apply(): Unit = { - line("package com.raquo.airstream.combine.generated") - line() - line("import com.raquo.airstream.combine.SampleCombineStreamN") - line("import com.raquo.airstream.core.EventStream") - line("import com.raquo.airstream.core.Source.SignalSource") - line() - line("// #Warning do not edit this file directly, it is generated by GenerateSampleCombineStreams.scala") - line() - line("// These are implementations of SampleCombineStreamN used for EventStream's `withCurrentValueOf` and `sample` methods") - line() - for (n <- from to to) { - line("/** @param combinator Must not throw! */") - enter(s"class SampleCombineStream${n}[T0, ${tupleType(n - 1)}, Out](") { - line("samplingStream: EventStream[T0],") - for (i <- 1 until n) { - line(s"sampledSignal${i}: SignalSource[T${i}],") - } - line(s"combinator: (T0, ${tupleType(n - 1)}) => Out") - } - enter(s") extends SampleCombineStreamN[Any, Out](", ")") { - line("samplingStream = samplingStream,") - line("sampledSignals = " + tupleType(n - 1, "sampledSignal", ".toObservable", separator = " :: ") + " :: Nil,") - enter("combinator = seq => combinator(", ")") { - for (i <- 0 until n) { - line(s"seq(${i}).asInstanceOf[T${i}],") - } - } - } - line() - } - line() - } - -} diff --git a/project/GenerateStaticSignalCombineOps.scala b/project/GenerateStaticSignalCombineOps.scala index 35994b43..0e9e20fb 100644 --- a/project/GenerateStaticSignalCombineOps.scala +++ b/project/GenerateStaticSignalCombineOps.scala @@ -13,8 +13,10 @@ case class GenerateStaticSignalCombineOps( override def apply(): Unit = { line("package com.raquo.airstream.combine.generated") line() + line("import com.raquo.airstream.combine.CombineSignalN") line("import com.raquo.airstream.core.Signal") line("import com.raquo.airstream.core.Source.SignalSource") + line("import com.raquo.ew.JsArray") line() line("// #Warning do not edit this file directly, it is generated by GenerateStaticSignalCombineOps.scala") line() @@ -39,7 +41,19 @@ case class GenerateStaticSignalCombineOps( line(s"combinator: (${tupleType(n)}) => Out") } enter(s"): Signal[Out] = {", "}") { - line(s"new CombineSignal${n}(${tupleType(n, "s")}, combinator)") + // line(s"val parents = JsArray(${tupleType(n, "s", ".toObservable")})") + // line(s"val arrCombinator = (arr: JsArray[Any]) => combinator(${(0 until n).map(i => s"arr(${i}).asInstanceOf[T${i + 1}]").mkString(", ")})") + // enter("new CombineSignalN(", ")") { + // line("parents, arrCombinator") + // } + enter("new CombineSignalN[Any, Out](", ")") { + line(s"parents = JsArray(${tupleType(n, "s", ".toObservable")}),") + enter(s"combinator = arr => combinator(", ")") { + for (i <- 0 until n) { + line(s"arr(${i}).asInstanceOf[T${i+1}],") + } + } + } } line() line("// --") diff --git a/project/GenerateStaticStreamCombineOps.scala b/project/GenerateStaticStreamCombineOps.scala index b5e897c6..339a66f8 100644 --- a/project/GenerateStaticStreamCombineOps.scala +++ b/project/GenerateStaticStreamCombineOps.scala @@ -13,8 +13,10 @@ case class GenerateStaticStreamCombineOps( override def apply(): Unit = { line("package com.raquo.airstream.combine.generated") line() + line("import com.raquo.airstream.combine.CombineStreamN") line("import com.raquo.airstream.core.EventStream") line("import com.raquo.airstream.core.Source.EventSource") + line("import com.raquo.ew.JsArray") line() line("// #Warning do not edit this file directly, it is generated by GenerateStaticStreamCombineOps.scala") line() @@ -39,7 +41,19 @@ case class GenerateStaticStreamCombineOps( line(s"combinator: (${tupleType(n)}) => Out") } enter(s"): EventStream[Out] = {", "}") { - line(s"new CombineStream${n}(${tupleType(n, "s")}, combinator)") + // line(s"val arrCombinator = (arr: JsArray[Any]) => combinator(${(0 until n).map(i => s"arr(${i}).asInstanceOf[T${i + 1}]").mkString(", ")})") + // line(s"val streams = JsArray[EventStream[Any]](${tupleType(n, "s", ".toObservable")})") + // enter("new CombineStreamN(", ")") { + // line("streams, arrCombinator") + // } + enter("new CombineStreamN[Any, Out](", ")") { + line(s"parentStreams = JsArray(${tupleType(n, "s", ".toObservable")}),") + enter(s"combinator = arr => combinator(", ")") { + for (i <- 0 until n) { + line(s"arr(${i}).asInstanceOf[T${i + 1}],") + } + } + } } line() line("// --") diff --git a/project/Versions.scala b/project/Versions.scala index 61d99a86..f83c0147 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -10,7 +10,7 @@ object Versions { val Tuplez = "0.3.7" - val Ew = "0.1.1" + val Ew = "0.1.2-SNAPSHOT" // Used in test only: diff --git a/src/main/scala/com/raquo/airstream/combine/CombineObservable.scala b/src/main/scala/com/raquo/airstream/combine/CombineObservable.scala index ed1b75d0..20bc5128 100644 --- a/src/main/scala/com/raquo/airstream/combine/CombineObservable.scala +++ b/src/main/scala/com/raquo/airstream/combine/CombineObservable.scala @@ -66,20 +66,21 @@ object CombineObservable { } } - /** @param combinator MUST NOT THROW! */ - def seqCombinator[A, B](trys: Seq[Try[A]], combinator: Seq[A] => B): Try[B] = { - // @TODO[Performance] typical combinator will access every value by index, - // but `trys` could be a List or something with an O(N) cost for this. - // However, I don't think initializing an Array in all cases will be - // cheaper, because typical seq sizes are very small here (2-4) - if (trys.forall(_.isSuccess)) { + def jsArrayCombinator[A, B](trys: JsArray[Try[A]], combinator: JsArray[A] => B): Try[B] = { + var allSuccess: Boolean = true + trys.forEach { t => + if (t.isFailure) { + allSuccess = false + } + } + if (allSuccess) { val values = trys.map(_.get) Success(combinator(values)) } else { val errors = trys.map { case Failure(err) => Some(err) case _ => None - } + }.asScalaJs.toSeq Failure(CombinedError(errors)) } } diff --git a/src/main/scala/com/raquo/airstream/combine/CombineSignalN.scala b/src/main/scala/com/raquo/airstream/combine/CombineSignalN.scala index d4dd4933..c92f63b6 100644 --- a/src/main/scala/com/raquo/airstream/combine/CombineSignalN.scala +++ b/src/main/scala/com/raquo/airstream/combine/CombineSignalN.scala @@ -2,33 +2,37 @@ package com.raquo.airstream.combine import com.raquo.airstream.common.{InternalParentObserver, MultiParentSignal} import com.raquo.airstream.core.{Protected, Signal} +import com.raquo.ew.JsArray import scala.util.Try -/** @param combinator Must not throw! Must be pure. */ +/** + * @param parents Never update this array - this signal owns it. + * @param combinator Must not throw! Must be pure. + */ class CombineSignalN[A, Out]( - override protected[this] val parents: Seq[Signal[A]], - protected[this] val combinator: Seq[A] => Out + override protected[this] val parents: JsArray[Signal[A]], + protected[this] val combinator: JsArray[A] => Out ) extends MultiParentSignal[A, Out] with CombineObservable[Out] { // @TODO[API] Maybe this should throw if parents.isEmpty - override protected val topoRank: Int = Protected.maxTopoRank(parents) + 1 + override protected val topoRank: Int = Protected.maxTopoRank(0, parents) + 1 override protected[this] def inputsReady: Boolean = true override protected[this] def combinedValue: Try[Out] = { - CombineObservable.seqCombinator(parents.map(_.tryNow()), combinator) + CombineObservable.jsArrayCombinator(parents.map(_.tryNow()), combinator) } override protected def currentValueFromParent(): Try[Out] = combinedValue - parentObservers.push( - parents.map { parent => + parents.forEach { parent => + parentObservers.push( InternalParentObserver.fromTry[A](parent, (_, transaction) => { onInputsReady(transaction) }) - }: _* - ) + ) + } } diff --git a/src/main/scala/com/raquo/airstream/combine/CombineStreamN.scala b/src/main/scala/com/raquo/airstream/combine/CombineStreamN.scala index 657e54ab..f7ea8396 100644 --- a/src/main/scala/com/raquo/airstream/combine/CombineStreamN.scala +++ b/src/main/scala/com/raquo/airstream/combine/CombineStreamN.scala @@ -1,43 +1,60 @@ package com.raquo.airstream.combine import com.raquo.airstream.common.{InternalParentObserver, MultiParentStream} -import com.raquo.airstream.core.{EventStream, Protected} +import com.raquo.airstream.core.{EventStream, Observable, Protected} +import com.raquo.ew.JsArray +import scala.scalajs.js import scala.util.Try -/** @param combinator Must not throw! */ +/** + * @param parentStreams Never update this array - this stream owns it. + * @param combinator Must not throw! Must be pure. + */ class CombineStreamN[A, Out]( - override protected[this] val parents: Seq[EventStream[A]], - combinator: Seq[A] => Out + parentStreams: JsArray[EventStream[A]], + combinator: JsArray[A] => Out ) extends MultiParentStream[A, Out] with CombineObservable[Out] { // @TODO[API] Maybe this should throw if parents.isEmpty + override protected[this] val parents: JsArray[Observable[A]] = { + // #Note this is safe as long as we don't put non-streams into this JsArray. + parentStreams.asInstanceOf[JsArray[Observable[A]]] + } + override protected val topoRank: Int = Protected.maxTopoRank(parents) + 1 - private[this] val maybeLastParentValues: Array[Option[Try[A]]] = Array.fill(parents.size)(None) + private[this] val maybeLastParentValues: JsArray[js.UndefOr[Try[A]]] = parents.map(_ => js.undefined) override protected[this] def inputsReady: Boolean = { - maybeLastParentValues.forall(_.nonEmpty) + var allReady: Boolean = true + maybeLastParentValues.forEach { lastValue => + if (lastValue.isEmpty) { + allReady = false + } + } + allReady } override protected[this] def combinedValue: Try[Out] = { - // @TODO[Scala3] When we don't need Scala 2.12, use ArraySeq.unsafeWrapArray(maybeLastParentValues) for perf? - CombineObservable.seqCombinator(maybeLastParentValues.toIndexedSeq.map(_.get), combinator) + // #Note don't call this unless you have first verified that + // inputs are ready, otherwise this asInstanceOf will not be safe. + CombineObservable.jsArrayCombinator(maybeLastParentValues.asInstanceOf[JsArray[Try[A]]], combinator) } - parentObservers.push( - parents.zipWithIndex.map { case (parent, index) => + parents.forEachWithIndex { (parent, ix) => + parentObservers.push( InternalParentObserver.fromTry[A]( parent, (nextParentValue, transaction) => { - maybeLastParentValues.update(index, Some(nextParentValue)) + maybeLastParentValues.update(ix, nextParentValue) if (inputsReady) { onInputsReady(transaction) } } ) - }: _* - ) + ) + } } diff --git a/src/main/scala/com/raquo/airstream/combine/MergeStream.scala b/src/main/scala/com/raquo/airstream/combine/MergeStream.scala index 73c2e6dd..c5cd7d8e 100644 --- a/src/main/scala/com/raquo/airstream/combine/MergeStream.scala +++ b/src/main/scala/com/raquo/airstream/combine/MergeStream.scala @@ -11,11 +11,18 @@ import com.raquo.ew.JsArray * * This feature exists only for EventStream-s because merging Signals * does not make sense, conceptually (what do you even do with their current values?). + * + * @param parentStreams Never update this array - this stream owns it. */ class MergeStream[A]( - override protected[this] val parents: Seq[EventStream[A]], + parentStreams: JsArray[EventStream[A]], ) extends WritableStream[A] with SyncObservable[A] with MultiParentStream[A, A] { + override protected[this] val parents: JsArray[Observable[A]] = { + // This cast is safe as long as we don't put signals into this array + parentStreams.asInstanceOf[JsArray[Observable[A]]] + } + override protected val topoRank: Int = Protected.maxTopoRank(parents) + 1 private[this] val pendingParentValues: JsPriorityQueue[Observation[A]] = { @@ -24,7 +31,7 @@ class MergeStream[A]( private[this] val parentObservers: JsArray[InternalParentObserver[A]] = JsArray() - parents.foreach(parent => parentObservers.push(makeInternalObserver(parent))) + parents.forEach(parent => parentObservers.push(makeInternalObserver(parent))) // @TODO document this, and document the topo parent order /** If this stream has already fired in a given transaction, the next firing will happen in a new transaction. diff --git a/src/main/scala/com/raquo/airstream/combine/SampleCombineSignalN.scala b/src/main/scala/com/raquo/airstream/combine/SampleCombineSignalN.scala index 1b1ccca7..bf3bf73a 100644 --- a/src/main/scala/com/raquo/airstream/combine/SampleCombineSignalN.scala +++ b/src/main/scala/com/raquo/airstream/combine/SampleCombineSignalN.scala @@ -2,6 +2,7 @@ package com.raquo.airstream.combine import com.raquo.airstream.common.{InternalParentObserver, MultiParentSignal} import com.raquo.airstream.core.{Protected, Signal} +import com.raquo.ew.JsArray import scala.util.Try @@ -12,23 +13,31 @@ import scala.util.Try * * Works similar to Rx's "withLatestFrom", except without glitches (see a diamond case test for this in GlitchSpec). * + * @param sampledSignals - Never update this array - this signal owns it. + * * @param combinator Note: Must not throw! Must be pure. */ class SampleCombineSignalN[A, Out]( samplingSignal: Signal[A], - sampledSignals: Seq[Signal[A]], - combinator: Seq[A] => Out + sampledSignals: JsArray[Signal[A]], + combinator: JsArray[A] => Out ) extends MultiParentSignal[A, Out] with CombineObservable[Out] { - override protected val topoRank: Int = (Protected.topoRank(samplingSignal) max Protected.maxTopoRank(sampledSignals)) + 1 + override protected val topoRank: Int = Protected.maxTopoRank(samplingSignal, sampledSignals) + 1 override protected[this] def inputsReady: Boolean = true - override protected[this] val parents: Seq[Signal[A]] = samplingSignal +: sampledSignals + override protected[this] val parents: JsArray[Signal[A]] = combineWithArray( + samplingSignal, + sampledSignals + ) override protected[this] def combinedValue: Try[Out] = { - val values = (samplingSignal +: sampledSignals).map(_.tryNow()) - CombineObservable.seqCombinator(values, combinator) + val values = combineWithArray( + samplingSignal.tryNow(), + sampledSignals.map(_.tryNow()) + ) + CombineObservable.jsArrayCombinator(values, combinator) } override protected def currentValueFromParent(): Try[Out] = combinedValue @@ -39,11 +48,17 @@ class SampleCombineSignalN[A, Out]( }) ) - parentObservers.push( - sampledSignals.map { sampledSignal => + sampledSignals.forEach { sampledSignal => + parentObservers.push( InternalParentObserver.fromTry[A](sampledSignal, (_, _) => { // Do nothing, we just want to ensure that sampledSignal is started. }) - }: _* - ) + ) + } + + private[this] def combineWithArray[V](sampling: V, sampled: JsArray[V]): JsArray[V] = { + val values = sampled.concat() // There's also JsArray.from, but it does not work in IE11 + values.unshift(sampling) + values + } } diff --git a/src/main/scala/com/raquo/airstream/combine/SampleCombineStreamN.scala b/src/main/scala/com/raquo/airstream/combine/SampleCombineStreamN.scala index 931d2e7c..61dbaece 100644 --- a/src/main/scala/com/raquo/airstream/combine/SampleCombineStreamN.scala +++ b/src/main/scala/com/raquo/airstream/combine/SampleCombineStreamN.scala @@ -2,6 +2,7 @@ package com.raquo.airstream.combine import com.raquo.airstream.common.{InternalParentObserver, MultiParentStream} import com.raquo.airstream.core.{EventStream, Observable, Protected, Signal, Transaction} +import com.raquo.ew.JsArray import scala.scalajs.js import scala.util.Try @@ -13,25 +14,32 @@ import scala.util.Try * * Works similar to Rx's "withLatestFrom", except without glitches (see a diamond case test for this in GlitchSpec). * + * @param sampledSignals Never update this array - this stream owns it. * @param combinator Note: Must not throw! */ class SampleCombineStreamN[A, Out]( samplingStream: EventStream[A], - sampledSignals: Seq[Signal[A]], - combinator: Seq[A] => Out + sampledSignals: JsArray[Signal[A]], + combinator: JsArray[A] => Out ) extends MultiParentStream[A, Out] with CombineObservable[Out] { - override protected val topoRank: Int = (Protected.topoRank(samplingStream) max Protected.maxTopoRank(sampledSignals)) + 1 + override protected val topoRank: Int = Protected.maxTopoRank(samplingStream, sampledSignals) + 1 private[this] var maybeLastSamplingValue: js.UndefOr[Try[A]] = js.undefined override protected[this] def inputsReady: Boolean = maybeLastSamplingValue.nonEmpty - override protected[this] val parents: Seq[Observable[A]] = samplingStream +: sampledSignals + override protected[this] val parents: JsArray[Observable[A]] = combineWithArray( + samplingStream, + sampledSignals + ) override protected[this] def combinedValue: Try[Out] = { - val parentValues = maybeLastSamplingValue.get +: sampledSignals.map(_.tryNow()) - CombineObservable.seqCombinator(parentValues, combinator) + val values = combineWithArray( + maybeLastSamplingValue.get, + sampledSignals.map(_.tryNow()) + ) + CombineObservable.jsArrayCombinator(values, combinator) } parentObservers.push( @@ -44,17 +52,22 @@ class SampleCombineStreamN[A, Out]( ) ) - parentObservers.push( - sampledSignals.map { sampledSignal => + sampledSignals.forEach { sampledSignal => + parentObservers.push( InternalParentObserver.fromTry[A](sampledSignal, (_, _) => { // Do nothing, we just want to ensure that sampledSignal is started. }) - }: _* - ) + ) + } override private[airstream] def syncFire(transaction: Transaction): Unit = { super.syncFire(transaction) maybeLastSamplingValue = js.undefined // Clean up memory, as we don't need this reference anymore } + private[this] def combineWithArray[BaseV >: V, V](sampling: BaseV, sampled: JsArray[V]): JsArray[BaseV] = { + val values = sampled.concat[BaseV]() // There's also JsArray.from, but it does not work in IE11 + values.unshift(sampling) + values + } } diff --git a/src/main/scala/com/raquo/airstream/combine/generated/CombinableSignal.scala b/src/main/scala/com/raquo/airstream/combine/generated/CombinableSignal.scala index 8f9ff317..43e3f0ad 100644 --- a/src/main/scala/com/raquo/airstream/combine/generated/CombinableSignal.scala +++ b/src/main/scala/com/raquo/airstream/combine/generated/CombinableSignal.scala @@ -1,8 +1,10 @@ package com.raquo.airstream.combine.generated import app.tulz.tuplez.Composition +import com.raquo.airstream.combine.SampleCombineSignalN import com.raquo.airstream.core.Signal import com.raquo.airstream.core.Source.SignalSource +import com.raquo.ew.JsArray // #Warning do not edit this file directly, it is generated by GenerateCombinableSignal.scala @@ -23,20 +25,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1) => Out ): Signal[Out] = { - new CombineSignal2(signal, s1, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1)(combinator) } def withCurrentValueOf[T1]( s1: SignalSource[T1] )(implicit c: Composition[A, (T1)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1) => c.compose(a, (v1)) - new SampleCombineSignal2(signal, s1, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1]( s1: SignalSource[T1] ): Signal[(T1)] = { - new SampleCombineSignal2[A, T1, (T1)](signal, s1, (_, v1) => (v1)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable) + new SampleCombineSignalN[Any, (T1)]( + signal, sampledSignals, combinator + ) } // -- @@ -53,20 +62,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2) => Out ): Signal[Out] = { - new CombineSignal3(signal, s1, s2, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2)(combinator) } def withCurrentValueOf[T1, T2]( s1: SignalSource[T1], s2: SignalSource[T2] )(implicit c: Composition[A, (T1, T2)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2) => c.compose(a, (v1, v2)) - new SampleCombineSignal3(signal, s1, s2, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2]( s1: SignalSource[T1], s2: SignalSource[T2] ): Signal[(T1, T2)] = { - new SampleCombineSignal3[A, T1, T2, (T1, T2)](signal, s1, s2, (_, v1, v2) => (v1, v2)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable) + new SampleCombineSignalN[Any, (T1, T2)]( + signal, sampledSignals, combinator + ) } // -- @@ -83,20 +99,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3) => Out ): Signal[Out] = { - new CombineSignal4(signal, s1, s2, s3, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3)(combinator) } def withCurrentValueOf[T1, T2, T3]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3] )(implicit c: Composition[A, (T1, T2, T3)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3) => c.compose(a, (v1, v2, v3)) - new SampleCombineSignal4(signal, s1, s2, s3, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3] ): Signal[(T1, T2, T3)] = { - new SampleCombineSignal4[A, T1, T2, T3, (T1, T2, T3)](signal, s1, s2, s3, (_, v1, v2, v3) => (v1, v2, v3)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3)]( + signal, sampledSignals, combinator + ) } // -- @@ -113,20 +136,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4) => Out ): Signal[Out] = { - new CombineSignal5(signal, s1, s2, s3, s4, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3, s4)(combinator) } def withCurrentValueOf[T1, T2, T3, T4]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4] )(implicit c: Composition[A, (T1, T2, T3, T4)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4) => c.compose(a, (v1, v2, v3, v4)) - new SampleCombineSignal5(signal, s1, s2, s3, s4, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4] ): Signal[(T1, T2, T3, T4)] = { - new SampleCombineSignal5[A, T1, T2, T3, T4, (T1, T2, T3, T4)](signal, s1, s2, s3, s4, (_, v1, v2, v3, v4) => (v1, v2, v3, v4)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3, T4)]( + signal, sampledSignals, combinator + ) } // -- @@ -143,20 +173,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5) => Out ): Signal[Out] = { - new CombineSignal6(signal, s1, s2, s3, s4, s5, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3, s4, s5)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5] )(implicit c: Composition[A, (T1, T2, T3, T4, T5)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5) => c.compose(a, (v1, v2, v3, v4, v5)) - new SampleCombineSignal6(signal, s1, s2, s3, s4, s5, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5] ): Signal[(T1, T2, T3, T4, T5)] = { - new SampleCombineSignal6[A, T1, T2, T3, T4, T5, (T1, T2, T3, T4, T5)](signal, s1, s2, s3, s4, s5, (_, v1, v2, v3, v4, v5) => (v1, v2, v3, v4, v5)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3, T4, T5)]( + signal, sampledSignals, combinator + ) } // -- @@ -173,20 +210,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6) => Out ): Signal[Out] = { - new CombineSignal7(signal, s1, s2, s3, s4, s5, s6, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3, s4, s5, s6)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => c.compose(a, (v1, v2, v3, v4, v5, v6)) - new SampleCombineSignal7(signal, s1, s2, s3, s4, s5, s6, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6] ): Signal[(T1, T2, T3, T4, T5, T6)] = { - new SampleCombineSignal7[A, T1, T2, T3, T4, T5, T6, (T1, T2, T3, T4, T5, T6)](signal, s1, s2, s3, s4, s5, s6, (_, v1, v2, v3, v4, v5, v6) => (v1, v2, v3, v4, v5, v6)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3, T4, T5, T6)]( + signal, sampledSignals, combinator + ) } // -- @@ -203,20 +247,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6, T7) => Out ): Signal[Out] = { - new CombineSignal8(signal, s1, s2, s3, s4, s5, s6, s7, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3, s4, s5, s6, s7)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6, T7]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6, T7)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => c.compose(a, (v1, v2, v3, v4, v5, v6, v7)) - new SampleCombineSignal8(signal, s1, s2, s3, s4, s5, s6, s7, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6, T7]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7] ): Signal[(T1, T2, T3, T4, T5, T6, T7)] = { - new SampleCombineSignal8[A, T1, T2, T3, T4, T5, T6, T7, (T1, T2, T3, T4, T5, T6, T7)](signal, s1, s2, s3, s4, s5, s6, s7, (_, v1, v2, v3, v4, v5, v6, v7) => (v1, v2, v3, v4, v5, v6, v7)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3, T4, T5, T6, T7)]( + signal, sampledSignals, combinator + ) } // -- @@ -233,20 +284,27 @@ class CombinableSignal[A](val signal: Signal[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6, T7, T8) => Out ): Signal[Out] = { - new CombineSignal9(signal, s1, s2, s3, s4, s5, s6, s7, s8, combinator) + StaticSignalCombineOps.combineWithFn(signal, s1, s2, s3, s4, s5, s6, s7, s8)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6, T7, T8]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7], s8: SignalSource[T8] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6, T7, T8)]): Signal[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => c.compose(a, (v1, v2, v3, v4, v5, v6, v7, v8)) - new SampleCombineSignal9(signal, s1, s2, s3, s4, s5, s6, s7, s8, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7], arr(8).asInstanceOf[T8])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable) + new SampleCombineSignalN( + signal, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6, T7, T8]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7], s8: SignalSource[T8] ): Signal[(T1, T2, T3, T4, T5, T6, T7, T8)] = { - new SampleCombineSignal9[A, T1, T2, T3, T4, T5, T6, T7, T8, (T1, T2, T3, T4, T5, T6, T7, T8)](signal, s1, s2, s3, s4, s5, s6, s7, s8, (_, v1, v2, v3, v4, v5, v6, v7, v8) => (v1, v2, v3, v4, v5, v6, v7, v8)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7], arr(8).asInstanceOf[T8]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable) + new SampleCombineSignalN[Any, (T1, T2, T3, T4, T5, T6, T7, T8)]( + signal, sampledSignals, combinator + ) } // -- diff --git a/src/main/scala/com/raquo/airstream/combine/generated/CombinableStream.scala b/src/main/scala/com/raquo/airstream/combine/generated/CombinableStream.scala index c5866869..f6b4faee 100644 --- a/src/main/scala/com/raquo/airstream/combine/generated/CombinableStream.scala +++ b/src/main/scala/com/raquo/airstream/combine/generated/CombinableStream.scala @@ -1,8 +1,10 @@ package com.raquo.airstream.combine.generated import app.tulz.tuplez.Composition -import com.raquo.airstream.core.EventStream +import com.raquo.airstream.combine.SampleCombineStreamN +import com.raquo.airstream.core.{EventStream, Signal} import com.raquo.airstream.core.Source.{EventSource, SignalSource} +import com.raquo.ew.JsArray // #Warning do not edit this file directly, it is generated by GenerateCombinableStream.scala @@ -23,20 +25,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1) => Out ): EventStream[Out] = { - new CombineStream2(stream, s1, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1)(combinator) } def withCurrentValueOf[T1]( s1: SignalSource[T1] )(implicit c: Composition[A, (T1)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1) => c.compose(a, (v1)) - new SampleCombineStream2(stream, s1, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1]( s1: SignalSource[T1] ): EventStream[(T1)] = { - new SampleCombineStream2[A, T1, (T1)](stream, s1, (_, v1) => (v1)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable) + new SampleCombineStreamN[Any, (T1)]( + stream, sampledSignals, combinator + ) } // -- @@ -53,20 +62,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2) => Out ): EventStream[Out] = { - new CombineStream3(stream, s1, s2, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2)(combinator) } def withCurrentValueOf[T1, T2]( s1: SignalSource[T1], s2: SignalSource[T2] )(implicit c: Composition[A, (T1, T2)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2) => c.compose(a, (v1, v2)) - new SampleCombineStream3(stream, s1, s2, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2]( s1: SignalSource[T1], s2: SignalSource[T2] ): EventStream[(T1, T2)] = { - new SampleCombineStream3[A, T1, T2, (T1, T2)](stream, s1, s2, (_, v1, v2) => (v1, v2)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable) + new SampleCombineStreamN[Any, (T1, T2)]( + stream, sampledSignals, combinator + ) } // -- @@ -83,20 +99,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3) => Out ): EventStream[Out] = { - new CombineStream4(stream, s1, s2, s3, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3)(combinator) } def withCurrentValueOf[T1, T2, T3]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3] )(implicit c: Composition[A, (T1, T2, T3)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3) => c.compose(a, (v1, v2, v3)) - new SampleCombineStream4(stream, s1, s2, s3, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3] ): EventStream[(T1, T2, T3)] = { - new SampleCombineStream4[A, T1, T2, T3, (T1, T2, T3)](stream, s1, s2, s3, (_, v1, v2, v3) => (v1, v2, v3)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3)]( + stream, sampledSignals, combinator + ) } // -- @@ -113,20 +136,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4) => Out ): EventStream[Out] = { - new CombineStream5(stream, s1, s2, s3, s4, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3, s4)(combinator) } def withCurrentValueOf[T1, T2, T3, T4]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4] )(implicit c: Composition[A, (T1, T2, T3, T4)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4) => c.compose(a, (v1, v2, v3, v4)) - new SampleCombineStream5(stream, s1, s2, s3, s4, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4] ): EventStream[(T1, T2, T3, T4)] = { - new SampleCombineStream5[A, T1, T2, T3, T4, (T1, T2, T3, T4)](stream, s1, s2, s3, s4, (_, v1, v2, v3, v4) => (v1, v2, v3, v4)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3, T4)]( + stream, sampledSignals, combinator + ) } // -- @@ -143,20 +173,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5) => Out ): EventStream[Out] = { - new CombineStream6(stream, s1, s2, s3, s4, s5, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3, s4, s5)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5] )(implicit c: Composition[A, (T1, T2, T3, T4, T5)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5) => c.compose(a, (v1, v2, v3, v4, v5)) - new SampleCombineStream6(stream, s1, s2, s3, s4, s5, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5] ): EventStream[(T1, T2, T3, T4, T5)] = { - new SampleCombineStream6[A, T1, T2, T3, T4, T5, (T1, T2, T3, T4, T5)](stream, s1, s2, s3, s4, s5, (_, v1, v2, v3, v4, v5) => (v1, v2, v3, v4, v5)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3, T4, T5)]( + stream, sampledSignals, combinator + ) } // -- @@ -173,20 +210,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6) => Out ): EventStream[Out] = { - new CombineStream7(stream, s1, s2, s3, s4, s5, s6, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3, s4, s5, s6)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => c.compose(a, (v1, v2, v3, v4, v5, v6)) - new SampleCombineStream7(stream, s1, s2, s3, s4, s5, s6, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6] ): EventStream[(T1, T2, T3, T4, T5, T6)] = { - new SampleCombineStream7[A, T1, T2, T3, T4, T5, T6, (T1, T2, T3, T4, T5, T6)](stream, s1, s2, s3, s4, s5, s6, (_, v1, v2, v3, v4, v5, v6) => (v1, v2, v3, v4, v5, v6)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3, T4, T5, T6)]( + stream, sampledSignals, combinator + ) } // -- @@ -203,20 +247,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6, T7) => Out ): EventStream[Out] = { - new CombineStream8(stream, s1, s2, s3, s4, s5, s6, s7, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3, s4, s5, s6, s7)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6, T7]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6, T7)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => c.compose(a, (v1, v2, v3, v4, v5, v6, v7)) - new SampleCombineStream8(stream, s1, s2, s3, s4, s5, s6, s7, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6, T7]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7] ): EventStream[(T1, T2, T3, T4, T5, T6, T7)] = { - new SampleCombineStream8[A, T1, T2, T3, T4, T5, T6, T7, (T1, T2, T3, T4, T5, T6, T7)](stream, s1, s2, s3, s4, s5, s6, s7, (_, v1, v2, v3, v4, v5, v6, v7) => (v1, v2, v3, v4, v5, v6, v7)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3, T4, T5, T6, T7)]( + stream, sampledSignals, combinator + ) } // -- @@ -233,20 +284,27 @@ class CombinableStream[A](val stream: EventStream[A]) extends AnyVal { )( combinator: (A, T1, T2, T3, T4, T5, T6, T7, T8) => Out ): EventStream[Out] = { - new CombineStream9(stream, s1, s2, s3, s4, s5, s6, s7, s8, combinator) + StaticStreamCombineOps.combineWithFn(stream, s1, s2, s3, s4, s5, s6, s7, s8)(combinator) } def withCurrentValueOf[T1, T2, T3, T4, T5, T6, T7, T8]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7], s8: SignalSource[T8] )(implicit c: Composition[A, (T1, T2, T3, T4, T5, T6, T7, T8)]): EventStream[c.Composed] = { - val combinator = (a: A, v1: T1, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => c.compose(a, (v1, v2, v3, v4, v5, v6, v7, v8)) - new SampleCombineStream9(stream, s1, s2, s3, s4, s5, s6, s7, s8, combinator) + val combinator = (arr: JsArray[Any]) => c.compose(arr(0).asInstanceOf[A], (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7], arr(8).asInstanceOf[T8])) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable) + new SampleCombineStreamN( + stream, sampledSignals, combinator + ) } def sample[T1, T2, T3, T4, T5, T6, T7, T8]( s1: SignalSource[T1], s2: SignalSource[T2], s3: SignalSource[T3], s4: SignalSource[T4], s5: SignalSource[T5], s6: SignalSource[T6], s7: SignalSource[T7], s8: SignalSource[T8] ): EventStream[(T1, T2, T3, T4, T5, T6, T7, T8)] = { - new SampleCombineStream9[A, T1, T2, T3, T4, T5, T6, T7, T8, (T1, T2, T3, T4, T5, T6, T7, T8)](stream, s1, s2, s3, s4, s5, s6, s7, s8, (_, v1, v2, v3, v4, v5, v6, v7, v8) => (v1, v2, v3, v4, v5, v6, v7, v8)) + val combinator = (arr: JsArray[Any]) => (arr(1).asInstanceOf[T1], arr(2).asInstanceOf[T2], arr(3).asInstanceOf[T3], arr(4).asInstanceOf[T4], arr(5).asInstanceOf[T5], arr(6).asInstanceOf[T6], arr(7).asInstanceOf[T7], arr(8).asInstanceOf[T8]) + val sampledSignals = JsArray[Signal[Any]](s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable) + new SampleCombineStreamN[Any, (T1, T2, T3, T4, T5, T6, T7, T8)]( + stream, sampledSignals, combinator + ) } // -- diff --git a/src/main/scala/com/raquo/airstream/combine/generated/CombineSignals.scala b/src/main/scala/com/raquo/airstream/combine/generated/CombineSignals.scala deleted file mode 100644 index d87f9a2a..00000000 --- a/src/main/scala/com/raquo/airstream/combine/generated/CombineSignals.scala +++ /dev/null @@ -1,170 +0,0 @@ -package com.raquo.airstream.combine.generated - -import com.raquo.airstream.combine.CombineSignalN -import com.raquo.airstream.core.Source.SignalSource - -// #Warning do not edit this file directly, it is generated by GenerateCombineSignals.scala - -// These are implementations of CombineSignalN used for Signal's `combine` and `combineWith` methods - -/** @param combinator Must not throw! */ -class CombineSignal2[T1, T2, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - combinator: (T1, T2) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal3[T1, T2, T3, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - combinator: (T1, T2, T3) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal4[T1, T2, T3, T4, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - combinator: (T1, T2, T3, T4) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal5[T1, T2, T3, T4, T5, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - parent5: SignalSource[T5], - combinator: (T1, T2, T3, T4, T5) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal6[T1, T2, T3, T4, T5, T6, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - parent5: SignalSource[T5], - parent6: SignalSource[T6], - combinator: (T1, T2, T3, T4, T5, T6) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal7[T1, T2, T3, T4, T5, T6, T7, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - parent5: SignalSource[T5], - parent6: SignalSource[T6], - parent7: SignalSource[T7], - combinator: (T1, T2, T3, T4, T5, T6, T7) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal8[T1, T2, T3, T4, T5, T6, T7, T8, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - parent5: SignalSource[T5], - parent6: SignalSource[T6], - parent7: SignalSource[T7], - parent8: SignalSource[T8], - combinator: (T1, T2, T3, T4, T5, T6, T7, T8) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: parent8.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - seq(7).asInstanceOf[T8], - ) -) - -/** @param combinator Must not throw! */ -class CombineSignal9[T1, T2, T3, T4, T5, T6, T7, T8, T9, Out]( - parent1: SignalSource[T1], - parent2: SignalSource[T2], - parent3: SignalSource[T3], - parent4: SignalSource[T4], - parent5: SignalSource[T5], - parent6: SignalSource[T6], - parent7: SignalSource[T7], - parent8: SignalSource[T8], - parent9: SignalSource[T9], - combinator: (T1, T2, T3, T4, T5, T6, T7, T8, T9) => Out -) extends CombineSignalN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: parent8.toObservable :: parent9.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - seq(7).asInstanceOf[T8], - seq(8).asInstanceOf[T9], - ) -) - - diff --git a/src/main/scala/com/raquo/airstream/combine/generated/CombineStreams.scala b/src/main/scala/com/raquo/airstream/combine/generated/CombineStreams.scala deleted file mode 100644 index 1d7485a6..00000000 --- a/src/main/scala/com/raquo/airstream/combine/generated/CombineStreams.scala +++ /dev/null @@ -1,169 +0,0 @@ -package com.raquo.airstream.combine.generated - -import com.raquo.airstream.combine.CombineStreamN -import com.raquo.airstream.core.Source.EventSource - -// #Warning do not edit this file directly, it is generated by GenerateCombineStreams.scala - -// These are implementations of CombineStreamN used for EventStream's `combine` and `combineWith` methods - -/** @param combinator Must not throw! */ -class CombineStream2[T1, T2, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - combinator: (T1, T2) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream3[T1, T2, T3, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - combinator: (T1, T2, T3) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream4[T1, T2, T3, T4, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - combinator: (T1, T2, T3, T4) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream5[T1, T2, T3, T4, T5, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - parent5: EventSource[T5], - combinator: (T1, T2, T3, T4, T5) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream6[T1, T2, T3, T4, T5, T6, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - parent5: EventSource[T5], - parent6: EventSource[T6], - combinator: (T1, T2, T3, T4, T5, T6) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream7[T1, T2, T3, T4, T5, T6, T7, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - parent5: EventSource[T5], - parent6: EventSource[T6], - parent7: EventSource[T7], - combinator: (T1, T2, T3, T4, T5, T6, T7) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream8[T1, T2, T3, T4, T5, T6, T7, T8, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - parent5: EventSource[T5], - parent6: EventSource[T6], - parent7: EventSource[T7], - parent8: EventSource[T8], - combinator: (T1, T2, T3, T4, T5, T6, T7, T8) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: parent8.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - seq(7).asInstanceOf[T8], - ) -) - -/** @param combinator Must not throw! */ -class CombineStream9[T1, T2, T3, T4, T5, T6, T7, T8, T9, Out]( - parent1: EventSource[T1], - parent2: EventSource[T2], - parent3: EventSource[T3], - parent4: EventSource[T4], - parent5: EventSource[T5], - parent6: EventSource[T6], - parent7: EventSource[T7], - parent8: EventSource[T8], - parent9: EventSource[T9], - combinator: (T1, T2, T3, T4, T5, T6, T7, T8, T9) => Out -) extends CombineStreamN[Any, Out]( - parents = parent1.toObservable :: parent2.toObservable :: parent3.toObservable :: parent4.toObservable :: parent5.toObservable :: parent6.toObservable :: parent7.toObservable :: parent8.toObservable :: parent9.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T1], - seq(1).asInstanceOf[T2], - seq(2).asInstanceOf[T3], - seq(3).asInstanceOf[T4], - seq(4).asInstanceOf[T5], - seq(5).asInstanceOf[T6], - seq(6).asInstanceOf[T7], - seq(7).asInstanceOf[T8], - seq(8).asInstanceOf[T9], - ) -) - diff --git a/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineSignals.scala b/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineSignals.scala deleted file mode 100644 index 1b3640d0..00000000 --- a/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineSignals.scala +++ /dev/null @@ -1,179 +0,0 @@ -package com.raquo.airstream.combine.generated - -import com.raquo.airstream.combine.SampleCombineSignalN -import com.raquo.airstream.core.Signal -import com.raquo.airstream.core.Source.SignalSource - -// #Warning do not edit this file directly, it is generated by GenerateSampleCombineSignals.scala - -// These are implementations of SampleCombineSignalN used for Signal's `withCurrentValueOf` and `sample` methods - -/** @param combinator Must not throw! */ -class SampleCombineSignal2[T0, T1, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - combinator: (T0, T1) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal3[T0, T1, T2, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - combinator: (T0, T1, T2) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal4[T0, T1, T2, T3, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - combinator: (T0, T1, T2, T3) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal5[T0, T1, T2, T3, T4, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - combinator: (T0, T1, T2, T3, T4) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal6[T0, T1, T2, T3, T4, T5, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - combinator: (T0, T1, T2, T3, T4, T5) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal7[T0, T1, T2, T3, T4, T5, T6, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - combinator: (T0, T1, T2, T3, T4, T5, T6) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal8[T0, T1, T2, T3, T4, T5, T6, T7, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - sampledSignal7: SignalSource[T7], - combinator: (T0, T1, T2, T3, T4, T5, T6, T7) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: sampledSignal7.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - seq(7).asInstanceOf[T7], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineSignal9[T0, T1, T2, T3, T4, T5, T6, T7, T8, Out]( - samplingSignal: Signal[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - sampledSignal7: SignalSource[T7], - sampledSignal8: SignalSource[T8], - combinator: (T0, T1, T2, T3, T4, T5, T6, T7, T8) => Out -) extends SampleCombineSignalN[Any, Out]( - samplingSignal = samplingSignal, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: sampledSignal7.toObservable :: sampledSignal8.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - seq(7).asInstanceOf[T7], - seq(8).asInstanceOf[T8], - ) -) - - diff --git a/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineStreams.scala b/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineStreams.scala deleted file mode 100644 index 8d28239b..00000000 --- a/src/main/scala/com/raquo/airstream/combine/generated/SampleCombineStreams.scala +++ /dev/null @@ -1,179 +0,0 @@ -package com.raquo.airstream.combine.generated - -import com.raquo.airstream.combine.SampleCombineStreamN -import com.raquo.airstream.core.EventStream -import com.raquo.airstream.core.Source.SignalSource - -// #Warning do not edit this file directly, it is generated by GenerateSampleCombineStreams.scala - -// These are implementations of SampleCombineStreamN used for EventStream's `withCurrentValueOf` and `sample` methods - -/** @param combinator Must not throw! */ -class SampleCombineStream2[T0, T1, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - combinator: (T0, T1) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream3[T0, T1, T2, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - combinator: (T0, T1, T2) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream4[T0, T1, T2, T3, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - combinator: (T0, T1, T2, T3) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream5[T0, T1, T2, T3, T4, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - combinator: (T0, T1, T2, T3, T4) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream6[T0, T1, T2, T3, T4, T5, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - combinator: (T0, T1, T2, T3, T4, T5) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream7[T0, T1, T2, T3, T4, T5, T6, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - combinator: (T0, T1, T2, T3, T4, T5, T6) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream8[T0, T1, T2, T3, T4, T5, T6, T7, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - sampledSignal7: SignalSource[T7], - combinator: (T0, T1, T2, T3, T4, T5, T6, T7) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: sampledSignal7.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - seq(7).asInstanceOf[T7], - ) -) - -/** @param combinator Must not throw! */ -class SampleCombineStream9[T0, T1, T2, T3, T4, T5, T6, T7, T8, Out]( - samplingStream: EventStream[T0], - sampledSignal1: SignalSource[T1], - sampledSignal2: SignalSource[T2], - sampledSignal3: SignalSource[T3], - sampledSignal4: SignalSource[T4], - sampledSignal5: SignalSource[T5], - sampledSignal6: SignalSource[T6], - sampledSignal7: SignalSource[T7], - sampledSignal8: SignalSource[T8], - combinator: (T0, T1, T2, T3, T4, T5, T6, T7, T8) => Out -) extends SampleCombineStreamN[Any, Out]( - samplingStream = samplingStream, - sampledSignals = sampledSignal1.toObservable :: sampledSignal2.toObservable :: sampledSignal3.toObservable :: sampledSignal4.toObservable :: sampledSignal5.toObservable :: sampledSignal6.toObservable :: sampledSignal7.toObservable :: sampledSignal8.toObservable :: Nil, - combinator = seq => combinator( - seq(0).asInstanceOf[T0], - seq(1).asInstanceOf[T1], - seq(2).asInstanceOf[T2], - seq(3).asInstanceOf[T3], - seq(4).asInstanceOf[T4], - seq(5).asInstanceOf[T5], - seq(6).asInstanceOf[T6], - seq(7).asInstanceOf[T7], - seq(8).asInstanceOf[T8], - ) -) - - diff --git a/src/main/scala/com/raquo/airstream/combine/generated/StaticSignalCombineOps.scala b/src/main/scala/com/raquo/airstream/combine/generated/StaticSignalCombineOps.scala index 921fff21..ec02347f 100644 --- a/src/main/scala/com/raquo/airstream/combine/generated/StaticSignalCombineOps.scala +++ b/src/main/scala/com/raquo/airstream/combine/generated/StaticSignalCombineOps.scala @@ -1,7 +1,9 @@ package com.raquo.airstream.combine.generated +import com.raquo.airstream.combine.CombineSignalN import com.raquo.airstream.core.Signal import com.raquo.airstream.core.Source.SignalSource +import com.raquo.ew.JsArray // #Warning do not edit this file directly, it is generated by GenerateStaticSignalCombineOps.scala @@ -22,7 +24,13 @@ object StaticSignalCombineOps { )( combinator: (T1, T2) => Out ): Signal[Out] = { - new CombineSignal2(s1, s2, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + ) + ) } // -- @@ -39,7 +47,14 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3) => Out ): Signal[Out] = { - new CombineSignal3(s1, s2, s3, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + ) + ) } // -- @@ -56,7 +71,15 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4) => Out ): Signal[Out] = { - new CombineSignal4(s1, s2, s3, s4, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + ) + ) } // -- @@ -73,7 +96,16 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4, T5) => Out ): Signal[Out] = { - new CombineSignal5(s1, s2, s3, s4, s5, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + ) + ) } // -- @@ -90,7 +122,17 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6) => Out ): Signal[Out] = { - new CombineSignal6(s1, s2, s3, s4, s5, s6, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + ) + ) } // -- @@ -107,7 +149,18 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7) => Out ): Signal[Out] = { - new CombineSignal7(s1, s2, s3, s4, s5, s6, s7, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + ) + ) } // -- @@ -124,7 +177,19 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7, T8) => Out ): Signal[Out] = { - new CombineSignal8(s1, s2, s3, s4, s5, s6, s7, s8, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + arr(7).asInstanceOf[T8], + ) + ) } // -- @@ -141,7 +206,20 @@ object StaticSignalCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7, T8, T9) => Out ): Signal[Out] = { - new CombineSignal9(s1, s2, s3, s4, s5, s6, s7, s8, s9, combinator) + new CombineSignalN[Any, Out]( + parents = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable, s9.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + arr(7).asInstanceOf[T8], + arr(8).asInstanceOf[T9], + ) + ) } // -- diff --git a/src/main/scala/com/raquo/airstream/combine/generated/StaticStreamCombineOps.scala b/src/main/scala/com/raquo/airstream/combine/generated/StaticStreamCombineOps.scala index 97d19639..3553f67e 100644 --- a/src/main/scala/com/raquo/airstream/combine/generated/StaticStreamCombineOps.scala +++ b/src/main/scala/com/raquo/airstream/combine/generated/StaticStreamCombineOps.scala @@ -1,7 +1,9 @@ package com.raquo.airstream.combine.generated +import com.raquo.airstream.combine.CombineStreamN import com.raquo.airstream.core.EventStream import com.raquo.airstream.core.Source.EventSource +import com.raquo.ew.JsArray // #Warning do not edit this file directly, it is generated by GenerateStaticStreamCombineOps.scala @@ -22,7 +24,13 @@ object StaticStreamCombineOps { )( combinator: (T1, T2) => Out ): EventStream[Out] = { - new CombineStream2(s1, s2, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + ) + ) } // -- @@ -39,7 +47,14 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3) => Out ): EventStream[Out] = { - new CombineStream3(s1, s2, s3, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + ) + ) } // -- @@ -56,7 +71,15 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4) => Out ): EventStream[Out] = { - new CombineStream4(s1, s2, s3, s4, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + ) + ) } // -- @@ -73,7 +96,16 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4, T5) => Out ): EventStream[Out] = { - new CombineStream5(s1, s2, s3, s4, s5, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + ) + ) } // -- @@ -90,7 +122,17 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6) => Out ): EventStream[Out] = { - new CombineStream6(s1, s2, s3, s4, s5, s6, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + ) + ) } // -- @@ -107,7 +149,18 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7) => Out ): EventStream[Out] = { - new CombineStream7(s1, s2, s3, s4, s5, s6, s7, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + ) + ) } // -- @@ -124,7 +177,19 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7, T8) => Out ): EventStream[Out] = { - new CombineStream8(s1, s2, s3, s4, s5, s6, s7, s8, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + arr(7).asInstanceOf[T8], + ) + ) } // -- @@ -141,7 +206,20 @@ object StaticStreamCombineOps { )( combinator: (T1, T2, T3, T4, T5, T6, T7, T8, T9) => Out ): EventStream[Out] = { - new CombineStream9(s1, s2, s3, s4, s5, s6, s7, s8, s9, combinator) + new CombineStreamN[Any, Out]( + parentStreams = JsArray(s1.toObservable, s2.toObservable, s3.toObservable, s4.toObservable, s5.toObservable, s6.toObservable, s7.toObservable, s8.toObservable, s9.toObservable), + combinator = arr => combinator( + arr(0).asInstanceOf[T1], + arr(1).asInstanceOf[T2], + arr(2).asInstanceOf[T3], + arr(3).asInstanceOf[T4], + arr(4).asInstanceOf[T5], + arr(5).asInstanceOf[T6], + arr(6).asInstanceOf[T7], + arr(7).asInstanceOf[T8], + arr(8).asInstanceOf[T9], + ) + ) } // -- diff --git a/src/main/scala/com/raquo/airstream/common/MultiParentSignal.scala b/src/main/scala/com/raquo/airstream/common/MultiParentSignal.scala index 78589ccd..25e4e1ea 100644 --- a/src/main/scala/com/raquo/airstream/common/MultiParentSignal.scala +++ b/src/main/scala/com/raquo/airstream/common/MultiParentSignal.scala @@ -4,35 +4,32 @@ import com.raquo.airstream.core.{Protected, Signal, WritableSignal} import com.raquo.ew.JsArray /** A simple signal that has multiple parents. */ -trait MultiParentSignal[+I, O] extends WritableSignal[O] { +trait MultiParentSignal[I, O] extends WritableSignal[O] { - // #nc[perf] should this maybe be js.Array? - protected[this] val parents: Seq[Signal[I]] + /** This array is read-only, never update it. */ + protected[this] val parents: JsArray[Signal[I]] - protected[this] lazy val _parentLastUpdateIds: JsArray[Int] = JsArray(parents.map(Protected.lastUpdateId): _*) // #nc inefficient + protected[this] lazy val _parentLastUpdateIds: JsArray[Int] = parents.map(Protected.lastUpdateId(_)) override protected def onWillStart(): Unit = { - // #nc redundant loop eh? ugly af - parents.foreach(Protected.maybeWillStart) - val shouldPullFromParent = updateParentLastTrxIds() + parents.forEach(Protected.maybeWillStart(_)) + val shouldPullFromParent = updateParentLastUpdateIds() if (shouldPullFromParent) { updateCurrentValueFromParent() } } /** @return Whether parent has emitted since last time we checked */ - protected[this] def updateParentLastTrxIds(): Boolean = { - var ix = 0 + protected[this] def updateParentLastUpdateIds(): Boolean = { var parentHasUpdated = false - while (ix < parents.size) { - val newLastTrxId = Protected.lastUpdateId(parents(ix)) - val lastSeenParentTrxId = _parentLastUpdateIds(ix) - if (newLastTrxId != lastSeenParentTrxId) { - _parentLastUpdateIds.update(ix, newLastTrxId) + parents.forEachWithIndex { (parent, ix) => { + val newLastUpdateId = Protected.lastUpdateId(parent) + val lastSeenParentUpdateId = _parentLastUpdateIds(ix) + if (newLastUpdateId != lastSeenParentUpdateId) { + _parentLastUpdateIds.update(ix, newLastUpdateId) parentHasUpdated = true } - ix += 1 - } + }} parentHasUpdated } diff --git a/src/main/scala/com/raquo/airstream/common/MultiParentStream.scala b/src/main/scala/com/raquo/airstream/common/MultiParentStream.scala index 94a1c289..c98b005c 100644 --- a/src/main/scala/com/raquo/airstream/common/MultiParentStream.scala +++ b/src/main/scala/com/raquo/airstream/common/MultiParentStream.scala @@ -1,14 +1,16 @@ package com.raquo.airstream.common import com.raquo.airstream.core.{Observable, Protected, WritableStream} +import com.raquo.ew.JsArray /** A simple stream that has multiple parents. */ -trait MultiParentStream[+I, O] extends WritableStream[O] { +trait MultiParentStream[I, O] extends WritableStream[O] { - protected[this] val parents: Seq[Observable[I]] + /** This array is read-only, never update it. */ + protected[this] val parents: JsArray[Observable[I]] override protected def onWillStart(): Unit = { - parents.foreach(Protected.maybeWillStart) + parents.forEach(Protected.maybeWillStart(_)) } } diff --git a/src/main/scala/com/raquo/airstream/core/BaseObservable.scala b/src/main/scala/com/raquo/airstream/core/BaseObservable.scala index e92e9096..6a421498 100644 --- a/src/main/scala/com/raquo/airstream/core/BaseObservable.scala +++ b/src/main/scala/com/raquo/airstream/core/BaseObservable.scala @@ -265,8 +265,6 @@ trait BaseObservable[+Self[+_] <: Observable[_], +A] extends Source[A] with Name } } - // #nc make onStart / onStop non-abstract - /** This method is fired when this observable starts working (listening for parent events and/or firing its own events), * that is, when it gets its first Observer (internal or external). * diff --git a/src/main/scala/com/raquo/airstream/core/EventStream.scala b/src/main/scala/com/raquo/airstream/core/EventStream.scala index 8b042922..93e1cf54 100644 --- a/src/main/scala/com/raquo/airstream/core/EventStream.scala +++ b/src/main/scala/com/raquo/airstream/core/EventStream.scala @@ -12,6 +12,7 @@ import com.raquo.airstream.misc._ import com.raquo.airstream.misc.generated._ import com.raquo.airstream.split.{SplittableOneStream, SplittableOptionStream, SplittableStream} import com.raquo.airstream.timing._ +import com.raquo.ew.JsArray import scala.annotation.unused import scala.concurrent.{ExecutionContext, Future} @@ -400,18 +401,18 @@ object EventStream { } def sequence[A](streams: Seq[EventStream[A]]): EventStream[Seq[A]] = { - new CombineStreamN[A, Seq[A]](streams, identity) + new CombineStreamN[A, Seq[A]](JsArray(streams: _*), _.asScalaJs.toSeq) } @inline def combineSeq[A](streams: Seq[EventStream[A]]): EventStream[Seq[A]] = sequence(streams) /** Returns a stream that emits events from all off the `streams`, interleaved. */ def merge[A](streams: EventStream[A]*): EventStream[A] = { - new MergeStream[A](streams) + new MergeStream[A](JsArray(streams: _*)) } - @inline def mergeSeq[A](streams: Seq[EventStream[A]]): EventStream[A] = { - merge(streams: _*) // @TODO[Performance] Does _* introduce any overhead in Scala.js? + def mergeSeq[A](streams: Seq[EventStream[A]]): EventStream[A] = { + new MergeStream[A](JsArray(streams: _*)) } /** Provides methods on EventStream companion object: combine, combineWith */ diff --git a/src/main/scala/com/raquo/airstream/core/Protected.scala b/src/main/scala/com/raquo/airstream/core/Protected.scala index 9b0f07da..0a3450a8 100644 --- a/src/main/scala/com/raquo/airstream/core/Protected.scala +++ b/src/main/scala/com/raquo/airstream/core/Protected.scala @@ -1,5 +1,7 @@ package com.raquo.airstream.core +import com.raquo.ew.JsArray + import scala.annotation.{implicitNotFound, unused} import scala.util.Try @@ -26,10 +28,39 @@ object Protected { BaseObservable.topoRank(observable) } + // Note: this implementation is not used in Airstream, and is provided + // only for third party developers who don't want to use JsArray. def maxTopoRank[O[+_] <: Observable[_]](observables: Iterable[BaseObservable[O, _]]): Int = { observables.foldLeft(0)((maxRank, parent) => Protected.topoRank(parent) max maxRank) } + @inline def maxTopoRank[O <: Observable[_]]( + observables: JsArray[O] + ): Int = { + maxTopoRank(minRank = 0, observables) + } + + def maxTopoRank[O <: Observable[_]]( + observable: Observable[_], + observables: JsArray[O] + ): Int = { + maxTopoRank(minRank = Protected.topoRank(observable), observables) + } + + def maxTopoRank[O <: Observable[_]]( + minRank: Int, + observables: JsArray[O] + ): Int = { + var maxRank = minRank + observables.forEach { observable => + val rank = Protected.topoRank(observable) + if (rank > maxRank) { + maxRank = rank + } + } + maxRank + } + def lastUpdateId(signal: Signal[_])(implicit @unused ev: Protected): Int = signal.lastUpdateId @inline def tryNow[A](signal: Signal[A])(implicit @unused ev: Protected): Try[A] = signal.tryNow() diff --git a/src/main/scala/com/raquo/airstream/core/Signal.scala b/src/main/scala/com/raquo/airstream/core/Signal.scala index 2e669b72..8a7c7f35 100644 --- a/src/main/scala/com/raquo/airstream/core/Signal.scala +++ b/src/main/scala/com/raquo/airstream/core/Signal.scala @@ -8,11 +8,12 @@ import com.raquo.airstream.custom.{CustomSignalSource, CustomSource} import com.raquo.airstream.debug.{DebuggableSignal, Debugger, DebuggerSignal} import com.raquo.airstream.distinct.DistinctSignal import com.raquo.airstream.misc.generated._ -import com.raquo.airstream.misc.{StreamFromSignal, MapSignal, ScanLeftSignal} +import com.raquo.airstream.misc.{MapSignal, ScanLeftSignal, StreamFromSignal} import com.raquo.airstream.ownership.Owner import com.raquo.airstream.split.{SplittableOneSignal, SplittableOptionSignal, SplittableSignal} import com.raquo.airstream.state.{ObservedSignal, OwnedSignal, Val} import com.raquo.airstream.timing.JsPromiseSignal +import com.raquo.ew.JsArray import scala.annotation.unused import scala.concurrent.{ExecutionContext, Future} @@ -214,7 +215,7 @@ object Signal { def sequence[A]( signals: Seq[Signal[A]] ): Signal[Seq[A]] = { - new CombineSignalN[A, Seq[A]](signals, identity) + new CombineSignalN[A, Seq[A]](JsArray(signals: _*), _.asScalaJs.toSeq) } @inline def combineSeq[A](signals: Seq[Signal[A]]): Signal[Seq[A]] = sequence(signals) diff --git a/src/main/scala/com/raquo/airstream/core/Source.scala b/src/main/scala/com/raquo/airstream/core/Source.scala index d4420d7b..3a5faabf 100644 --- a/src/main/scala/com/raquo/airstream/core/Source.scala +++ b/src/main/scala/com/raquo/airstream/core/Source.scala @@ -27,7 +27,7 @@ object Source { override def toObservable: Signal[A] } - // #TODO[API] Disable integrations, see if anyone complains. These conversions are unfortunately not smooth enough to be implicit. + // #TODO[API] Disabled integrations, let's see if anyone complains. These conversions are unfortunately not smooth enough to be implicit. //implicit def futureToEventSource[A](future: Future[A]): EventSource[A] = EventStream.fromFuture(future) // diff --git a/src/test/scala/com/raquo/airstream/flatten/SwitchSignalSpec.scala b/src/test/scala/com/raquo/airstream/flatten/SwitchSignalSpec.scala index 1c5af21d..8a51e775 100644 --- a/src/test/scala/com/raquo/airstream/flatten/SwitchSignalSpec.scala +++ b/src/test/scala/com/raquo/airstream/flatten/SwitchSignalSpec.scala @@ -375,11 +375,6 @@ class SwitchSignalSpec extends UnitSpec { .flatMap { num => if (num < 1000) { smallI += 1 - // #TODO[API]: if this `intSignal.map("small: " + _)` signal was cached / reused instead, it would - // result in duplicate events, which is not great, but kind of expected, because SwitchSignal - // ensures that it emits an event every time that the parent emits, for consistency. But since - // the inner signal is also the parent signal, this results in event duplication. - // - See the isSameSignal logic in SwitchSignal intSignal.map("small: " + _).setDisplayName(s"small-$smallI") //.debugLogLifecycle() } else { bigI += 1