diff --git a/README.md b/README.md index bb59d4e2..bcf41272 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# πŸ‡Ί πŸ‡¦ HELP UKRAINE +# πŸ‡ΊπŸ‡¦ HELP UKRAINE I'm the creator of this project. My country, Ukraine, [is being invaded by the Russian Federation, right now](https://war.ukraine.ua). If you want to help my country to fight, consider donating to [charity supporting Ukrainian army](https://www.comebackalive.in.ua/). More options is described on [support ukraine](https://supportukrainenow.org/) site. @@ -10,7 +10,7 @@ My country, Ukraine, [is being invaded by the Russian Federation, right now](htt For scala 3.1.1+: - libraryDependencies += "com.github.rssh" %% "scala-gopher" % "3.0.2" + libraryDependencies += "com.github.rssh" %% "scala-gopher" % "4.0.2" For scala 3 and 3.1.0: diff --git a/build.sbt b/build.sbt index 2a81f49e..ce5add4a 100644 --- a/build.sbt +++ b/build.sbt @@ -1,9 +1,9 @@ //val dottyVersion = "3.0.0-RC2-bin-SNAPSHOT" -val dottyVersion = "3.2.0" +val dottyVersion = "3.3.5" //val dottyVersion = "3.1.3-RC1-bin-SNAPSHOT" //val dottyVersion = dottyLatestNightlyBuild.get -ThisBuild/version := "3.0.4" +ThisBuild/version := "4.0.7" ThisBuild/versionScheme := Some("semver-spec") val sharedSettings = Seq( @@ -11,8 +11,8 @@ val sharedSettings = Seq( scalaVersion := dottyVersion, name := "scala-gopher", //resolvers += "Local Ivy Repository" at "file://"+Path.userHome.absolutePath+"/.ivy2/local", - libraryDependencies += "com.github.rssh" %%% "dotty-cps-async" % "0.9.11", - libraryDependencies += "org.scalameta" %%% "munit" % "0.7.29" % Test, + libraryDependencies += "io.github.dotty-cps-async" %%% "dotty-cps-async" % "1.0.2", + libraryDependencies += "org.scalameta" %%% "munit" % "1.0.4" % Test, ) lazy val root = project @@ -34,7 +34,9 @@ lazy val gopher = crossProject(JSPlatform, JVMPlatform) .disablePlugins(SitePlugin) .disablePlugins(SitePreviewPlugin) .jvmSettings( - scalacOptions ++= Seq( "-unchecked", "-Ycheck:macros", "-uniqid", "-Xprint:types", "-explain" ), + //scalacOptions ++= Seq( "-unchecked", "-Xcheck-macros", "-Ycheck:macro", "-uniqid", "-Xprint:types", "-explain" ), + // Error in dotty + scalacOptions ++= Seq( "-unchecked", "-Xprint:types" ), fork := true, /* javaOptions ++= Seq( @@ -46,7 +48,7 @@ lazy val gopher = crossProject(JSPlatform, JVMPlatform) Compile / doc / scalacOptions := Seq("-groups", "-source-links:shared=github://rssh/scala-gopher/master#shared", "-source-links:jvm=github://rssh/scala-gopher/master#jvm"), - mimaPreviousArtifacts := Set( "com.github.rssh" %% "scala-gopher" % "3.0.2" ) + mimaPreviousArtifacts := Set( "com.github.rssh" %% "scala-gopher" % "4.0.5" ) ).jsSettings( libraryDependencies += ("org.scala-js" %%% "scalajs-java-logging" % "1.0.0").cross(CrossVersion.for3Use2_13), // TODO: switch to ModuleES ? diff --git a/project/build.properties b/project/build.properties index 22af2628..081fdbbc 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.1 +sbt.version=1.10.0 diff --git a/project/plugins.sbt b/project/plugins.sbt index 3fe53801..3c903831 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,8 @@ addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.2") addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.4.1") addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3") -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") +addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.3.2") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.3.2") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.19.0") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.5.7") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.0.1") diff --git a/shared/src/main/scala/gopher/ReadChannel.scala b/shared/src/main/scala/gopher/ReadChannel.scala index 5b124b7a..e02ae609 100644 --- a/shared/src/main/scala/gopher/ReadChannel.scala +++ b/shared/src/main/scala/gopher/ReadChannel.scala @@ -36,7 +36,7 @@ trait ReadChannel[F[_], A]: def addDoneReader(reader: Reader[Unit]): Unit - lazy val done: ReadChannel[F,Unit] = DoneReadChannel() + final lazy val done: ReadChannel[F,Unit] = DoneReadChannel() type done = Unit @@ -52,12 +52,13 @@ trait ReadChannel[F[_], A]: * Can be used only inside async block. * If stream is closed and no values to read left in the stream - throws StreamClosedException **/ - transparent inline def read[G[_]]()(using mc:CpsMonadContext[G]): A = await(aread())(using rAsyncMonad, mc) + transparent inline def read[G[_]]()(using mc:CpsMonadContext[G], fg:CpsMonadConversion[F,G]): A = + await(aread()) /** * Synonim for read. */ - transparent inline def ?(using mc:CpsMonadContext[F]) : A = await(aread())(using rAsyncMonad, mc) + transparent inline def ?(using mc:CpsMonadContext[F]) : A = await(aread()) /** * return F which contains sequence from first `n` elements. @@ -84,7 +85,7 @@ trait ReadChannel[F[_], A]: * should be called inside async block. **/ transparent inline def take(n: Int)(using CpsMonadContext[F]): IndexedSeq[A] = - await(atake(n))(using rAsyncMonad) + await(atake(n)) /** * read value and return future with @@ -107,7 +108,7 @@ trait ReadChannel[F[_], A]: * * should be called inside async block. **/ - transparent inline def optRead()(using CpsMonadContext[F]): Option[A] = await(aOptRead())(using rAsyncMonad) + transparent inline def optRead()(using CpsMonadContext[F]): Option[A] = await(aOptRead()) def foreach_async(f: A=>F[Unit]): F[Unit] = given CpsAsyncMonad[F] = asyncMonad @@ -131,7 +132,7 @@ trait ReadChannel[F[_], A]: * until end of stream is not reached **/ transparent inline def foreach(inline f: A=>Unit)(using CpsMonadContext[F]): Unit = - await(aforeach(f))(using rAsyncMonad) + await(aforeach(f)) def map[B](f: A=>B): ReadChannel[F,B] = @@ -171,7 +172,7 @@ trait ReadChannel[F[_], A]: } transparent inline def fold[S](inline s0:S)(inline f: (S,A) => S )(using mc:CpsMonadContext[F]): S = - await[F,S,F](afold(s0)(f))(using rAsyncMonad, mc) + await[F,S,F](afold(s0)(f)) def zip[B](x: ReadChannel[F,B]): ReadChannel[F,(A,B)] = given CpsSchedulingMonad[F] = asyncMonad diff --git a/shared/src/main/scala/gopher/SelectListeners.scala b/shared/src/main/scala/gopher/SelectListeners.scala index 14440418..c3de322b 100644 --- a/shared/src/main/scala/gopher/SelectListeners.scala +++ b/shared/src/main/scala/gopher/SelectListeners.scala @@ -16,7 +16,7 @@ trait SelectListeners[F[_],S, R]: def runAsync():F[R] - transparent inline def run()(using CpsMonadContext[F]): R = await(runAsync())(using asyncMonad) + transparent inline def run()(using CpsMonadContext[F]): R = await(runAsync()) diff --git a/shared/src/main/scala/gopher/SelectMacro.scala b/shared/src/main/scala/gopher/SelectMacro.scala index 6d53d3ad..fd93363c 100644 --- a/shared/src/main/scala/gopher/SelectMacro.scala +++ b/shared/src/main/scala/gopher/SelectMacro.scala @@ -56,7 +56,7 @@ object SelectMacro: )(using Quotes): Expr[R] = val g = selectListenerBuilder(constructor, caseDefs) // dotty bug if g.run - val r = '{ await($g.runAsync())(using ${api}.asyncMonad, $monadContext) } + val r = '{ await($g.runAsync())(using $monadContext, CpsMonadConversion.identityConversion[F]) } r.asExprOf[R] def buildSelectListenerRunAsync[F[_]:Type, S:Type, R:Type, L <: SelectListeners[F,S,R]:Type]( diff --git a/shared/src/main/scala/gopher/WriteChannel.scala b/shared/src/main/scala/gopher/WriteChannel.scala index 758455f8..a98c0960 100644 --- a/shared/src/main/scala/gopher/WriteChannel.scala +++ b/shared/src/main/scala/gopher/WriteChannel.scala @@ -23,13 +23,13 @@ trait WriteChannel[F[_], A]: // inline def apply(a:A): Unit = await(awrite(a))(using asyncMonad) // inline def unapply(a:A): Some[A] = ??? - transparent inline def write(inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a))(using asyncMonad) + transparent inline def write(inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a)) @targetName("write1") - transparent inline def <~ (inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a))(using asyncMonad) + transparent inline def <~ (inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a)) @targetName("write2") - transparent inline def ! (inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a))(using asyncMonad) + transparent inline def ! (inline a:A)(using CpsMonadContext[F]): Unit = await(awrite(a)) //def Write(x:A):WritePattern = new WritePattern(x) @@ -52,7 +52,7 @@ trait WriteChannel[F[_], A]: } transparent inline def writeAll(inline collection: IterableOnce[A])(using mc: CpsMonadContext[F]): Unit = - await(awriteAll(collection))(using asyncMonad, mc) + await(awriteAll(collection)) def withWriteExpiration(ttl: FiniteDuration, throwTimeouts: Boolean)(using gopherApi: Gopher[F]): WriteChannelWithExpiration[F,A] = diff --git a/shared/src/main/scala/gopher/monads/ReadChannelCpsMonad.scala b/shared/src/main/scala/gopher/monads/ReadChannelCpsMonad.scala index b936ae4f..24f17f01 100644 --- a/shared/src/main/scala/gopher/monads/ReadChannelCpsMonad.scala +++ b/shared/src/main/scala/gopher/monads/ReadChannelCpsMonad.scala @@ -7,7 +7,7 @@ import gopher.impl._ -given ReadChannelCpsMonad[F[_]](using Gopher[F]): CpsMonadInstanceContext[[A] =>> ReadChannel[F,A]] with +given ReadChannelCpsMonad[F[_]](using Gopher[F]): CpsPureMonadInstanceContext[[A] =>> ReadChannel[F,A]] with def pure[T](t:T): ReadChannel[F,T] =