Skip to content

Commit 8fd01b1

Browse files
committed
cats-effect 3.2.0. CB/IO core bundle.
1 parent 4477eef commit 8fd01b1

File tree

6 files changed

+156
-1
lines changed

6 files changed

+156
-1
lines changed

build.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ val callbackExtCats = ScalaJsReact.callbackExtCats
99
val callbackExtCatsEffect = ScalaJsReact.callbackExtCatsEffect
1010
val coreBundleCallback = ScalaJsReact.coreBundleCallback
1111
val coreBundleCatsEffect = ScalaJsReact.coreBundleCatsEffect
12+
val coreBundleCBIO = ScalaJsReact.coreBundleCBIO
1213
val coreExtCats = ScalaJsReact.coreExtCats
1314
val coreExtCatsEffect = ScalaJsReact.coreExtCatsEffect
1415
val coreGeneric = ScalaJsReact.coreGeneric
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package japgolly.scalajs.react.internal
2+
3+
import japgolly.scalajs.react.callback._
4+
import japgolly.scalajs.react.{ReactEventTypes, Reusability, Reusable}
5+
import scala.annotation.nowarn
6+
7+
@nowarn("cat=unused")
8+
trait ReactCallbackExtensions {
9+
import ReactCallbackExtensions._
10+
11+
@inline final implicit def ReactCallbackExtensionCallbackOptionObj(self: CallbackOption.type): CallbackOptionObjExt.type =
12+
CallbackOptionObjExt
13+
14+
@inline final implicit def ReactCallbackExtensionCallbackOption[A](self: CallbackOption[A]): CallbackOptionExt[A] =
15+
new CallbackOptionExt(self.underlyingRepr)
16+
17+
@inline final implicit def ReactCallbackExtensionCallbackTo[A](self: CallbackTo[A]): CallbackToExt[A] =
18+
new CallbackToExt(self.underlyingRepr)
19+
20+
@inline final implicit def ReactCallbackExtensionReusable(self: Reusable.type): ReusableExt.type =
21+
ReusableExt
22+
23+
@inline final implicit def ReactCallbackExtensionReusability(self: Reusability.type): ReusabilityExt.type =
24+
ReusabilityExt
25+
}
26+
27+
object ReactCallbackExtensions {
28+
29+
object Events extends ReactEventTypes
30+
import Events._
31+
32+
object CallbackOptionObjExt {
33+
import CallbackOption._
34+
35+
@inline def keyCodeSwitch[A](e : ReactKeyboardEvent,
36+
altKey : Boolean = false,
37+
ctrlKey : Boolean = false,
38+
metaKey : Boolean = false,
39+
shiftKey: Boolean = false)
40+
(switch : PartialFunction[Int, CallbackTo[A]]): CallbackOption[A] =
41+
keyEventSwitch(e, e.keyCode, altKey, ctrlKey, metaKey, shiftKey)(switch)
42+
43+
def keyEventSwitch[A, B](e : ReactKeyboardEvent,
44+
a : A,
45+
altKey : Boolean = false,
46+
ctrlKey : Boolean = false,
47+
metaKey : Boolean = false,
48+
shiftKey: Boolean = false)
49+
(switch : PartialFunction[A, CallbackTo[B]]): CallbackOption[B] =
50+
option {
51+
EffectUtil.unsafeKeyEventSwitch(e, a, altKey = altKey, ctrlKey = ctrlKey, metaKey = metaKey, shiftKey = shiftKey)(switch)
52+
.map(_.runNow())
53+
}
54+
}
55+
56+
final class CallbackOptionExt[A](private val _self: CallbackOption.UnderlyingRepr[A]) extends AnyVal {
57+
@inline private def self: CallbackOption[A] =
58+
new CallbackOption(_self)
59+
60+
/** Wraps this so that:
61+
*
62+
* 1) It only executes if `e.defaultPrevented` is `false`.
63+
* 2) It sets `e.preventDefault` on successful completion.
64+
*/
65+
def asEventDefault(e: ReactEvent): CallbackOption[A] =
66+
(self <* e.preventDefaultCB.toCBO).unless(e.defaultPrevented)
67+
}
68+
69+
final class CallbackToExt[A](private val _self: Trampoline[A]) extends AnyVal {
70+
@inline private def self: CallbackTo[A] =
71+
new CallbackTo(_self)
72+
73+
/** Wraps this so that:
74+
*
75+
* 1) It only executes if `e.defaultPrevented` is `false`.
76+
* 2) It sets `e.preventDefault` on successful completion.
77+
*/
78+
def asEventDefault(e: ReactEvent): CallbackTo[Option[A]] =
79+
(self <* e.preventDefaultCB).unless(e.defaultPrevented)
80+
}
81+
82+
object ReusableExt {
83+
import Reusable._
84+
85+
def callbackByRef[A](c: CallbackTo[A]): Reusable[CallbackTo[A]] =
86+
byRefIso(c)(_.underlyingRepr)
87+
88+
def callbackOptionByRef[A](c: CallbackOption[A]): Reusable[CallbackOption[A]] =
89+
byRefIso(c)(_.underlyingRepr)
90+
91+
lazy val emptyCallback: Reusable[Callback] =
92+
callbackByRef(Callback.empty)
93+
}
94+
95+
object ReusabilityExt {
96+
import Reusability._
97+
98+
def callbackByRef[A]: Reusability[CallbackTo[A]] =
99+
by((_: CallbackTo[A]).underlyingRepr)(byRef)
100+
101+
def callbackOptionByRef[A]: Reusability[CallbackOption[A]] =
102+
by((_: CallbackOption[A]).underlyingRepr)(byRef)
103+
104+
implicit lazy val callbackSetIntervalResult: Reusability[Callback.SetIntervalResult] =
105+
byRef || by(_.handle)
106+
107+
implicit lazy val callbackSetTimeoutResult: Reusability[Callback.SetTimeoutResult] =
108+
byRef || by(_.handle)
109+
}
110+
111+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package japgolly.scalajs
2+
3+
import japgolly.scalajs.react.util.DefaultEffects._
4+
5+
package object react
6+
extends japgolly.scalajs.react.internal.CoreGeneralF[Sync]
7+
with japgolly.scalajs.react.internal.ReactCallbackExtensions
8+
with japgolly.scalajs.react.ReactCats
9+
with japgolly.scalajs.react.callback.Exports
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package japgolly.scalajs.react.util
2+
3+
import cats.effect._
4+
import japgolly.scalajs.react.callback._
5+
6+
// DefaultEffects
7+
8+
sealed trait DefaultEffectsLowPri extends DefaultEffectsApiLowPri {
9+
override final type Async[A] = IO[A]
10+
11+
@inline override final implicit lazy val Async: EffectCatsEffect.io.type = EffectCatsEffect.io
12+
}
13+
14+
object DefaultEffects extends DefaultEffectsLowPri with DefaultEffectsApi {
15+
override type Sync[A] = CallbackTo[A]
16+
@inline override implicit val Sync: EffectCallback.callback.type = EffectCallback.callback
17+
}
18+
19+
// Effect highest-priority
20+
21+
abstract class EffectFallbacks extends EffectFallbacks1 {
22+
override implicit def callback : Effect.Sync [CallbackTo] = EffectCallback.callback
23+
override implicit def io : Effect.Async[IO ] = EffectCatsEffect.io
24+
}

coreExtCatsEffect/src/main/scala/japgolly/scalajs/react/util/EffectCatsEffect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ object EffectCatsEffect {
3939

4040
// ===================================================================================================================
4141

42-
implicit object io extends AsyncIO(ReactCatsEffect.runtimeFn)
42+
implicit lazy val io = new AsyncIO(ReactCatsEffect.runtimeFn)
4343

4444
class AsyncIO(runtime: () => IORuntime) extends Async.WithDefaults[IO] {
4545

project/Build.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ object ScalaJsReact {
2323
callbackExtCatsEffect,
2424
coreBundleCallback,
2525
coreBundleCatsEffect,
26+
coreBundleCBIO,
2627
coreExtCats,
2728
coreExtCatsEffect,
2829
coreGeneric,
@@ -108,6 +109,15 @@ object ScalaJsReact {
108109
moduleName := "core-bundle-cats_effect",
109110
)
110111

112+
lazy val coreBundleCBIO = project
113+
.dependsOn(callback) // High priority
114+
.dependsOn(coreExtCatsEffect) // High priority
115+
.dependsOn(utilFallbacks) // Low priority
116+
.configure(commonSettings, publicationSettings, definesMacros, hasNoTests, disableScalaDoc3)
117+
.settings(
118+
moduleName := "core-bundle-cb_io",
119+
)
120+
111121
lazy val coreExtCats = project
112122
.dependsOn(coreGeneric)
113123
.configure(commonSettings, publicationSettings, hasNoTests, effectGenericModule)

0 commit comments

Comments
 (0)