From 178ca788b9a86c5a90df94df471e3c6696150386 Mon Sep 17 00:00:00 2001 From: HollandDM Date: Wed, 13 Mar 2024 11:09:26 +0700 Subject: [PATCH] fix: use opaque type --- .../split/MatchSplitObservable.scala | 35 +++++++++++++++++++ .../split/SplittableTypeMacros.scala | 35 ------------------- 2 files changed, 35 insertions(+), 35 deletions(-) create mode 100644 src/main/scala-3/com/raquo/airstream/split/MatchSplitObservable.scala diff --git a/src/main/scala-3/com/raquo/airstream/split/MatchSplitObservable.scala b/src/main/scala-3/com/raquo/airstream/split/MatchSplitObservable.scala new file mode 100644 index 0000000..9f66b3c --- /dev/null +++ b/src/main/scala-3/com/raquo/airstream/split/MatchSplitObservable.scala @@ -0,0 +1,35 @@ +package com.raquo.airstream.split + +import com.raquo.airstream.core.{Observable, BaseObservable} +import scala.annotation.compileTimeOnly + +/** + * `MatchSplitObservable` served as macro's data holder for macro expansion. + * + * For example: + * + * ```scala + * fooSignal.splitMatch + * .handleCase { case Bar(Some(str)) => str } { (str, strSignal) => renderStrNode(str, strSignal) } + * .handleCase { case baz: Baz => baz } { (baz, bazSignal) => renderBazNode(baz, bazSignal) } + * ``` + * + * will be expanded sematically into: + * + * ```scala + * MatchSplitObservable.build(fooSignal, ({ case baz: Baz => baz }) :: ({ case Bar(Some(str)) => str }) :: Nil, handlerMap) + * ``` + */ + +opaque type MatchSplitObservable[Self[+_] <: Observable[_] , I, O] = Unit + +object MatchSplitObservable { + + @compileTimeOnly("splitMatch without toSignal/toStream is illegal") + def build[Self[+_] <: Observable[_] , I, O]( + observable: BaseObservable[Self, I], + caseList: List[PartialFunction[Any, Any]], + handlerMap: Map[Int, Function[Any, O]] + ): MatchSplitObservable[Self, I, O] = throw new UnsupportedOperationException("splitMatch without toSignal/toStream is illegal") + +} diff --git a/src/main/scala-3/com/raquo/airstream/split/SplittableTypeMacros.scala b/src/main/scala-3/com/raquo/airstream/split/SplittableTypeMacros.scala index 3eeb591..d38eaf3 100644 --- a/src/main/scala-3/com/raquo/airstream/split/SplittableTypeMacros.scala +++ b/src/main/scala-3/com/raquo/airstream/split/SplittableTypeMacros.scala @@ -2,7 +2,6 @@ package com.raquo.airstream.split import com.raquo.airstream.core.{EventStream, Signal, Observable, BaseObservable} import scala.quoted.{Expr, Quotes, Type} -import scala.annotation.compileTimeOnly /** * `SplittableTypeMacros` turns this code @@ -43,40 +42,6 @@ import scala.annotation.compileTimeOnly */ object SplittableTypeMacros { - /** - * `MatchSplitObservable` served as macro's data holder for macro expansion. - * - * Like any class runtime builder, which uses methods to add various data and a dedicated method to build an instance of the class, `MatchSplitObservable` uses `handleCase`s to keep all code data and `toSignal`/`toStream` to expands macro into to match case definition. - * - * For example: - * - * ```scala - * fooSignal.splitMatch - * .handleCase { case Bar(Some(str)) => str } { (str, strSignal) => renderStrNode(str, strSignal) } - * .handleCase { case baz: Baz => baz } { (baz, bazSignal) => renderBazNode(baz, bazSignal) } - * ``` - * - * will be expanded sematically into: - * - * ```scala - * MatchSplitObservable.build(fooSignal, ({ case baz: Baz => baz }) :: ({ case Bar(Some(str)) => str }) :: Nil, handlerMap) - * ``` - * - * This is important, because `({ case baz: Baz => baz }) :: ({ case Bar(Some(str)) => str }) :: Nil` saves all the infomation needed for the macro to expands into match case definition - */ - final class MatchSplitObservable[Self[+_] <: Observable[_] , I, O] { - throw new UnsupportedOperationException("splitMatch without toSignal/toStream is illegal") - } - - object MatchSplitObservable { - @compileTimeOnly("splitMatch without toSignal/toStream is illegal") - def build[Self[+_] <: Observable[_] , I, O]( - observable: BaseObservable[Self, I], - caseList: List[PartialFunction[Any, Any]], - handlerMap: Map[Int, Function[Any, O]] - ): MatchSplitObservable[Self, I, O] = throw new UnsupportedOperationException("splitMatch without toSignal/toStream is illegal") - } - extension [Self[+_] <: Observable[_], I](inline observable: BaseObservable[Self, I]) { inline def splitMatch: MatchSplitObservable[Self, I, Nothing] = MatchSplitObservable.build(observable, Nil, Map.empty[Int, Function[Any, Nothing]]) }