diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/SelectedRoomsAndTopLayer.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/RoomsAndTopLayer.kt similarity index 51% rename from core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/SelectedRoomsAndTopLayer.kt rename to core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/RoomsAndTopLayer.kt index 306d40b..9cda677 100644 --- a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/SelectedRoomsAndTopLayer.kt +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/RoomsAndTopLayer.kt @@ -1,5 +1,5 @@ @file:OptIn(RDKTInternalAPI::class) -@file:JvmName("SelectedRoomUtil") +@file:JvmName("RoomsAndTopLayerUtil") package cn.rdlevel.rdkt.core.data @@ -19,8 +19,8 @@ import kotlin.reflect.KClass * All implementations of this interface must contain at least one room, or the top layer. * Failing to do so will result in an exception. */ -@Serializable(SelectedRoomsAndTopLayer.Serializer::class) -public sealed interface SelectedRoomsAndTopLayer { +@Serializable(RoomsAndTopLayer.Serializer::class) +public sealed interface RoomsAndTopLayer { /** * The room IDs that are selected. */ @@ -42,11 +42,11 @@ public sealed interface SelectedRoomsAndTopLayer { return TOP_LAYER in rooms } - public operator fun plus(other: SelectedRoomsAndTopLayer): SelectedRoomsAndTopLayer { + public operator fun plus(other: RoomsAndTopLayer): RoomsAndTopLayer { return of(rooms + other.rooms) } - private class Impl(override val rooms: Set) : AbstractSelectedRoomsAndTopLayer(), SelectedRoomsAndTopLayer { + private class Impl(override val rooms: Set) : AbstractRoomsAndTopLayer(), RoomsAndTopLayer { init { requireNotEmpty() requireAllRoomsOrTopLayer() @@ -55,68 +55,68 @@ public sealed interface SelectedRoomsAndTopLayer { public companion object { /** - * Creates a new instance of [SelectedRoomsAndTopLayer]. + * Creates a new instance of [RoomsAndTopLayer]. * * @param rooms The set of selected room IDs. - * @return A new instance of [SelectedRoomsAndTopLayer] with the specified room IDs. + * @return A new instance of [RoomsAndTopLayer] with the specified room IDs. */ @JvmStatic - public fun of(rooms: Set): SelectedRoomsAndTopLayer { + public fun of(rooms: Set): RoomsAndTopLayer { return Impl(rooms) } /** - * Creates a new instance of [SelectedRoomsAndTopLayer] with the specified room IDs. + * Creates a new instance of [RoomsAndTopLayer] with the specified room IDs. * * @param room The ID of the first selected room. * @param rooms Additional room IDs to include in the selection. - * @return A new instance of [SelectedRoomsAndTopLayer] containing the specified room IDs. + * @return A new instance of [RoomsAndTopLayer] containing the specified room IDs. */ @JvmStatic - public fun of(room: Int, vararg rooms: Int): SelectedRoomsAndTopLayer { + public fun of(room: Int, vararg rooms: Int): RoomsAndTopLayer { return of(setOf(room) + rooms.toSet()) } } public object Serializer : - TransformSerializer>( + TransformSerializer>( "SelectedRoomsAndTopLayer", kotlinx.serialization.serializer() ) { - override fun toData(value: SelectedRoomsAndTopLayer): Set { + override fun toData(value: RoomsAndTopLayer): Set { return value.rooms } - override fun fromData(data: Set): SelectedRoomsAndTopLayer { + override fun fromData(data: Set): RoomsAndTopLayer { return of(data) } } } -public operator fun SelectedRoomsAndTopLayer.contains(id: Int): Boolean { +public operator fun RoomsAndTopLayer.contains(id: Int): Boolean { return containsRoom(id) } -private fun SelectedRoomsAndTopLayer.requireNotEmpty() { +private fun RoomsAndTopLayer.requireNotEmpty() { require(rooms.isNotEmpty()) { "Selected rooms must not be empty." } } -private fun SelectedRoomsAndTopLayer.requireAllRoomsOrTopLayer() { +private fun RoomsAndTopLayer.requireAllRoomsOrTopLayer() { require(rooms.all { it in ROOM1..TOP_LAYER }) { "Selected rooms must only contain room IDs from 0 to 3 or the top layer." } } -private fun SelectedRoomsAndTopLayer.requireAllRooms() { +private fun RoomsAndTopLayer.requireAllRooms() { require(rooms.all { it in ROOM1..ROOM4 }) { "Selected rooms must only contain room IDs from 0 to 3." } } -private sealed class AbstractSelectedRoomsAndTopLayer : SelectedRoomsAndTopLayer { +private sealed class AbstractRoomsAndTopLayer : RoomsAndTopLayer { override operator fun equals(other: Any?): Boolean { if (this === other) return true - if (other !is SelectedRoomsAndTopLayer) return false + if (other !is RoomsAndTopLayer) return false return rooms == other.rooms } @@ -132,18 +132,18 @@ private sealed class AbstractSelectedRoomsAndTopLayer : SelectedRoomsAndTopLayer /** * Represents a collection of either normal rooms or the top layer. */ -@Serializable(SelectedRoomsOrTopLayer.Serializer::class) -public sealed interface SelectedRoomsOrTopLayer : SelectedRoomsAndTopLayer { +@Serializable(RoomsOrTopLayer.Serializer::class) +public sealed interface RoomsOrTopLayer : RoomsAndTopLayer { public object Serializer : - TransformSerializer>( + TransformSerializer>( "SelectedRoomsOrTopLayer", SetSerializer(Int.serializer()) ) { - override fun toData(value: SelectedRoomsOrTopLayer): Set { + override fun toData(value: RoomsOrTopLayer): Set { return value.rooms } - override fun fromData(data: Set): SelectedRoomsOrTopLayer { + override fun fromData(data: Set): RoomsOrTopLayer { return roomsOf(data) } } @@ -152,8 +152,8 @@ public sealed interface SelectedRoomsOrTopLayer : SelectedRoomsAndTopLayer { /** * Represents a collection of either a normal room or the top layer. */ -@Serializable(SingleSelectedRoomOrTopLayer.Serializer::class) -public sealed interface SingleSelectedRoomOrTopLayer : SelectedRoomsOrTopLayer { +@Serializable(SingleRoomOrTopLayer.Serializer::class) +public sealed interface SingleRoomOrTopLayer : RoomsOrTopLayer { /** * The single selected room ID. */ @@ -171,15 +171,15 @@ public sealed interface SingleSelectedRoomOrTopLayer : SelectedRoomsOrTopLayer { } public object Serializer : - TransformSerializer>( + TransformSerializer>( "SingleSelectedRoomOrTopLayer", SetSerializer(Int.serializer()) ) { - override fun toData(value: SingleSelectedRoomOrTopLayer): Set { + override fun toData(value: SingleRoomOrTopLayer): Set { return value.rooms } - override fun fromData(data: Set): SingleSelectedRoomOrTopLayer { + override fun fromData(data: Set): SingleRoomOrTopLayer { return roomsOf(data) } } @@ -188,13 +188,13 @@ public sealed interface SingleSelectedRoomOrTopLayer : SelectedRoomsOrTopLayer { /** * Represents a collection of selected rooms, not including the top layer. */ -@Serializable(SelectedRooms.Serializer::class) -public sealed interface SelectedRooms : SelectedRoomsOrTopLayer { - public operator fun plus(other: SelectedRooms): SelectedRooms { +@Serializable(Rooms.Serializer::class) +public sealed interface Rooms : RoomsOrTopLayer { + public operator fun plus(other: Rooms): Rooms { return of(rooms + other.rooms) } - private class Impl(override val rooms: Set) : AbstractSelectedRoomsAndTopLayer(), SelectedRooms { + private class Impl(override val rooms: Set) : AbstractRoomsAndTopLayer(), Rooms { init { requireNotEmpty() requireAllRooms() @@ -203,36 +203,36 @@ public sealed interface SelectedRooms : SelectedRoomsOrTopLayer { public companion object { /** - * Creates a new instance of [SelectedRooms]. + * Creates a new instance of [Rooms]. * * @param rooms The set of selected room IDs. - * @return A new instance of [SelectedRooms] with the specified room IDs. + * @return A new instance of [Rooms] with the specified room IDs. */ @JvmStatic - public fun of(rooms: Set): SelectedRooms { + public fun of(rooms: Set): Rooms { return Impl(rooms) } /** - * Creates a new instance of [SelectedRooms] with the specified room IDs. + * Creates a new instance of [Rooms] with the specified room IDs. * * @param room The ID of the first selected room. * @param rooms Additional room IDs to include in the selection. - * @return A new instance of [SelectedRooms] containing the specified room IDs. + * @return A new instance of [Rooms] containing the specified room IDs. */ @JvmStatic - public fun of(room: Int, vararg rooms: Int): SelectedRooms { + public fun of(room: Int, vararg rooms: Int): Rooms { return of(setOf(room) + rooms.toSet()) } } public object Serializer : - TransformSerializer>("SelectedRooms", SetSerializer(Int.serializer())) { - override fun toData(value: SelectedRooms): Set { + TransformSerializer>("SelectedRooms", SetSerializer(Int.serializer())) { + override fun toData(value: Rooms): Set { return value.rooms } - override fun fromData(data: Set): SelectedRooms { + override fun fromData(data: Set): Rooms { return of(data) } } @@ -241,32 +241,32 @@ public sealed interface SelectedRooms : SelectedRoomsOrTopLayer { /** * Represents the selected top layer. */ -@Serializable(SelectedTopLayer.Serializer::class) -public sealed interface SelectedTopLayer : SingleSelectedRoomOrTopLayer { +@Serializable(TopLayer.Serializer::class) +public sealed interface TopLayer : SingleRoomOrTopLayer { override val room: Int get() = TOP_LAYER - private object Impl : AbstractSelectedRoomsAndTopLayer(), SelectedTopLayer + private object Impl : AbstractRoomsAndTopLayer(), TopLayer public companion object { /** - * Gets the instance of [SelectedTopLayer]. + * Gets the instance of [TopLayer]. * - * @return The instance of [SelectedTopLayer]. + * @return The instance of [TopLayer]. */ @JvmStatic - public fun of(): SelectedTopLayer { + public fun of(): TopLayer { return Impl } } public object Serializer : - TransformSerializer>("SelectedTopLayer", SetSerializer(Int.serializer())) { - override fun toData(value: SelectedTopLayer): Set { + TransformSerializer>("SelectedTopLayer", SetSerializer(Int.serializer())) { + override fun toData(value: TopLayer): Set { return value.rooms } - override fun fromData(data: Set): SelectedTopLayer { + override fun fromData(data: Set): TopLayer { require(TOP_LAYER in data && data.size == 1) { "SelectedTopLayer must be created with the top layer ID." } return of() } @@ -276,9 +276,9 @@ public sealed interface SelectedTopLayer : SingleSelectedRoomOrTopLayer { /** * Represents a single selected room, not including the top layer. */ -@Serializable(SingleSelectedRoom.Serializer::class) -public sealed interface SingleSelectedRoom : SingleSelectedRoomOrTopLayer, SelectedRooms { - private class Impl(override val room: Int) : AbstractSelectedRoomsAndTopLayer(), SingleSelectedRoom { +@Serializable(SingleRoom.Serializer::class) +public sealed interface SingleRoom : SingleRoomOrTopLayer, Rooms { + private class Impl(override val room: Int) : AbstractRoomsAndTopLayer(), SingleRoom { init { requireAllRooms() } @@ -286,24 +286,24 @@ public sealed interface SingleSelectedRoom : SingleSelectedRoomOrTopLayer, Selec public companion object { /** - * Creates a new instance of [SingleSelectedRoom]. + * Creates a new instance of [SingleRoom]. * * @param room The ID of the selected room. - * @return A new instance of [SingleSelectedRoom] with the specified room ID. + * @return A new instance of [SingleRoom] with the specified room ID. */ @JvmStatic - public fun of(room: Int): SingleSelectedRoom { + public fun of(room: Int): SingleRoom { return Impl(room) } } public object Serializer : - TransformSerializer>("SingleSelectedRoom", SetSerializer(Int.serializer())) { - override fun toData(value: SingleSelectedRoom): Set { + TransformSerializer>("SingleSelectedRoom", SetSerializer(Int.serializer())) { + override fun toData(value: SingleRoom): Set { return value.rooms } - override fun fromData(data: Set): SingleSelectedRoom { + override fun fromData(data: Set): SingleRoom { require(data.size == 1) { "SingleSelectedRoom must contain exactly one room." } return of(data.first()) } @@ -336,44 +336,44 @@ public const val ROOM4: Int = 3 public const val TOP_LAYER: Int = 4 /** - * Creates an instance of [SelectedRoomsAndTopLayer] based on the provided [KClass] and set of room IDs. + * Creates an instance of [RoomsAndTopLayer] based on the provided [KClass] and set of room IDs. * - * @param T The type of [SelectedRoomsAndTopLayer] to create. + * @param T The type of [RoomsAndTopLayer] to create. * @param kClass The [KClass] of the type to create. * @param rooms The set of room IDs to include in the selection. - * @return An instance of [SelectedRoomsAndTopLayer] of the specified type. + * @return An instance of [RoomsAndTopLayer] of the specified type. */ @JvmSynthetic @RDKTInternalAPI -public fun roomsOf(kClass: KClass, rooms: Set): T { +public fun roomsOf(kClass: KClass, rooms: Set): T { @Suppress("UNCHECKED_CAST") return when (kClass) { - SelectedRoomsAndTopLayer::class -> SelectedRoomsAndTopLayer.of(rooms) - SelectedRoomsOrTopLayer::class -> { + RoomsAndTopLayer::class -> RoomsAndTopLayer.of(rooms) + RoomsOrTopLayer::class -> { when { TOP_LAYER in rooms && rooms.size > 1 -> error("Cannot have both top layer and other rooms selected.") - TOP_LAYER in rooms -> SelectedTopLayer.of() - else -> SelectedRooms.of(rooms) + TOP_LAYER in rooms -> TopLayer.of() + else -> Rooms.of(rooms) } } - SingleSelectedRoomOrTopLayer::class -> { + SingleRoomOrTopLayer::class -> { require(rooms.size == 1) { "SingleSelectedRoomOrTopLayer must contain exactly one room or the top layer." } when { - TOP_LAYER in rooms -> SelectedTopLayer.of() - else -> SingleSelectedRoom.of(rooms.first()) + TOP_LAYER in rooms -> TopLayer.of() + else -> SingleRoom.of(rooms.first()) } } - SelectedRooms::class -> SelectedRooms.of(rooms) - SelectedTopLayer::class -> { + Rooms::class -> Rooms.of(rooms) + TopLayer::class -> { require(rooms.size == 1 && TOP_LAYER in rooms) { "SelectedTopLayer must contain only the top layer." } - SelectedTopLayer.of() + TopLayer.of() } - SingleSelectedRoom::class -> { + SingleRoom::class -> { require(rooms.size == 1) { "SingleSelectedRoom must contain exactly one room." } - SingleSelectedRoom.of(rooms.first()) + SingleRoom.of(rooms.first()) } else -> error("Unsupported type: ${kClass.simpleName}") @@ -381,67 +381,67 @@ public fun roomsOf(kClass: KClass, rooms: Set< } /** - * Creates an instance of [SelectedRoomsAndTopLayer] based on the provided [KClass] and a single room ID. + * Creates an instance of [RoomsAndTopLayer] based on the provided [KClass] and a single room ID. * - * @param T The type of [SelectedRoomsAndTopLayer] to create. + * @param T The type of [RoomsAndTopLayer] to create. * @param kClass The [KClass] of the type to create. * @param room The ID of the room to include in the selection. * @param rooms Additional room IDs to include in the selection. - * @return An instance of [SelectedRoomsAndTopLayer] of the specified type. + * @return An instance of [RoomsAndTopLayer] of the specified type. */ @JvmSynthetic @RDKTInternalAPI -public fun roomsOf(kClass: KClass, room: Int, vararg rooms: Int): T { +public fun roomsOf(kClass: KClass, room: Int, vararg rooms: Int): T { return roomsOf(kClass, setOf(room) + rooms.toSet()) } /** - * Creates an instance of [SingleSelectedRoomOrTopLayer] based on the provided [KClass] and a single room ID. + * Creates an instance of [SingleRoomOrTopLayer] based on the provided [KClass] and a single room ID. * - * @param T The type of [SingleSelectedRoomOrTopLayer] to create. + * @param T The type of [SingleRoomOrTopLayer] to create. * @param kClass The [KClass] of the type to create. * @param room The ID of the room to include in the selection. - * @return An instance of [SingleSelectedRoomOrTopLayer] of the specified type. + * @return An instance of [SingleRoomOrTopLayer] of the specified type. */ @JvmSynthetic @RDKTInternalAPI -public fun singleRoomOf(kClass: KClass, room: Int): T { +public fun singleRoomOf(kClass: KClass, room: Int): T { return roomsOf(kClass, room) } /** - * Creates an instance of [SelectedRoomsAndTopLayer] based on the provided set of room IDs. + * Creates an instance of [RoomsAndTopLayer] based on the provided set of room IDs. * - * @param T The type of [SelectedRoomsAndTopLayer] to create. + * @param T The type of [RoomsAndTopLayer] to create. * @param rooms The set of room IDs to include in the selection. - * @return An instance of [SelectedRoomsAndTopLayer] of the specified type. + * @return An instance of [RoomsAndTopLayer] of the specified type. */ @JvmName("of") -public inline fun roomsOf(rooms: Set): T { +public inline fun roomsOf(rooms: Set): T { return roomsOf(T::class, rooms) } /** - * Creates an instance of [SelectedRoomsAndTopLayer] based on the provided room ID and additional room IDs. + * Creates an instance of [RoomsAndTopLayer] based on the provided room ID and additional room IDs. * - * @param T The type of [SelectedRoomsAndTopLayer] to create. + * @param T The type of [RoomsAndTopLayer] to create. * @param room The ID of the first selected room. * @param rooms Additional room IDs to include in the selection. - * @return An instance of [SelectedRoomsAndTopLayer] of the specified type. + * @return An instance of [RoomsAndTopLayer] of the specified type. */ @JvmName("of") -public inline fun roomsOf(room: Int, vararg rooms: Int): T { +public inline fun roomsOf(room: Int, vararg rooms: Int): T { return roomsOf(T::class, room, *rooms) } /** - * Creates an instance of [SingleSelectedRoomOrTopLayer] based on the provided room ID. + * Creates an instance of [SingleRoomOrTopLayer] based on the provided room ID. * - * @param T The type of [SingleSelectedRoomOrTopLayer] to create. + * @param T The type of [SingleRoomOrTopLayer] to create. * @param room The ID of the selected room. - * @return An instance of [SingleSelectedRoomOrTopLayer] of the specified type. + * @return An instance of [SingleRoomOrTopLayer] of the specified type. */ @JvmName("ofSingle") -public inline fun singleRoomOf(room: Int): T { +public inline fun singleRoomOf(room: Int): T { return singleRoomOf(T::class, room) } \ No newline at end of file diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/EventProperties.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/EventProperties.kt index c6b8b03..5be580a 100644 --- a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/EventProperties.kt +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/EventProperties.kt @@ -68,68 +68,68 @@ public interface RoomsAndTopLayerSpecificEvent : Event { /** * The rooms or the top layer the event is specifying. */ - public val rooms: SelectedRoomsAndTopLayer + public val rooms: RoomsAndTopLayer } /** * The mutable version of [RoomsAndTopLayerSpecificEvent]. */ public interface MutableRoomsAndTopLayerSpecificEvent : RoomsAndTopLayerSpecificEvent { - override var rooms: SelectedRoomsAndTopLayer + override var rooms: RoomsAndTopLayer } /** * An [Event] that is specific to rooms or the top layer. */ public interface RoomsOrTopLayerSpecificEvent : RoomsAndTopLayerSpecificEvent { - override val rooms: SelectedRoomsOrTopLayer + override val rooms: RoomsOrTopLayer } /** * The mutable version of [RoomsOrTopLayerSpecificEvent]. */ public interface MutableRoomsOrTopLayerSpecificEvent : RoomsOrTopLayerSpecificEvent { - override var rooms: SelectedRoomsOrTopLayer + override var rooms: RoomsOrTopLayer } /** * An [Event] that is specific to a single room or the top layer. */ public interface SingleRoomOrTopLayerSpecificEvent : RoomsOrTopLayerSpecificEvent { - override val rooms: SingleSelectedRoomOrTopLayer + override val rooms: SingleRoomOrTopLayer } /** * The mutable version of [SingleRoomOrTopLayerSpecificEvent]. */ public interface MutableSingleRoomOrTopLayerSpecificEvent : SingleRoomOrTopLayerSpecificEvent { - override var rooms: SingleSelectedRoomOrTopLayer + override var rooms: SingleRoomOrTopLayer } /** * An [Event] that is specific to rooms. */ public interface RoomsSpecificEvent : RoomsOrTopLayerSpecificEvent { - override val rooms: SelectedRooms + override val rooms: Rooms } /** * The mutable version of [RoomsSpecificEvent]. */ public interface MutableRoomsSpecificEvent : RoomsSpecificEvent { - override var rooms: SelectedRooms + override var rooms: Rooms } /** * An [Event] that is specific to a single room. */ public interface SingleRoomSpecificEvent : SingleRoomOrTopLayerSpecificEvent, RoomsSpecificEvent { - override val rooms: SingleSelectedRoom + override val rooms: SingleRoom } /** * The mutable version of [SingleRoomSpecificEvent]. */ public interface MutableSingleRoomSpecificEvent : SingleRoomSpecificEvent { - override var rooms: SingleSelectedRoom + override var rooms: SingleRoom } \ No newline at end of file diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetThemeEvent.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetThemeEvent.kt index e7c784a..53825f9 100644 --- a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetThemeEvent.kt +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetThemeEvent.kt @@ -4,7 +4,7 @@ package cn.rdlevel.rdkt.core.events import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI import cn.rdlevel.rdkt.core.data.ROOM1 -import cn.rdlevel.rdkt.core.data.SelectedRooms +import cn.rdlevel.rdkt.core.data.Rooms import cn.rdlevel.rdkt.core.data.action.Theme import cn.rdlevel.rdkt.core.data.roomsOf import cn.rdlevel.rdkt.core.serialization.Flatten @@ -23,7 +23,7 @@ import kotlinx.serialization.* public data class SetThemeEvent( @Flatten var theme: Theme, - override var rooms: SelectedRooms = roomsOf(ROOM1), + override var rooms: Rooms = roomsOf(ROOM1), ) : ActionEvent(), MutableRoomsSpecificEvent { public object Serializer : KSerializer by generatedSerializer().flatten() } \ No newline at end of file