ミニマルなDataHolderのライブラリです.
一つのデータに含まれる複数個のデータを一対多の関係にラップして, Keyを用いることで柔軟かつ容易に操作させることを目標としています.
SourceContainer<S : Any>
は"複数個のデータを持つ一つのデータを含むもの"に対応します.Kase<C : SourceContainer<S>, S: Any>
はSourceContainer
を包含し,Key
以外からはソースとなるデータを隠します.Key<in C : SourceContainer<S>, S : Any, out V : Any>
はKase
に用いることで, 目的する操作(get
)を達成します.Key
を継承したWritableKey< .. >
を用いることで, 書き込み(set
)も可能になります.
data class Json(private var rawJson: String) {
operator fun get(key: String): Any? = TODO("implemented")
operator fun set(key: String, value: String): Unit = TODO("implemented")
}
private val A_KEY = SimpleKey<SourceContainer<Json>, Json, String> { container -> container.source["A"] as? A }
private val B_KEY = SimpleWritableKey<SourceContainer<Json>, Json, String>(
extractor = { container -> container.source["B"] as? B },
inserter = { container, value -> container.source["B"] = value }
)
fun main() {
val json: Json = TODO("initialized")
val container = SimpleSourceContainer(json)
val kase = SimpleKase(container)
val a = kase[A_KEY] ?: TODO("if not exists")
val b = kase.getOrPut(B_KEY) { TODO("new B") }
kase[B_KEY] = "NEW B!"
// ...
}
- Kotlin 1.3.11
- Gradle
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.blackbracken:Kase:<VERSION>'
}
- Maven
<!-- add JitPack repository -->
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<!-- add the dependency -->
<dependency>
<groupId>com.github.blackbracken</groupId>
<artifactId>Kase</artifactId>
<version>VERSION</version>
</dependency>