monix.execution.Ack Scala Examples
The following examples show how to use monix.execution.Ack.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: JsonRpcClient.scala From lsp4s with Apache License 2.0 | 5 votes |
package scala.meta.jsonrpc import scala.concurrent.Future import io.circe.Decoder import io.circe.Encoder import monix.eval.Task import monix.execution.Ack trait JsonRpcClient { final def notify[A]( endpoint: Endpoint[A, Unit], notification: A ): Future[Ack] = notify[A](endpoint.method, notification)(endpoint.encoderA) def notify[A: Encoder](method: String, notification: A): Future[Ack] def serverRespond(response: Response): Future[Ack] def clientRespond(response: Response): Unit final def request[A, B]( endpoint: Endpoint[A, B], req: A ): Task[Either[Response.Error, B]] = request[A, B](endpoint.method, req)(endpoint.encoderA, endpoint.decoderB) def request[A: Encoder, B: Decoder]( method: String, request: A ): Task[Either[Response.Error, B]] } object JsonRpcClient { val empty: JsonRpcClient = new JsonRpcClient { override def notify[A: Encoder]( method: String, notification: A ): Future[Ack] = Ack.Continue override def serverRespond(response: Response): Future[Ack] = Ack.Continue override def clientRespond(response: Response): Unit = () override def request[A: Encoder, B: Decoder]( method: String, request: A ): Task[Either[Response.Error, B]] = Task.never } }
Example 2
Source File: ObservedLoadingCacheSpecification.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.utils import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicLong import com.google.common.base.Ticker import com.google.common.cache.{CacheBuilder, CacheLoader, LoadingCache} import com.wavesplatform.utils.ObservedLoadingCacheSpecification.FakeTicker import monix.execution.Ack import monix.reactive.Observer import org.scalamock.scalatest.MockFactory import org.scalatest.{FreeSpec, Matchers} import scala.jdk.CollectionConverters._ import scala.concurrent.Future import scala.concurrent.duration.DurationInt class ObservedLoadingCacheSpecification extends FreeSpec with Matchers with MockFactory { private val ExpiringTime = 10.minutes "notifies" - { "on refresh" in test { (loadingCache, changes, _) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() loadingCache.refresh("foo") } "on put" in test { (loadingCache, changes, _) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() loadingCache.put("foo", 10) } "on putAll" in test { (loadingCache, changes, _) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() (changes.onNext _).expects("bar").returning(Future.successful(Ack.Continue)).once() loadingCache.putAll(Map[String, Integer]("foo" -> 10, "bar" -> 11).asJava) } "on invalidate" in test { (loadingCache, changes, _) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() loadingCache.invalidate("foo") } "on invalidateAll" in test { (loadingCache, changes, _) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() (changes.onNext _).expects("bar").returning(Future.successful(Ack.Continue)).once() loadingCache.invalidateAll(Seq("foo", "bar").asJava) } } "don't notify" - { "on cache expiration" in test { (loadingCache, changes, ticker) => (changes.onNext _).expects("foo").returning(Future.successful(Ack.Continue)).once() loadingCache.put("foo", 1) ticker.advance(ExpiringTime.toMillis + 100, TimeUnit.MILLISECONDS) } } private def test(f: (LoadingCache[String, Integer], Observer[String], FakeTicker) => Unit): Unit = { val changes = mock[Observer[String]] val ticker = new FakeTicker() val delegate = CacheBuilder .newBuilder() .expireAfterWrite(ExpiringTime.toMillis, TimeUnit.MILLISECONDS) .ticker(ticker) .build(new CacheLoader[String, Integer] { override def load(key: String): Integer = key.length }) val loadingCache = new ObservedLoadingCache(delegate, changes) f(loadingCache, changes, ticker) } } private object ObservedLoadingCacheSpecification { // see https://github.com/google/guava/blob/master/guava-testlib/src/com/google/common/testing/FakeTicker.java class FakeTicker extends Ticker { private val nanos = new AtomicLong() private var autoIncrementStepNanos = 0L def advance(time: Long, timeUnit: TimeUnit): FakeTicker = advance(timeUnit.toNanos(time)) def advance(nanoseconds: Long): FakeTicker = { nanos.addAndGet(nanoseconds) this } def setAutoIncrementStep(autoIncrementStep: Long, timeUnit: TimeUnit): FakeTicker = { require(autoIncrementStep >= 0, "May not auto-increment by a negative amount") this.autoIncrementStepNanos = timeUnit.toNanos(autoIncrementStep) this } override def read: Long = nanos.getAndAdd(autoIncrementStepNanos) } }
Example 3
Source File: RxScheduler.scala From Waves with MIT License | 5 votes |
package com.wavesplatform import com.wavesplatform.account.KeyPair import com.wavesplatform.block.{Block, MicroBlock} import com.wavesplatform.common.state.ByteStr import com.wavesplatform.common.utils.EitherExt2 import com.wavesplatform.crypto._ import com.wavesplatform.lagonaki.mocks.TestBlock import com.wavesplatform.transaction.Asset.Waves import com.wavesplatform.transaction.transfer._ import monix.execution.schedulers.SchedulerService import monix.execution.{Ack, Scheduler} import monix.reactive.Observer import org.scalatest.{BeforeAndAfterAll, Suite} import scala.concurrent.duration._ import scala.concurrent.{Await, Future} trait RxScheduler extends BeforeAndAfterAll { _: Suite => implicit val implicitScheduler: SchedulerService = Scheduler.singleThread("rx-scheduler") def testSchedulerName: String lazy val testScheduler: SchedulerService = Scheduler.singleThread(testSchedulerName) def test[A](f: => Future[A]): A = Await.result(f, 10.seconds) def send[A](p: Observer[A])(a: A): Future[Ack] = p.onNext(a) .map(ack => { Thread.sleep(500) ack }) def byteStr(id: Int): ByteStr = ByteStr(Array.concat(Array.fill(SignatureLength - 1)(0), Array(id.toByte))) val signer: KeyPair = TestBlock.defaultSigner def block(id: Int): Block = TestBlock.create(Seq.empty).copy(signature = byteStr(id)) def microBlock(total: Int, prev: Int): MicroBlock = { val tx = TransferTransaction.selfSigned(1.toByte, signer, signer.toAddress, Waves, 1, Waves, 1, ByteStr.empty, 1).explicitGet() MicroBlock.buildAndSign(3.toByte, signer, Seq(tx), byteStr(prev), byteStr(total)).explicitGet() } override protected def afterAll(): Unit = { super.afterAll() implicitScheduler.shutdown() testScheduler.shutdown() } }
Example 4
Source File: GrpcMonix.scala From grpcmonix with MIT License | 5 votes |
package grpcmonix import com.google.common.util.concurrent.ListenableFuture import io.grpc.stub.StreamObserver import monix.eval.{Callback, Task} import monix.execution.Ack.{Continue, Stop} import monix.execution.{Ack, Scheduler} import monix.reactive.Observable import monix.reactive.observables.ObservableLike.{Operator, Transformer} import monix.reactive.observers.Subscriber import monix.reactive.subjects.PublishSubject import org.reactivestreams.{Subscriber => SubscriberR} import scalapb.grpc.Grpc import scala.concurrent.Future object GrpcMonix { type GrpcOperator[I, O] = StreamObserver[O] => StreamObserver[I] def guavaFutureToMonixTask[T](future: ListenableFuture[T]): Task[T] = Task.deferFuture { Grpc.guavaFuture2ScalaFuture(future) } def grpcOperatorToMonixOperator[I,O](grpcOperator: GrpcOperator[I,O]): Operator[I,O] = { outputSubsriber: Subscriber[O] => val outputObserver: StreamObserver[O] = monixSubscriberToGrpcObserver(outputSubsriber) val inputObserver: StreamObserver[I] = grpcOperator(outputObserver) grpcObserverToMonixSubscriber(inputObserver, outputSubsriber.scheduler) } def monixSubscriberToGrpcObserver[T](subscriber: Subscriber[T]): StreamObserver[T] = new StreamObserver[T] { override def onError(t: Throwable): Unit = subscriber.onError(t) override def onCompleted(): Unit = subscriber.onComplete() override def onNext(value: T): Unit = subscriber.onNext(value) } def reactiveSubscriberToGrpcObserver[T](subscriber: SubscriberR[_ >: T]): StreamObserver[T] = new StreamObserver[T] { override def onError(t: Throwable): Unit = subscriber.onError(t) override def onCompleted(): Unit = subscriber.onComplete() override def onNext(value: T): Unit = subscriber.onNext(value) } def grpcObserverToMonixSubscriber[T](observer: StreamObserver[T], s: Scheduler): Subscriber[T] = new Subscriber[T] { override implicit def scheduler: Scheduler = s override def onError(t: Throwable): Unit = observer.onError(t) override def onComplete(): Unit = observer.onCompleted() override def onNext(value: T): Future[Ack] = try { observer.onNext(value) Continue } catch { case t: Throwable => observer.onError(t) Stop } } def grpcObserverToMonixCallback[T](observer: StreamObserver[T]): Callback[T] = new Callback[T] { override def onError(t: Throwable): Unit = observer.onError(t) override def onSuccess(value: T): Unit = { observer.onNext(value) observer.onCompleted() } } def liftByGrpcOperator[I, O](observable: Observable[I], operator: GrpcOperator[I, O]): Observable[O] = observable.liftByOperator( grpcOperatorToMonixOperator(operator) ) def unliftByTransformer[I, O](transformer: Transformer[I, O], subscriber: Subscriber[O]): Subscriber[I] = new Subscriber[I] { private[this] val subject = PublishSubject[I]() subject.transform(transformer).subscribe(subscriber) override implicit def scheduler: Scheduler = subscriber.scheduler override def onError(t: Throwable): Unit = subject.onError(t) override def onComplete(): Unit = subject.onComplete() override def onNext(value: I): Future[Ack] = subject.onNext(value) } }
Example 5
Source File: TakeWhileInclusive.scala From tofu with Apache License 2.0 | 5 votes |
package tofu.observable import monix.execution.Ack import monix.execution.Ack.Stop import monix.reactive.observers.Subscriber import scala.concurrent.Future import scala.util.control.NonFatal //shameless copy of monix.reactive.internal.operators.TakeByPredicateOperator private[observable] final case class TakeWhileInclusive[A](p: A => Boolean, out: Subscriber[A]) extends Subscriber[A] { implicit val scheduler = out.scheduler private[this] var isActive = true def onNext(elem: A): Future[Ack] = { if (!isActive) Stop else { // Protects calls to user code from within an operator var streamError = true try { val isValid = p(elem) streamError = false if (isValid) out.onNext(elem) else { isActive = false out .onNext(elem) .map { _ => out.onComplete() Stop } } } catch { case NonFatal(ex) if streamError => onError(ex) Stop } } } def onComplete() = if (isActive) { isActive = false out.onComplete() } def onError(ex: Throwable) = if (isActive) { isActive = false out.onError(ex) } }
Example 6
Source File: Graph.scala From monix-sample with Apache License 2.0 | 5 votes |
package client import monix.execution.Ack import monix.execution.Ack.Continue import monix.reactive.Observer import shared.models.Signal import scala.concurrent.Future import scala.scalajs.js import scala.scalajs.js.Dynamic.{literal => obj, _} final class Graph(elementId: String) extends Observer[(Signal, Signal, Signal, Signal)] { private[this] var chart: js.Dynamic = _ def initChart(signal: (Signal, Signal, Signal, Signal)): js.Dynamic = { val (first, second, third, fourth) = signal val timestamp = Seq(first.timestamp, second.timestamp, third.timestamp, fourth.timestamp).max / 1000 global.jQuery(s"#$elementId").epoch(obj( "type" -> "time.line", "data" -> js.Array( obj( "label" -> "Series 1", "axes" -> js.Array("left", "bottom", "right"), "values" -> js.Array(obj( "time" -> timestamp, "y" -> first.value.toInt )) ), obj( "label" -> "Series 2", "axes" -> js.Array("left", "bottom", "right"), "values" -> js.Array(obj( "time" -> timestamp, "y" -> second.value.toInt )) ), obj( "label" -> "Series 3", "axes" -> js.Array("left", "bottom", "right"), "values" -> js.Array(obj( "time" -> timestamp, "y" -> third.value.toInt )) ), obj( "label" -> "Series 4", "axes" -> js.Array("left", "bottom", "right"), "values" -> js.Array(obj( "time" -> timestamp, "y" -> fourth.value.toInt )) ) ) )) } private def serialize(signal: (Signal, Signal, Signal, Signal)) = { val (first, second, third, fourth) = signal val timestamp = Seq(first.timestamp, second.timestamp, third.timestamp, fourth.timestamp).max / 1000 js.Array( obj( "time" -> timestamp, "y" -> first.value.toInt ), obj( "time" -> timestamp, "y" -> second.value.toInt ), obj( "time" -> timestamp, "y" -> third.value.toInt ), obj( "time" -> timestamp, "y" -> fourth.value.toInt )) } def onNext(signal: (Signal, Signal, Signal, Signal)): Future[Ack] = { if (chart == null) chart = initChart(signal) else chart.push(serialize(signal)) Continue } def onComplete(): Unit = () def onError(ex: Throwable): Unit = { System.err.println(s"ERROR: $ex") } }
Example 7
Source File: UdpIntegrationSpec.scala From monix-nio with Apache License 2.0 | 5 votes |
package monix.nio.udp import java.net.InetSocketAddress import minitest.SimpleTestSuite import monix.eval.Task import monix.execution.Ack import monix.execution.Ack.{ Continue, Stop } import monix.reactive.Observable import scala.concurrent.duration._ import scala.concurrent.{ Await, Promise } object UdpIntegrationSpec extends SimpleTestSuite { implicit val ctx = monix.execution.Scheduler.Implicits.global test("send and receive UDP packets successfully") { val data = Array.fill(8)("monix") val writes = (ch: TaskDatagramChannel, to: InetSocketAddress) => Observable .fromIterable(data) .mapEval(data => ch.send(Packet(data.getBytes, to))) val readsPromise = Promise[String]() val recv = new StringBuilder("") val reads = (ch: TaskDatagramChannel, maxSize: Int) => Observable .repeatEval(ch.receive(maxSize, 2.seconds)) .mapEval(t => t) .map { packet => packet.foreach(p => recv.append(new String(p.data))) packet } .guaranteeCase(_ => Task(readsPromise.success(recv.mkString))) .subscribe(_.fold[Ack](Stop)(_ => Continue)) val program = for { ch <- bind("localhost", 2115).map { ch => reads(ch, 64) ch } sent <- writes(ch, new InetSocketAddress("localhost", 2115)).sumL received <- Task.fromFuture(readsPromise.future) _ <- ch.close() } yield sent == 40 & received == data.mkString("") val result = Await.result(program.runToFuture, 10.seconds) assert(result) } }
Example 8
Source File: AsyncChannelConsumer.scala From monix-nio with Apache License 2.0 | 5 votes |
package monix.nio import java.nio.ByteBuffer import monix.execution.Ack.{ Continue, Stop } import monix.execution.{ Ack, Callback, Cancelable, Scheduler } import monix.execution.atomic.Atomic import monix.execution.cancelables.{ AssignableCancelable, SingleAssignCancelable } import monix.reactive.Consumer import monix.reactive.observers.Subscriber import scala.concurrent.{ Future, Promise } import scala.util.control.NonFatal private[nio] abstract class AsyncChannelConsumer extends Consumer[Array[Byte], Long] { def channel: Option[AsyncChannel] def withInitialPosition: Long = 0L def init(subscriber: AsyncChannelSubscriber): Future[Unit] = Future.successful(()) class AsyncChannelSubscriber(consumerCallback: Callback[Throwable, Long])(implicit val scheduler: Scheduler) extends Subscriber[Array[Byte]] { self => private[this] lazy val initFuture = init(self) private[this] val callbackCalled = Atomic(false) private[this] var position = withInitialPosition override def onNext(elem: Array[Byte]): Future[Ack] = { def write(): Future[Ack] = { val promise = Promise[Ack]() channel.foreach { sc => try { sc .write(ByteBuffer.wrap(elem), position) .runAsync( new Callback[Throwable, Int] { override def onError(exc: Throwable) = { closeChannel() sendError(exc) promise.success(Stop) } override def onSuccess(result: Int): Unit = { position += result promise.success(Continue) } }) } catch { case NonFatal(ex) => sendError(ex) promise.success(Stop) } } promise.future } if (initFuture.value.isEmpty) { initFuture.flatMap(_ => write()) } else { write() } } override def onComplete(): Unit = { channel.collect { case sc if sc.closeOnComplete => closeChannel() } if (callbackCalled.compareAndSet(expect = false, update = true)) consumerCallback.onSuccess(position) } override def onError(ex: Throwable): Unit = { closeChannel() sendError(ex) } private[nio] def onCancel(): Unit = { callbackCalled.set(true) closeChannel() } private[nio] def sendError(t: Throwable) = if (callbackCalled.compareAndSet(expect = false, update = true)) { scheduler.execute(new Runnable { def run() = consumerCallback.onError(t) }) } private[nio] final def closeChannel()(implicit scheduler: Scheduler) = channel.foreach(_.close().runToFuture) } override def createSubscriber(cb: Callback[Throwable, Long], s: Scheduler): (Subscriber[Array[Byte]], AssignableCancelable) = { val out = new AsyncChannelSubscriber(cb)(s) val extraCancelable = Cancelable(() => out.onCancel()) val conn = SingleAssignCancelable.plusOne(extraCancelable) (out, conn) } }
Example 9
Source File: LanguageClient.scala From lsp4s with Apache License 2.0 | 5 votes |
package scala.meta.jsonrpc import cats.syntax.either._ import io.circe.Decoder import io.circe.Encoder import io.circe.syntax._ import java.io.OutputStream import java.nio.ByteBuffer import monix.eval.Callback import monix.eval.Task import monix.execution.Ack import monix.execution.Cancelable import monix.execution.atomic.Atomic import monix.execution.atomic.AtomicInt import monix.reactive.Observer import scala.collection.concurrent.TrieMap import scala.concurrent.Future import scala.concurrent.duration.Duration import MonixEnrichments._ import scribe.LoggerSupport class LanguageClient(out: Observer[ByteBuffer], logger: LoggerSupport) extends JsonRpcClient { def this(out: OutputStream, logger: LoggerSupport) = this(Observer.fromOutputStream(out, logger), logger) private val writer = new MessageWriter(out, logger) private val counter: AtomicInt = Atomic(1) private val activeServerRequests = TrieMap.empty[RequestId, Callback[Response]] def notify[A: Encoder](method: String, notification: A): Future[Ack] = writer.write(Notification(method, Some(notification.asJson))) def serverRespond(response: Response): Future[Ack] = response match { case Response.Empty => Ack.Continue case x: Response.Success => writer.write(x) case x: Response.Error => logger.error(s"Response error: $x") writer.write(x) } def clientRespond(response: Response): Unit = for { id <- response match { case Response.Empty => None case Response.Success(_, requestId) => Some(requestId) case Response.Error(_, requestId) => Some(requestId) } callback <- activeServerRequests.get(id).orElse { logger.error(s"Response to unknown request: $response") None } } { activeServerRequests.remove(id) callback.onSuccess(response) } def request[A: Encoder, B: Decoder]( method: String, request: A ): Task[Either[Response.Error, B]] = { val nextId = RequestId(counter.incrementAndGet()) val response = Task.create[Response] { (out, cb) => val scheduled = out.scheduleOnce(Duration(0, "s")) { val json = Request(method, Some(request.asJson), nextId) activeServerRequests.put(nextId, cb) writer.write(json) } Cancelable { () => scheduled.cancel() this.notify("$/cancelRequest", CancelParams(nextId.value)) } } response.map { case Response.Empty => Left( Response.invalidParams( s"Got empty response for request $request", nextId ) ) case err: Response.Error => Left(err) case Response.Success(result, _) => result.as[B].leftMap { err => Response.invalidParams(err.toString, nextId) } } } } object LanguageClient { def fromOutputStream(out: OutputStream, logger: LoggerSupport) = new LanguageClient(Observer.fromOutputStream(out, logger), logger) }
Example 10
Source File: MonixEnrichments.scala From lsp4s with Apache License 2.0 | 5 votes |
package scala.meta.jsonrpc import java.io.IOException import java.io.OutputStream import java.nio.ByteBuffer import monix.execution.Ack import monix.execution.Cancelable import monix.execution.Scheduler import monix.reactive.Observable import monix.reactive.Observer import scribe.LoggerSupport object MonixEnrichments { class ObservableCurrentValue[+A](obs: Observable[A])(implicit s: Scheduler) extends (() => A) with Cancelable { private var value: Any = _ private val cancelable = obs.foreach(newValue => value = newValue) override def apply(): A = { if (value == null) { throw new NoSuchElementException( "Reading from empty Observable, consider using MulticastStrategy.behavior(initialValue)" ) } else { value.asInstanceOf[A] } } override def cancel(): Unit = cancelable.cancel() } implicit class XtensionObservable[A](val obs: Observable[A]) extends AnyVal { def focus[B: cats.Eq](f: A => B): Observable[B] = obs.distinctUntilChangedByKey(f).map(f) def toFunction0()(implicit s: Scheduler): () => A = toObservableCurrentValue() def toObservableCurrentValue()( implicit s: Scheduler ): ObservableCurrentValue[A] = new ObservableCurrentValue[A](obs) } implicit class XtensionObserverCompanion[A](val `_`: Observer.type) extends AnyVal { def fromOutputStream( out: OutputStream, logger: LoggerSupport ): Observer.Sync[ByteBuffer] = { new Observer.Sync[ByteBuffer] { private[this] var isClosed: Boolean = false override def onNext(elem: ByteBuffer): Ack = { if (isClosed) Ack.Stop else { try { while (elem.hasRemaining) out.write(elem.get()) out.flush() Ack.Continue } catch { case _: IOException => logger.error("OutputStream closed!") isClosed = true Ack.Stop } } } override def onError(ex: Throwable): Unit = () override def onComplete(): Unit = out.close() } } } }
Example 11
Source File: MessageWriter.scala From lsp4s with Apache License 2.0 | 5 votes |
package scala.meta.jsonrpc import java.io.ByteArrayOutputStream import java.io.OutputStream import java.io.OutputStreamWriter import java.io.PrintWriter import java.nio.ByteBuffer import java.nio.charset.StandardCharsets import scala.concurrent.Future import io.circe.syntax._ import monix.execution.Ack import monix.reactive.Observer import scribe.LoggerSupport def write(msg: Message): Future[Ack] = lock.synchronized { baos.reset() val json = msg.asJson val protocol = BaseProtocolMessage.fromJson(json) logger.trace(s" --> $json") val byteBuffer = MessageWriter.write(protocol, baos, headerOut) out.onNext(byteBuffer) } } object MessageWriter { def headerWriter(out: OutputStream): PrintWriter = { new PrintWriter(new OutputStreamWriter(out, StandardCharsets.US_ASCII)) } def write(message: BaseProtocolMessage): ByteBuffer = { val out = new ByteArrayOutputStream() val header = headerWriter(out) write(message, out, header) } def write( message: BaseProtocolMessage, out: ByteArrayOutputStream, headerOut: PrintWriter ): ByteBuffer = { message.header.foreach { case (key, value) => headerOut.write(key) headerOut.write(": ") headerOut.write(value) headerOut.write("\r\n") } headerOut.write("\r\n") out.write(message.content) out.flush() val buffer = ByteBuffer.wrap(out.toByteArray, 0, out.size()) buffer } }
Example 12
Source File: Endpoint.scala From lsp4s with Apache License 2.0 | 5 votes |
package scala.meta.jsonrpc import io.circe.Decoder import io.circe.Encoder import monix.eval.Task import monix.execution.Ack import scala.concurrent.Future class Endpoint[A: Decoder: Encoder, B: Decoder: Encoder](val method: String) { def encoderA: Encoder[A] = implicitly def decoderA: Decoder[A] = implicitly def encoderB: Encoder[B] = implicitly def decoderB: Decoder[B] = implicitly def request(request: A)( implicit client: JsonRpcClient ): Task[Either[Response.Error, B]] = client.request[A, B](method, request) def notify( notification: A )(implicit client: JsonRpcClient): Future[Ack] = client.notify[A](method, notification) } object Endpoint { def request[A: Decoder: Encoder, B: Decoder: Encoder]( method: String ): Endpoint[A, B] = new Endpoint(method) def notification[A: Decoder: Encoder](method: String): Endpoint[A, Unit] = new Endpoint(method) }
Example 13
Source File: Cp.scala From benchmarks with Apache License 2.0 | 5 votes |
package com.rossabaker package benchmarks import org.openjdk.jmh.annotations._ @State(Scope.Thread) @Fork(2) @Measurement(iterations = 10) @Warmup(iterations = 10) @Threads(1) class Cp extends BenchmarkUtils { @Benchmark def fs2Sync(): Unit = { import _root_.fs2._, Stream._ import java.nio.file.Paths io.file.readAll[Task](Paths.get("testdata/lorem-ipsum.txt"), 4096) .to(io.file.writeAll[Task](Paths.get("out/lorem-ipsum.txt"))) .run .unsafeRun } @Benchmark def fs2Async(): Unit = { import _root_.fs2._, Stream._ import java.nio.file.Paths io.file.readAllAsync[Task](Paths.get("testdata/lorem-ipsum.txt"), 4096) .to(io.file.writeAllAsync[Task](Paths.get("out/lorem-ipsum.txt"))) .run .unsafeRun } @Benchmark def scalazStreamIo(): Unit = { import _root_.scalaz.stream._, Process._ constant(4096) .through(io.fileChunkR("testdata/lorem-ipsum.txt")) .to(io.fileChunkW("out/lorem-ipsum.txt")) .run .unsafePerformSync } @Benchmark def scalazStreamNio(): Unit = { import _root_.scalaz.stream._, Process._ constant(4096) .through(nio.file.chunkR("testdata/lorem-ipsum.txt")) .to(nio.file.chunkW("out/lorem-ipsum.txt")) .run .unsafePerformSync } } callback.onError(ex) } def onComplete(): Unit = { try { out.close() callback.onSuccess(()) } catch { case NonFatal(ex) => callback.onError(ex) } } } } Await.result( copyFile(new File("testdata/lorem-ipsum.txt"), new File("out/lorem-ipsum.txt"), 4096) .runAsync(monixScheduler), Duration.Inf ) } }
Example 14
Source File: Implicits.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.util import monix.execution.{Ack, Cancelable} import monix.reactive.observers.Subscriber import monix.reactive.subjects.Subject import scala.concurrent.Future object Implicits { final implicit class SubjectOps(val self: Subject.type) extends AnyVal { def empty[T]: Subject[T, T] = new Subject[T, T] { override def size: Int = 0 override def unsafeSubscribeFn(subscriber: Subscriber[T]): Cancelable = Cancelable.empty override def onNext(elem: T): Future[Ack] = Future.successful(Ack.Stop) override def onError(ex: Throwable): Unit = {} override def onComplete(): Unit = {} } } }
Example 15
Source File: ObservableSpec.scala From gbf-raidfinder with MIT License | 5 votes |
package walfie.gbf.raidfinder.util import monix.eval.Task import monix.execution.Ack import monix.execution.schedulers.TestScheduler import monix.reactive.{Observable, Observer} import org.scalatest._ import org.scalatest.concurrent.ScalaFutures import org.scalatest.Matchers._ import scala.concurrent.Future class ObservableSpec extends FreeSpec with ScalaFutures { case class Item(id: Int) object ItemRepository { def getItems(count: Int, pageNum: Int): Future[Seq[Item]] = Future.successful { (0 until count).map(i => Item(pageNum * count + i)) } } // This was added as [[ObservableUtil.fromAsyncStateAction]] before // [[Observable.fromAsyncStateAction]] existed in Monix. Keeping these // tests around because why not. "fromAsyncStateAction" - { implicit val scheduler = TestScheduler() "yield an observable" in { val itemsPerPage = 5 val observable = Observable.fromAsyncStateAction { pageNum: Int => val nextPage = pageNum + 1 val itemsF = ItemRepository.getItems(itemsPerPage, pageNum) Task.fromFuture(itemsF).map(_ -> nextPage) }(0) val resultF = observable.take(3).toListL.runAsync scheduler.tick() resultF.futureValue shouldBe Seq( (0 to 4).map(Item.apply), (5 to 9).map(Item.apply), (10 to 14).map(Item.apply) ) } "stop on error" in { implicit val scheduler = TestScheduler() // Create an observable counter that errors when it gets to 5 val error = new RuntimeException("Oh no!") val observable = Observable .fromAsyncStateAction[Int, Int] { counter: Int => Task.fromFuture { if (counter == 5) Future.failed(error) else Future.successful(counter -> (counter + 1)) } }(0) val observer = new TestObserver[Int] observable.take(10).subscribe(observer) scheduler.tick() observer.received shouldBe (0 to 4) } } }
Example 16
Source File: TestObserver.scala From gbf-raidfinder with MIT License | 5 votes |
package walfie.gbf.raidfinder.util import monix.execution.Ack import monix.reactive.Observer import scala.concurrent.Future class TestObserver[T] extends Observer[T] { var received = Vector.empty[T] var errorsReceived = Vector.empty[Throwable] var isComplete: Boolean = false def onNext(elem: T): Future[Ack] = { received = received :+ elem Ack.Continue } def onError(e: Throwable): Unit = { errorsReceived = errorsReceived :+ e } def onComplete(): Unit = { isComplete = true } }
Example 17
Source File: ObservablesPartitioner.scala From gbf-raidfinder with MIT License | 5 votes |
package walfie.gbf.raidfinder.util import akka.agent.Agent import monix.execution.{Ack, Cancelable, Scheduler} import monix.reactive._ import monix.reactive.observables.GroupedObservable import monix.reactive.observers.Subscriber import monix.reactive.subjects.PublishSubject import scala.concurrent.{ExecutionContext, Future} trait ObservablesPartitioner[K, V] { def getObservable(key: K): Observable[V] } object CachedObservablesPartitioner { def fromUngroupedObservable[K, InputV, OutputV]( observable: Observable[InputV], cacheSizePerKey: Int, keySelector: InputV => K, mappingFunction: InputV => OutputV )(implicit scheduler: Scheduler): (CachedObservablesPartitioner[K, InputV, OutputV], Cancelable) = { val partitioner = new CachedObservablesPartitioner[K, InputV, OutputV](cacheSizePerKey, mappingFunction) val cancelable = observable.groupBy(keySelector).subscribe(partitioner) (partitioner, cancelable) } } class CachedObservablesPartitioner[K, InputV, OutputV]( cacheSizePerKey: Int, mappingFunction: InputV => OutputV )(implicit ec: ExecutionContext) extends Observer[GroupedObservable[K, InputV]] with ObservablesPartitioner[K, OutputV] { private val observablesByKey = Agent[Map[K, Observable[OutputV]]](Map.empty) private val incomingKeys = PublishSubject[K]() def onComplete(): Unit = { incomingKeys.onComplete() } def onError(e: Throwable): Unit = { System.err.println(e) // TODO: Better logging? incomingKeys.onError(e) } def getObservable(key: K): Observable[OutputV] = { observablesByKey.get.getOrElse( key, incomingKeys.findF(_ == key).flatMap(_ => getObservable(key)) ) } }
Example 18
Source File: KnownBossesMap.scala From gbf-raidfinder with MIT License | 3 votes |
package walfie.gbf.raidfinder import akka.agent.Agent import java.util.Date import monix.execution.{Ack, Cancelable, Scheduler} import monix.reactive._ import monix.reactive.subjects.ConcurrentSubject import scala.concurrent.{ExecutionContext, Future} import walfie.gbf.raidfinder.domain._ trait KnownBossesMap { def get(): Map[BossName, RaidBoss] def newBossObservable(): Observable[RaidBoss] class KnownBossesObserver( initialBosses: Seq[RaidBoss] )(implicit scheduler: Scheduler) extends Observer[RaidInfo] with KnownBossesMap { private val agent = Agent[Map[BossName, RaidBoss]]( initialBosses.map(boss => boss.name -> boss)(scala.collection.breakOut) ) // TODO: Write test for this private val subject = ConcurrentSubject.publish[RaidBoss] val newBossObservable: Observable[RaidBoss] = subject def onComplete(): Unit = () def onError(e: Throwable): Unit = () def onNext(elem: RaidInfo): Future[Ack] = { val name = elem.tweet.bossName val raidBoss = elem.boss if (!agent.get.isDefinedAt(name)) { subject.onNext(raidBoss) } agent.alter(_.updated(name, raidBoss)).flatMap(_ => Ack.Continue) } def get(): Map[BossName, RaidBoss] = agent.get() def purgeOldBosses( minDate: Date, levelThreshold: Option[Int] ): Future[Map[BossName, RaidBoss]] = { agent.alter(_.filter { case (name, boss) => boss.lastSeen.after(minDate) || levelThreshold.exists(boss.level >= _) }) } }