Skip to content

Commit

Permalink
Add BsonWriter typeclass weakteam#12
Browse files Browse the repository at this point in the history
  • Loading branch information
Ssstlis committed Apr 20, 2020
1 parent bb4f800 commit b589afd
Show file tree
Hide file tree
Showing 11 changed files with 68 additions and 9 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ lazy val core = project
.settings(commonSettings: _*)
.settings(
libraryDependencies ++=
Seq(Dependencies.Libs.cats) ++
Seq(Dependencies.Libs.cats, Dependencies.Libs.simulacrum) ++
Dependencies.Plugins.plugins ++
Dependencies.TestLibraries.testLibraries.map(_ % Test)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.weakteam.mongo

trait AllInstances
5 changes: 5 additions & 0 deletions core/src/main/scala/io/github/weakteam/mongo/AllSyntax.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.github.weakteam.mongo

import io.github.weakteam.mongo.bson.BsonWriter

trait AllSyntax extends BsonWriter.ToBsonWriterOps
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.weakteam.bson
package io.github.weakteam.mongo.bson

import cats.Show

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.github.weakteam.bson
package io.github.weakteam.mongo.bson

import cats.Show
import cats.syntax.show._
Expand Down
19 changes: 19 additions & 0 deletions core/src/main/scala/io/github/weakteam/mongo/bson/BsonWriter.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.github.weakteam.mongo.bson

import cats.Contravariant
import simulacrum.typeclass

@typeclass
trait BsonWriter[-T] { self =>
def writeBson(arg: T): BsonValue
}

object BsonWriter {
def instance[A](f: A => BsonValue): BsonWriter[A] = f(_)

implicit val bsonWriterContravariantInstance: Contravariant[BsonWriter] = new Contravariant[BsonWriter] {
def contramap[A, B](fa: BsonWriter[A])(f: B => A): BsonWriter[B] = { arg =>
fa.writeBson(f(arg))
}
}
}
3 changes: 3 additions & 0 deletions core/src/main/scala/io/github/weakteam/mongo/implicits.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.weakteam.mongo

object implicits extends AllSyntax with AllInstances
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.github.weakteam.bson
package io.github.weakteam.mongo.bson

import org.scalatest.matchers.must.Matchers
import org.scalatest.wordspec.AnyWordSpec
import cats.syntax.show._
import io.github.weakteam.bson.BsonSubtype._
import BsonSubtype._

class BsonSubtypeSpec extends AnyWordSpec with Matchers {
"BsonSubtypeShow" should {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.github.weakteam.bson
package io.github.weakteam.mongo.bson

import org.scalatest.matchers.must.Matchers
import org.scalatest.wordspec.AnyWordSpec
import cats.syntax.show._
import io.github.weakteam.bson.BsonValue._
import BsonValue._

class BsonValueSpec extends AnyWordSpec with Matchers {
"BsonValueShow" should {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.weakteam.mongo.bson

import io.github.weakteam.mongo.bson.BsonValue.BsonInt
import org.scalatest.matchers.must.Matchers
import org.scalatest.wordspec.AnyWordSpec
import io.github.weakteam.mongo.implicits._
import cats.syntax.contravariant._

class BsonWriterSpec extends AnyWordSpec with Matchers {
"BsonWriter" should {
"return right value" in {
implicit val intBsonWriter: BsonWriter[Int] = BsonInt(_)

1.writeBson mustBe BsonInt(1)
}

"return right value with contramap" in {
implicit val intBsonWriter: BsonWriter[Int] = BsonInt(_)
implicit val anyBsonWriter: BsonWriter[Any] = intBsonWriter.contramap {
case i: Int => i
case _ => 0
}

1.writeBson mustBe BsonInt(1)
"".writeBson mustBe BsonInt(0)
1L.writeBson mustBe BsonInt(0)
}
}
}
4 changes: 2 additions & 2 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ object Dependencies {
}

object Libs {
val cats = "org.typelevel" %% "cats-core" % Versions.cats
val cats = "org.typelevel" %% "cats-core" % Versions.cats
val simulacrum = "org.typelevel" %% "simulacrum" % Versions.simulacrum
}

object TestLibraries {
Expand All @@ -31,7 +32,6 @@ object Dependencies {
object Plugins {

val macroParadise = "org.scalamacros" % "paradise" % Versions.macroParadise cross CrossVersion.patch
val simulacrum = "org.typelevel" %% "simulacrum" % Versions.simulacrum
val bm4Plugin = "com.olegpy" %% "better-monadic-for" % Versions.bm4
val kindProjectorPlugin = "org.typelevel" % "kind-projector" % Versions.kindProjector cross CrossVersion.patch
val silencerPlugin = "com.github.ghik" %% "silencer-plugin" % Versions.silencer cross CrossVersion.full
Expand Down

0 comments on commit b589afd

Please sign in to comment.