mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-09-21 08:19:24 +00:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
422b2e6db1 | |||
1973e0b5bf | |||
8258cf93a9 | |||
1d49bd5947 | |||
44317d1519 | |||
48e08fcc69 | |||
1a3ce6e623 | |||
fb122f3e70 | |||
7cca6039cc | |||
118e3dba39 | |||
87070710fa | |||
38499c3d4a | |||
5d754d968b | |||
d543d436bc | |||
12b54f99af | |||
2a95d7e643 | |||
e3d3cacfa4 |
27
CHANGELOG.md
27
CHANGELOG.md
@@ -1,5 +1,32 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.12.12
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* `Compose`:
|
||||||
|
* `JS`:
|
||||||
|
* Add `SkeletonAnimation` stylesheet
|
||||||
|
|
||||||
|
## 0.12.11
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Cache`:
|
||||||
|
* Override `KeyValue` cache method `values`
|
||||||
|
|
||||||
|
## 0.12.10
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Cache`:
|
||||||
|
* Hotfix in key values `get`
|
||||||
|
|
||||||
|
## 0.12.9
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Klock`: `3.0.0` -> `3.1.0`
|
||||||
|
* `Repos`:
|
||||||
|
* `Cache`:
|
||||||
|
* Fixes in key values cache
|
||||||
|
|
||||||
## 0.12.8
|
## 0.12.8
|
||||||
|
|
||||||
* `Versions`:
|
* `Versions`:
|
||||||
|
@@ -0,0 +1,43 @@
|
|||||||
|
package dev.inmo.micro_utils.common.compose
|
||||||
|
|
||||||
|
import org.jetbrains.compose.web.css.*
|
||||||
|
|
||||||
|
object SkeletonAnimation : StyleSheet() {
|
||||||
|
val skeletonKeyFrames: CSSNamedKeyframes by keyframes {
|
||||||
|
to { backgroundPosition("-20% 0") }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun CSSBuilder.includeSkeletonStyle(
|
||||||
|
duration: CSSSizeValue<out CSSUnitTime> = 2.s,
|
||||||
|
timingFunction: AnimationTimingFunction = AnimationTimingFunction.EaseInOut,
|
||||||
|
iterationCount: Int? = null,
|
||||||
|
direction: AnimationDirection = AnimationDirection.Normal,
|
||||||
|
keyFrames: CSSNamedKeyframes = skeletonKeyFrames,
|
||||||
|
hideChildren: Boolean = true,
|
||||||
|
hideText: Boolean = hideChildren
|
||||||
|
) {
|
||||||
|
backgroundImage("linear-gradient(110deg, rgb(236, 236, 236) 40%, rgb(245, 245, 245) 50%, rgb(236, 236, 236) 65%)")
|
||||||
|
backgroundSize("200% 100%")
|
||||||
|
backgroundPosition("180% 0")
|
||||||
|
animation(keyFrames) {
|
||||||
|
duration(duration)
|
||||||
|
timingFunction(timingFunction)
|
||||||
|
iterationCount(iterationCount)
|
||||||
|
direction(direction)
|
||||||
|
}
|
||||||
|
if (hideText) {
|
||||||
|
property("color", "${Color.transparent} !important")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hideChildren) {
|
||||||
|
child(self, universal) style {
|
||||||
|
property("visibility", "hidden")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val skeleton by style {
|
||||||
|
includeSkeletonStyle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@@ -14,5 +14,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.12.8
|
version=0.12.12
|
||||||
android_code_version=147
|
android_code_version=151
|
||||||
|
@@ -8,7 +8,7 @@ jb-compose = "1.2.0-alpha01-dev774"
|
|||||||
jb-exposed = "0.39.2"
|
jb-exposed = "0.39.2"
|
||||||
jb-dokka = "1.7.10"
|
jb-dokka = "1.7.10"
|
||||||
|
|
||||||
klock = "3.0.0"
|
klock = "3.1.0"
|
||||||
uuid = "0.5.0"
|
uuid = "0.5.0"
|
||||||
|
|
||||||
ktor = "2.1.1"
|
ktor = "2.1.1"
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache
|
package dev.inmo.micro_utils.repos.cache
|
||||||
|
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -14,6 +13,16 @@ open class ReadKeyValueCacheRepo<Key,Value>(
|
|||||||
) : ReadKeyValueRepo<Key,Value> by parentRepo, CacheRepo {
|
) : ReadKeyValueRepo<Key,Value> by parentRepo, CacheRepo {
|
||||||
override suspend fun get(k: Key): Value? = kvCache.get(k) ?: parentRepo.get(k) ?.also { kvCache.set(k, it) }
|
override suspend fun get(k: Key): Value? = kvCache.get(k) ?: parentRepo.get(k) ?.also { kvCache.set(k, it) }
|
||||||
override suspend fun contains(key: Key): Boolean = kvCache.contains(key) || parentRepo.contains(key)
|
override suspend fun contains(key: Key): Boolean = kvCache.contains(key) || parentRepo.contains(key)
|
||||||
|
|
||||||
|
override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult<Value> {
|
||||||
|
return keys(pagination, reversed).let {
|
||||||
|
it.changeResultsUnchecked(
|
||||||
|
it.results.mapNotNull {
|
||||||
|
get(it)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <Key, Value> ReadKeyValueRepo<Key, Value>.cached(
|
fun <Key, Value> ReadKeyValueRepo<Key, Value>.cached(
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache
|
package dev.inmo.micro_utils.repos.cache
|
||||||
|
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.utils.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.paginate
|
|
||||||
import dev.inmo.micro_utils.pagination.utils.reverse
|
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -15,18 +13,22 @@ open class ReadKeyValuesCacheRepo<Key,Value>(
|
|||||||
protected open val kvCache: KVCache<Key, List<Value>>
|
protected open val kvCache: KVCache<Key, List<Value>>
|
||||||
) : ReadKeyValuesRepo<Key,Value> by parentRepo, CacheRepo {
|
) : ReadKeyValuesRepo<Key,Value> by parentRepo, CacheRepo {
|
||||||
override suspend fun get(k: Key, pagination: Pagination, reversed: Boolean): PaginationResult<Value> {
|
override suspend fun get(k: Key, pagination: Pagination, reversed: Boolean): PaginationResult<Value> {
|
||||||
return kvCache.get(k) ?.paginate(
|
return getAll(k, reversed).paginate(
|
||||||
pagination.let { if (reversed) it.reverse(count(k)) else it }
|
pagination
|
||||||
) ?.let {
|
)
|
||||||
if (reversed) it.copy(results = it.results.reversed()) else it
|
|
||||||
} ?: parentRepo.get(k, pagination, reversed)
|
|
||||||
}
|
}
|
||||||
override suspend fun getAll(k: Key, reversed: Boolean): List<Value> {
|
override suspend fun getAll(k: Key, reversed: Boolean): List<Value> {
|
||||||
return kvCache.get(k) ?.let {
|
return kvCache.get(k) ?.let {
|
||||||
if (reversed) it.reversed() else it
|
if (reversed) it.reversed() else it
|
||||||
} ?: parentRepo.getAll(k, reversed)
|
} ?: parentRepo.getAll(k, reversed).also {
|
||||||
|
kvCache.set(k, it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
override suspend fun contains(k: Key, v: Value): Boolean = kvCache.get(k) ?.contains(v) ?: parentRepo.contains(k, v)
|
override suspend fun contains(k: Key, v: Value): Boolean = kvCache.get(k) ?.contains(v) ?: (parentRepo.contains(k, v).also {
|
||||||
|
if (it) {
|
||||||
|
kvCache.unset(k) // clear as invalid
|
||||||
|
}
|
||||||
|
})
|
||||||
override suspend fun contains(k: Key): Boolean = kvCache.contains(k) || parentRepo.contains(k)
|
override suspend fun contains(k: Key): Boolean = kvCache.contains(k) || parentRepo.contains(k)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,9 +41,21 @@ open class KeyValuesCacheRepo<Key,Value>(
|
|||||||
kvCache: KVCache<Key, List<Value>>,
|
kvCache: KVCache<Key, List<Value>>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||||
) : ReadKeyValuesCacheRepo<Key,Value>(parentRepo, kvCache), KeyValuesRepo<Key,Value>, WriteKeyValuesRepo<Key,Value> by parentRepo, CacheRepo {
|
) : ReadKeyValuesCacheRepo<Key,Value>(parentRepo, kvCache), KeyValuesRepo<Key,Value>, WriteKeyValuesRepo<Key,Value> by parentRepo, CacheRepo {
|
||||||
protected val onNewJob = parentRepo.onNewValue.onEach { kvCache.set(it.first, kvCache.get(it.first) ?.plus(it.second) ?: listOf(it.second)) }.launchIn(scope)
|
protected val onNewJob = parentRepo.onNewValue.onEach { (k, v) ->
|
||||||
protected val onRemoveJob = parentRepo.onValueRemoved.onEach { kvCache.set(it.first, kvCache.get(it.first) ?.minus(it.second) ?: return@onEach) }.launchIn(scope)
|
kvCache.set(
|
||||||
protected val onDataClearedJob = parentRepo.onDataCleared.onEach { kvCache.unset(it) }.launchIn(scope)
|
k,
|
||||||
|
kvCache.get(k) ?.plus(v) ?: return@onEach
|
||||||
|
)
|
||||||
|
}.launchIn(scope)
|
||||||
|
protected val onRemoveJob = parentRepo.onValueRemoved.onEach { (k, v) ->
|
||||||
|
kvCache.set(
|
||||||
|
k,
|
||||||
|
kvCache.get(k) ?.minus(v) ?: return@onEach
|
||||||
|
)
|
||||||
|
}.launchIn(scope)
|
||||||
|
protected val onDataClearedJob = parentRepo.onDataCleared.onEach {
|
||||||
|
kvCache.unset(it)
|
||||||
|
}.launchIn(scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <Key, Value> KeyValuesRepo<Key, Value>.cached(
|
fun <Key, Value> KeyValuesRepo<Key, Value>.cached(
|
||||||
|
@@ -25,6 +25,9 @@ open class SimpleKVCache<K, V>(
|
|||||||
kvParent.unset(it)
|
kvParent.unset(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
do {
|
||||||
|
val removed = cacheQueue.remove(k)
|
||||||
|
} while (removed)
|
||||||
cacheQueue.addLast(k)
|
cacheQueue.addLast(k)
|
||||||
kvParent.set(k, v)
|
kvParent.set(k, v)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user