-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #542 from AVSystem/reactive-publisher-extensions
Reactive Publisher to Monix extensions for typed Mongo
- Loading branch information
Showing
3 changed files
with
39 additions
and
14 deletions.
There are no files selected for viewing
31 changes: 31 additions & 0 deletions
31
mongo/jvm/src/main/scala/com/avsystem/commons/mongo/reactive/ReactiveMongoExtensions.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.avsystem.commons | ||
package mongo.reactive | ||
|
||
import monix.eval.Task | ||
import monix.reactive.Observable | ||
import org.reactivestreams.Publisher | ||
|
||
trait ReactiveMongoExtensions { | ||
import ReactiveMongoExtensions._ | ||
|
||
implicit final def publisherOps[T](publisher: Publisher[T]): PublisherOps[T] = new PublisherOps(publisher) | ||
} | ||
object ReactiveMongoExtensions extends ReactiveMongoExtensions { | ||
/** | ||
* Extensions for converting [[Publisher]] to [[Task]]/[[Observable]] Monix types | ||
*/ | ||
final class PublisherOps[T](private val publisher: Publisher[T]) extends AnyVal { | ||
def asMonix: Observable[T] = Observable.fromReactivePublisher(publisher) | ||
|
||
// prefer using the family of methods below for observables which are intended to only return a single document, | ||
// mongo observable implementation sometimes logs an error on server-closed cursors | ||
private def singleObservable: Task[Option[T]] = Task.fromReactivePublisher(publisher) | ||
|
||
// handles both an empty Publisher and and a single null item | ||
def headOptionL: Task[Option[T]] = singleObservable.map(_.filterNot(_ == null)) | ||
def headOptL: Task[Opt[T]] = headOptionL.map(_.toOpt) | ||
// can return null if Mongo driver for some reason returns null, intentionally don't want to report failure | ||
def headL: Task[T] = singleObservable.map(_.get) | ||
def completedL: Task[Unit] = headOptionL.void | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters