Compare commits

...
1067 Commits
Author SHA1 Message Date
InsanusMokrassar 22d7ac3e22 FlowState 2023-11-29 23:54:27 +06:00
InsanusMokrassar 9b30c3a155 small matrix improvements 2023-11-29 20:33:06 +06:00
InsanusMokrassar 915bac64b1 small fixes in SpecialStateFlow 2023-11-29 20:26:23 +06:00
InsanusMokrassar 9d2b50e55d SpecialStateFlow 2023-11-29 17:13:21 +06:00
InsanusMokrassar bde100f63d start 0.20.16 2023-11-29 17:12:37 +06:00
InsanusMokrassar 05b035a13d Merge pull request #345 from InsanusMokrassar/0.20.15
0.20.15
2023-11-24 23:47:02 +06:00
InsanusMokrassar eefb56bed7 Update libs.versions.toml 2023-11-24 20:14:32 +06:00
InsanusMokrassar fcc0dc4189 update dependencies 2023-11-24 16:58:50 +06:00
InsanusMokrassar 47ff20317f start 0.20.15 2023-11-24 16:46:22 +06:00
InsanusMokrassar 1558b9103d Merge pull request #343 from InsanusMokrassar/0.20.14
0.20.14
2023-11-18 23:27:06 +06:00
InsanusMokrassar 7a78742162 update kslog 2023-11-18 18:11:07 +06:00
InsanusMokrassar c01e240f66 update dependencies 2023-11-18 15:40:12 +06:00
InsanusMokrassar fef4fcbac6 start 0.20.14 2023-11-18 15:37:19 +06:00
InsanusMokrassar 5ab18bce4b Merge pull request #335 from InsanusMokrassar/0.20.13
0.20.13
2023-11-11 16:37:11 +06:00
InsanusMokrassar 24aec7271a update dependencies and changelog 2023-11-11 16:30:59 +06:00
InsanusMokrassar 9b19a2cb95 Update libs.versions.toml 2023-11-10 04:29:38 +06:00
InsanusMokrassar efdd7b8a57 Update libs.versions.toml 2023-11-10 04:28:54 +06:00
InsanusMokrassar 6df4cc9c3b start 0.20.13 2023-11-06 21:12:28 +06:00
InsanusMokrassar b9d93db0f5 Merge pull request #334 from InsanusMokrassar/0.20.12
0.20.12
2023-11-02 19:16:56 +06:00
InsanusMokrassar d7ee45ca64 update github workflows 2023-11-02 19:01:00 +06:00
InsanusMokrassar d7c31b1b22 update and fix build 2023-11-02 19:00:35 +06:00
InsanusMokrassar 7d6794a358 start 0.20.12 2023-11-02 18:26:15 +06:00
InsanusMokrassar 473eb87346 Merge pull request #330 from InsanusMokrassar/0.20.11
0.20.11
2023-11-01 12:38:44 +06:00
InsanusMokrassar 8b18b07790 Update CHANGELOG.md 2023-11-01 12:37:30 +06:00
InsanusMokrassar ab3c80a5ec update dependencies 2023-10-31 17:53:56 +06:00
InsanusMokrassar 075b93ecd6 SmartRWLocker now will wait first unlock of write mutex for acquiring read 2023-10-26 12:28:24 +06:00
InsanusMokrassar f6d0f72e49 start 0.20.11 2023-10-26 12:28:04 +06:00
InsanusMokrassar fcda3af862 Merge pull request #329 from InsanusMokrassar/0.20.10
0.20.10
2023-10-26 10:51:45 +06:00
InsanusMokrassar d5c7a589b1 update dependencies 2023-10-26 10:48:36 +06:00
InsanusMokrassar 86e099ed25 start 0.20.10 2023-10-26 10:37:46 +06:00
InsanusMokrassar ebd7befe73 Merge pull request #324 from InsanusMokrassar/0.20.9
0.20.9
2023-10-24 16:25:05 +06:00
InsanusMokrassar b8c7e581a1 add support of linuxArm64 target 2023-10-20 21:53:27 +06:00
InsanusMokrassar 8281259179 start 0.20.9 2023-10-17 23:34:53 +06:00
InsanusMokrassar d3e06b07df Update libs.versions.toml 2023-10-14 22:53:02 +06:00
InsanusMokrassar 4967018418 Merge pull request #322 from InsanusMokrassar/0.20.8
0.20.8
2023-10-14 21:01:45 +06:00
InsanusMokrassar 537a3c38fa update dependencies 2023-10-14 16:22:00 +06:00
InsanusMokrassar 0124957833 start 0.20.8 2023-10-14 16:08:51 +06:00
InsanusMokrassar f0420e2d61 Merge pull request #312 from InsanusMokrassar/0.20.7
0.20.7
2023-10-09 18:16:58 +06:00
InsanusMokrassar 7090566041 fill changelog 2023-10-09 13:58:17 +06:00
InsanusMokrassar f0d5035cd0 update dependencies 2023-10-09 13:53:44 +06:00
InsanusMokrassar 0fb9b8dc30 update compose version 2023-09-27 17:59:09 +06:00
InsanusMokrassar eef6e81134 Update libs.versions.toml 2023-09-26 01:28:36 +06:00
InsanusMokrassar 1593159a3f Update libs.versions.toml 2023-09-26 01:27:20 +06:00
InsanusMokrassar 3da9eb9dbe temporal update 2023-09-22 14:14:23 +06:00
InsanusMokrassar f17613f3fb update dependencies 2023-09-12 14:11:12 +06:00
InsanusMokrassar 14337ccb46 start 0.20.7 2023-09-10 17:09:08 +06:00
InsanusMokrassar 1a3913b09c Merge pull request #311 from InsanusMokrassar/0.20.6
0.20.6
2023-09-08 04:20:58 +06:00
InsanusMokrassar 039aed2747 improvements in ExposedReadKeyValuesRepo 2023-09-08 02:59:53 +06:00
InsanusMokrassar 173991e3cb start 0.20.6 2023-09-08 02:55:25 +06:00
InsanusMokrassar 8b3f8cab01 Merge pull request #310 from InsanusMokrassar/0.20.5
0.20.5
2023-09-07 20:09:58 +06:00
InsanusMokrassar 2a20d24589 fixes in SmartRWLocker 2023-09-07 16:57:59 +06:00
InsanusMokrassar 53c2d552ec start 0.20.5 2023-09-07 16:57:08 +06:00
InsanusMokrassar af11c1a83d Merge pull request #307 from InsanusMokrassar/0.20.4
0.20.4
2023-09-06 19:17:17 +06:00
InsanusMokrassar a65cf1481c fixes in build 2023-09-06 19:15:09 +06:00
InsanusMokrassar 0318716236 update kslog version 2023-09-06 19:08:32 +06:00
InsanusMokrassar 88eb4b3342 update dependencies 2023-09-06 18:58:10 +06:00
InsanusMokrassar 4810d1ef6a start 0.20.4 2023-09-06 18:55:48 +06:00
InsanusMokrassar f2a9514d89 Merge pull request #306 from InsanusMokrassar/renovate/jb.dokka
Update dependency org.jetbrains.dokka:dokka-gradle-plugin to v1.9.0
2023-09-02 04:15:10 +06:00
InsanusMokrassar 925ba6ac24 Update build.gradle 2023-09-02 04:04:04 +06:00
renovate[bot] ef407268a2 Update dependency org.jetbrains.dokka:dokka-gradle-plugin to v1.9.0 2023-09-01 21:04:25 +00:00
InsanusMokrassar cd6c4bbe38 Merge pull request #304 from InsanusMokrassar/0.20.3
0.20.3
2023-09-02 03:03:57 +06:00
InsanusMokrassar c058e18408 update smart rw locker tests 2023-09-01 20:11:04 +06:00
InsanusMokrassar 6d3ca565ca update ktor 2023-09-01 19:41:49 +06:00
InsanusMokrassar 236a7b4fd2 Update libs.versions.toml 2023-09-01 04:33:36 +06:00
InsanusMokrassar e1f387dbf7 update dependencies and make a lot of fixes in repos and smart lockers/semaphors 2023-08-31 01:37:35 +06:00
InsanusMokrassar 3d113dd31e fixes in locks of caches repos 2023-08-29 15:06:55 +06:00
InsanusMokrassar e0e57f0336 start 0.20.3 2023-08-29 14:59:57 +06:00
InsanusMokrassar e775b58d41 Merge pull request #298 from InsanusMokrassar/0.20.2
0.20.2
2023-08-24 20:10:06 +06:00
InsanusMokrassar 5b070a8478 add small kdoc for map repos 2023-08-24 17:15:29 +06:00
InsanusMokrassar 8a61193500 update korlibs 2023-08-24 14:29:15 +06:00
InsanusMokrassar fad522b8fe Update CHANGELOG.md 2023-08-24 03:00:08 +06:00
InsanusMokrassar 0acac205af fix build 2023-08-24 02:17:27 +06:00
InsanusMokrassar 069d4c61b7 update android target 2023-08-23 14:52:09 +06:00
InsanusMokrassar 7c113f5700 Update libs.versions.toml 2023-08-23 13:27:23 +06:00
InsanusMokrassar dfdaf4225b start 0.20.2 and all main repos uses 'SmartRWLocker' 2023-08-23 03:26:54 +06:00
InsanusMokrassar bd39ab2467 Merge pull request #295 from InsanusMokrassar/0.20.1
0.20.1
2023-08-12 22:47:03 +06:00
InsanusMokrassar 6ce1eb3f2d add tests for smartrwlocker 2023-08-12 22:37:35 +06:00
InsanusMokrassar ce7d4fe9a2 fix of #293 2023-08-12 22:08:12 +06:00
InsanusMokrassar a65bb2f419 add number picker, set picker and small text field 2023-08-11 01:51:40 +06:00
InsanusMokrassar cbc868448b start 0.20.1 2023-08-11 00:58:09 +06:00
InsanusMokrassar 9c336a0b56 Update CHANGELOG.md 2023-08-09 02:43:53 +06:00
InsanusMokrassar 0f0d09399e Update CHANGELOG.md 2023-08-09 02:42:28 +06:00
InsanusMokrassar e13a1162a9 Merge pull request #294 from InsanusMokrassar/0.20.0
0.20.0
2023-08-09 00:32:03 +06:00
InsanusMokrassar 57ebed903f done migration 2023-08-08 18:45:36 +06:00
InsanusMokrassar 4478193d8a update dependencies 2023-08-05 13:49:45 +06:00
InsanusMokrassar ee948395e3 start 0.20.0 2023-08-02 13:03:40 +06:00
InsanusMokrassar 0616b051ae Merge pull request #291 from InsanusMokrassar/0.19.9
0.19.9
2023-07-29 17:37:38 +06:00
InsanusMokrassar 4d155d0505 update koin 2023-07-29 16:37:25 +06:00
InsanusMokrassar a169e733d9 fill changelog 2023-07-29 16:31:50 +06:00
InsanusMokrassar f081e237c8 improvements in startup plugin 2023-07-29 16:30:17 +06:00
InsanusMokrassar f412d387fa start 0.19.9 2023-07-29 16:05:24 +06:00
InsanusMokrassar 67354b43e2 Merge pull request #287 from InsanusMokrassar/0.19.8
0.19.8
2023-07-27 01:33:49 +06:00
InsanusMokrassar 39135a4000 skipStartInvalidate 2023-07-27 00:35:01 +06:00
InsanusMokrassar eaa014cebd update dependencies 2023-07-27 00:30:26 +06:00
InsanusMokrassar 856e657f81 fixes in KeyValueRepo.clear 2023-07-23 13:47:20 +06:00
InsanusMokrassar 3a609e5b66 start 0.19.8 2023-07-23 13:26:39 +06:00
InsanusMokrassar d0022dd599 Merge pull request #281 from InsanusMokrassar/0.19.7
0.19.7
2023-06-30 14:37:36 +06:00
InsanusMokrassar 7ba6eed453 Update CHANGELOG.md 2023-06-30 12:04:42 +06:00
InsanusMokrassar beeb6ecc0a Update CHANGELOG.md 2023-06-30 12:03:17 +06:00
InsanusMokrassar 7cdc17a714 Update libs.versions.toml 2023-06-30 12:02:20 +06:00
InsanusMokrassar 4765a950a9 start 0.19.7 2023-06-30 12:01:21 +06:00
InsanusMokrassar 65e8137e08 Merge pull request #279 from InsanusMokrassar/0.19.6
0.19.6
2023-06-29 20:27:19 +06:00
InsanusMokrassar ae546dd9ad update dependencies 2023-06-29 18:38:58 +06:00
InsanusMokrassar 8110c42be0 update compose 2023-06-27 16:53:10 +06:00
InsanusMokrassar bd2b5ae5fc add versions plugin 2023-06-27 16:46:45 +06:00
InsanusMokrassar 2ddfffa6a9 start 0.19.6 2023-06-27 16:46:45 +06:00
InsanusMokrassar a4b54e861d Merge pull request #277 from InsanusMokrassar/0.19.5
0.19.5
2023-06-20 20:22:33 +06:00
InsanusMokrassar c6785f1a4f fixes in types generation 2023-06-20 20:20:47 +06:00
InsanusMokrassar 83fe621c56 start 0.19.5 2023-06-20 20:16:24 +06:00
InsanusMokrassar b3a93e17eb Merge pull request #275 from InsanusMokrassar/0.19.4
0.19.4
2023-06-19 16:25:43 +06:00
InsanusMokrassar 546a391af3 dependencies update 2023-06-19 16:19:14 +06:00
InsanusMokrassar 786cf9bd8b fix in koin generator 2023-06-19 13:52:41 +06:00
InsanusMokrassar dfd6fe062d start 0.19.4 2023-06-19 13:45:29 +06:00
InsanusMokrassar b6ef818613 Merge pull request #274 from InsanusMokrassar/0.19.3
0.19.3
2023-06-19 08:45:45 +06:00
InsanusMokrassar b0f9e9c30a generic-oriented koin definitions 2023-06-19 00:32:45 +06:00
InsanusMokrassar 7e5c88ddc3 koin generator improvements 2023-06-18 23:38:36 +06:00
InsanusMokrassar 9824c3e00f start 0.19.3 2023-06-18 23:11:50 +06:00
InsanusMokrassar 9171d5ed11 update dokka version and return js kdocs 2023-06-09 12:01:11 +06:00
InsanusMokrassar a1830ebb82 Merge pull request #269 from InsanusMokrassar/0.19.2
0.19.2
2023-06-02 13:02:38 +06:00
InsanusMokrassar 22d2a3d9bf Update CHANGELOG.md 2023-06-02 12:47:45 +06:00
InsanusMokrassar c9b97fc965 Update libs.versions.toml 2023-06-02 12:46:56 +06:00
InsanusMokrassar 51f85becd5 Merge pull request #267 from InsanusMokrassar/0.19.2
0.19.2
2023-06-02 12:39:27 +06:00
InsanusMokrassar a8a281cfb4 downgrade kotlin-poet version 2023-06-02 12:19:02 +06:00
InsanusMokrassar ddd1304949 update dependencies 2023-06-02 12:17:21 +06:00
InsanusMokrassar 86d70b6c02 start 0.19.2 2023-06-02 12:11:49 +06:00
InsanusMokrassar a22bdb39e7 Merge pull request #261 from InsanusMokrassar/0.19.1
update kotlin poet (0.19.1)
2023-05-29 17:35:29 +06:00
InsanusMokrassar 7ae4d5ef95 update kotlin poet 2023-05-29 17:31:40 +06:00
InsanusMokrassar a2038cbefa Merge pull request #259 from InsanusMokrassar/0.19.1
0.19.1
2023-05-29 17:28:19 +06:00
InsanusMokrassar 992091eade Update CHANGELOG.md 2023-05-29 17:27:57 +06:00
InsanusMokrassar e3bfead0c5 Update libs.versions.toml 2023-05-29 10:15:19 +06:00
InsanusMokrassar 0de96141fd start 0.19.1 2023-05-29 10:14:35 +06:00
InsanusMokrassar fa18d15c3c Merge pull request #257 from InsanusMokrassar/0.19.0
0.19.0
2023-05-26 20:17:30 +06:00
InsanusMokrassar ea9dbf2371 Koin.get and Scope.get with opportunity to get dependency by its type and definition 2023-05-25 21:12:21 +06:00
InsanusMokrassar d34e3ec7a9 update dependencies 2023-05-25 21:08:12 +06:00
InsanusMokrassar c8833a36af start 0.19.0 2023-05-25 20:58:05 +06:00
InsanusMokrassar a067cb0c0f Merge pull request #256 from InsanusMokrassar/0.18.4
0.18.4
2023-05-14 16:51:57 +06:00
InsanusMokrassar 999c8327bd lazyInject 2023-05-14 16:36:24 +06:00
InsanusMokrassar c2ec73c70a start 0.18.4 2023-05-14 16:28:03 +06:00
InsanusMokrassar 702f782fc1 Merge pull request #254 from InsanusMokrassar/0.18.3
0.18.3
2023-05-12 14:30:37 +06:00
InsanusMokrassar 25dbcaaf83 update dependencies 2023-05-12 00:51:38 +06:00
InsanusMokrassar b00d454a24 start 0.18.3 2023-05-12 00:26:16 +06:00
InsanusMokrassar dbc921d56d Merge pull request #250 from InsanusMokrassar/0.18.2
0.18.2
2023-05-10 10:19:47 +06:00
InsanusMokrassar 438fefa7a3 fixes 2023-05-09 15:09:50 +06:00
InsanusMokrassar 5d74eac814 Update libs.versions.toml 2023-05-09 01:41:25 +06:00
InsanusMokrassar 9fb62e1e25 start 0.18.2 and make json of Startup customizable 2023-05-09 01:38:04 +06:00
InsanusMokrassar 3e366ea73b Update libs.versions.toml 2023-05-06 01:54:15 +06:00
InsanusMokrassar 0ff895bffa Update gradle.properties 2023-05-06 01:53:33 +06:00
InsanusMokrassar c5bb120280 Merge pull request #248 from InsanusMokrassar/0.18.1
0.18.1
2023-05-05 22:26:53 +06:00
InsanusMokrassar 4b26a92b37 improve old diff API 2023-05-05 12:01:29 +06:00
InsanusMokrassar 0a8453b4d2 add MapDiff#reversed and MutableMap#applyDiff(MapDiff) 2023-05-05 11:58:27 +06:00
InsanusMokrassar c9872a61b6 now applyDiff will return its receiver 2023-05-05 11:50:23 +06:00
InsanusMokrassar 149a1aa278 fix in new applyDiff 2023-05-05 11:33:22 +06:00
InsanusMokrassar 13d0e1b682 add MapDiff utils 2023-05-04 21:12:26 +06:00
InsanusMokrassar 6f9be2a9f8 start 0.18.1 and add SmartMutex 2023-05-03 23:47:05 +06:00
InsanusMokrassar 93ba98d993 Merge pull request #246 from InsanusMokrassar/revert-245-renovate/ksp
Revert "Update ksp to v1.8.21-1.0.11"
2023-04-28 00:34:20 +06:00
root 940ee3df06 Revert "Update ksp to v1.8.21-1.0.11" 2023-04-28 00:34:10 +06:00
InsanusMokrassar 2e7bab10fd Merge pull request #245 from InsanusMokrassar/renovate/ksp
Update ksp to v1.8.21-1.0.11
2023-04-28 00:14:25 +06:00
renovate[bot] 3ed70a37ea Update ksp to v1.8.21-1.0.11 2023-04-27 18:10:41 +00:00
InsanusMokrassar fe8f80b9d9 Merge pull request #243 from InsanusMokrassar/0.18.0
0.18.0
2023-04-27 17:08:42 +06:00
InsanusMokrassar d81fb32fb9 remove previous deprecations 2023-04-27 16:29:08 +06:00
InsanusMokrassar 2877b5532c Revert "Get back some functional of "trying to update up to gradle wrapper 8.1.1""
This reverts commit b938b21395.
2023-04-27 16:24:58 +06:00
InsanusMokrassar b938b21395 Get back some functional of "trying to update up to gradle wrapper 8.1.1" 2023-04-27 16:24:37 +06:00
InsanusMokrassar 58836359cc Revert "trying to update up to gradle wrapper 8.1.1"
This reverts commit 5edb0e1331.
2023-04-27 15:00:43 +06:00
InsanusMokrassar 5edb0e1331 trying to update up to gradle wrapper 8.1.1 2023-04-27 14:15:45 +06:00
InsanusMokrassar 0f0d0b5d58 update android fragments dependency 2023-04-27 12:16:48 +06:00
InsanusMokrassar 46c1887cbe remove usage of cache updates flows in autorecached repos 2023-04-27 12:06:50 +06:00
InsanusMokrassar 5f231c2212 ReadKeyValuesRepo#removeWithValue 2023-04-25 19:32:43 +06:00
InsanusMokrassar 4e97ce86aa add defauult value to kvCache in fullyCached 2023-04-25 17:39:14 +06:00
InsanusMokrassar 315a7cb29e Rename full caching factories functions to fullyCached 2023-04-25 17:23:47 +06:00
InsanusMokrassar aa7cc503f2 improvements in query parameters getting 2023-04-25 13:14:12 +06:00
InsanusMokrassar 4bbe7e5a80 update build tools version 2023-04-25 12:23:53 +06:00
InsanusMokrassar d9c05f38d2 start 0.18.0 2023-04-25 12:23:08 +06:00
InsanusMokrassar cd0c4c9650 Merge pull request #237 from InsanusMokrassar/renovate/android-gradle
Update dependency com.android.tools.build:gradle to v7.4.2
2023-04-25 00:38:47 +06:00
InsanusMokrassar fc3407f104 Merge pull request #241 from InsanusMokrassar/0.17.8
0.17.8
2023-04-19 20:16:36 +06:00
InsanusMokrassar 3a5544206b update ktor 2023-04-19 19:46:39 +06:00
InsanusMokrassar e17e2f7fb8 start 0.17.8 2023-04-19 19:45:58 +06:00
renovate[bot] d32c95f143 Update dependency com.android.tools.build:gradle to v7.4.2 2023-04-18 18:12:52 +00:00
InsanusMokrassar 6d8a8ab018 Merge pull request #233 from InsanusMokrassar/0.17.7
0.17.7
2023-04-18 19:37:06 +06:00
InsanusMokrassar a7dce8fa78 update dependencies 2023-04-18 19:24:05 +06:00
InsanusMokrassar ca73ff8e19 add support of native in startup 2023-04-18 19:20:39 +06:00
InsanusMokrassar d01ad10d7d start 0.17.7 2023-04-18 19:20:39 +06:00
InsanusMokrassar 81041ee43c Merge pull request #232 from InsanusMokrassar/renovate/configure
Configure Renovate
2023-04-18 19:20:15 +06:00
renovate[bot] 6e004c2ae4 Add renovate.json 2023-04-18 08:23:10 +00:00
InsanusMokrassar 0e2fac5b22 Merge pull request #231 from InsanusMokrassar/0.17.6
0.17.6
2023-04-13 11:27:18 +06:00
InsanusMokrassar 269da7f155 update dependencies and fill changelog 2023-04-13 11:20:34 +06:00
InsanusMokrassar 3cb6b73ee0 add preloadImage 2023-04-07 01:17:04 +06:00
InsanusMokrassar a938ee1efb simplify API of MPPFile.input 2023-04-04 01:26:18 +06:00
InsanusMokrassar 6ea5e2e5a6 update version 2023-04-03 22:54:57 +06:00
InsanusMokrassar 617dfb54e0 experimentally add linuxx64 and mingwx64 as target platforms 2023-04-03 22:35:41 +06:00
InsanusMokrassar d23e005985 preview of files realization 2023-04-03 15:49:46 +06:00
InsanusMokrassar e5207f5bc5 Revert "Revert "trying to add native support""
This reverts commit c96cea8db0.
2023-04-03 10:26:03 +06:00
InsanusMokrassar c96cea8db0 Revert "trying to add native support"
This reverts commit 0a8e71d76a.
2023-04-03 10:22:53 +06:00
InsanusMokrassar 0a8e71d76a trying to add native support 2023-04-03 10:22:43 +06:00
InsanusMokrassar cf1fd32b08 Merge pull request #230 from InsanusMokrassar/0.17.5
0.17.5
2023-03-10 22:30:32 +06:00
InsanusMokrassar cc4224ea1f update kv and crud tests 2023-03-10 22:08:35 +06:00
InsanusMokrassar f4c148bc58 add map type info in ktor read kv and crud repos 2023-03-10 21:41:01 +06:00
InsanusMokrassar 022297ad3f fixes in AutoRecacheReadKeyValueRepo 2023-03-10 19:37:36 +06:00
InsanusMokrassar 5180d6fc3e hotfixes 2023-03-10 18:43:43 +06:00
InsanusMokrassar eeebbff70d getAll 2023-03-10 18:37:48 +06:00
InsanusMokrassar afc6aeea15 fixes 2023-03-10 16:14:51 +06:00
InsanusMokrassar 486515eddd update dokka 2023-03-10 16:09:33 +06:00
InsanusMokrassar 0e21699cd1 several updates 2023-03-10 15:45:02 +06:00
InsanusMokrassar f1678ef7cf start 0.17.5 2023-03-10 15:36:36 +06:00
InsanusMokrassar cea65fc76e Merge pull request #229 from InsanusMokrassar/0.17.4
0.17.4
2023-03-09 23:23:55 +06:00
InsanusMokrassar c9e320b72a update compose version 2023-03-09 23:22:33 +06:00
InsanusMokrassar 555956087d add android manifest to mapper module 2023-03-09 22:23:56 +06:00
InsanusMokrassar b3f468f901 add docs to mapper serialization and allow to use them as supertypes 2023-03-09 22:21:22 +06:00
InsanusMokrassar f5f7511781 add mapper serializer 2023-03-09 21:55:07 +06:00
InsanusMokrassar 4be1d93f60 start 0.17.4 2023-03-09 21:49:15 +06:00
InsanusMokrassar 7d684608ef Merge pull request #228 from InsanusMokrassar/0.17.3
0.17.3
2023-03-07 23:30:23 +06:00
InsanusMokrassar 2c7fd320eb fixed 2023-03-07 22:28:56 +06:00
InsanusMokrassar 88ee82e1c6 add Diff#isEmpty 2023-03-07 21:50:23 +06:00
InsanusMokrassar d6402c624e optimization of nonstrict comparison 2023-03-07 19:14:43 +06:00
InsanusMokrassar 8b9c93bc10 diffs improvement 2023-03-07 19:12:12 +06:00
InsanusMokrassar 4f5e261d01 start 0.17.3 2023-03-07 18:59:34 +06:00
InsanusMokrassar cf455aebe6 Merge pull request #227 from InsanusMokrassar/0.17.2
0.17.2
2023-03-02 21:57:49 +06:00
InsanusMokrassar 1380d5f8e1 fill changelog 2023-03-02 21:38:20 +06:00
InsanusMokrassar 5f65260bfe Update DefaultStatesManager.kt 2023-03-02 21:35:59 +06:00
InsanusMokrassar 11f0dcfc01 Update DefaultStatesManager.kt 2023-03-02 21:32:58 +06:00
InsanusMokrassar 555b7886a4 Update gradle.properties 2023-03-02 21:28:50 +06:00
InsanusMokrassar 3707a6c0ce Merge pull request #226 from InsanusMokrassar/0.17.1
0.17.1
2023-02-28 19:36:08 +06:00
InsanusMokrassar 4c8d92b4c3 update ktor 2023-02-28 19:32:32 +06:00
InsanusMokrassar 8bbd33c896 now all android modules depends on jvm 2023-02-28 19:08:39 +06:00
InsanusMokrassar ac33a3580f start 0.17.1 2023-02-28 19:04:04 +06:00
InsanusMokrassar a64a32fbe6 Merge pull request #225 from InsanusMokrassar/0.17.0
0.17.0
2023-02-28 12:15:41 +06:00
InsanusMokrassar 9493e97a38 remove redundant part from defaultAndroidSettings.gradle 2023-02-27 22:46:08 +06:00
InsanusMokrassar 88bd770260 fill dependencies updates changelog 2023-02-27 22:45:35 +06:00
InsanusMokrassar a7bd33b7bf update kotlin and ksp versions 2023-02-27 17:53:37 +06:00
InsanusMokrassar 73c724a2e5 small cleanup in build scripts 2023-02-27 17:03:09 +06:00
InsanusMokrassar d8cf3c6726 update dependencies and at least it is buildable 2023-02-27 16:56:39 +06:00
InsanusMokrassar 15dee238b5 start 0.17.0 2023-02-27 15:54:37 +06:00
InsanusMokrassar c70626734e Merge pull request #224 from InsanusMokrassar/0.16.13
0.16.13
2023-02-27 15:51:20 +06:00
InsanusMokrassar 5a765ea1bc get back publishing signing 2023-02-27 15:43:52 +06:00
InsanusMokrassar 8215f9d2c6 temporal solution of generating problem 2023-02-26 14:37:41 +06:00
InsanusMokrassar d2e6d2ec80 generators for models has been created 2023-02-25 19:56:12 +06:00
InsanusMokrassar 3718181e8f start 0.16.13 2023-02-25 18:44:07 +06:00
InsanusMokrassar 0d825cf424 Merge pull request #223 from InsanusMokrassar/0.16.12
0.16.12
2023-02-22 10:30:45 +06:00
InsanusMokrassar 28a804d988 improve start launcher plugin logs 2023-02-22 10:28:25 +06:00
InsanusMokrassar 9e4bb9d678 add readme to generator and add several fixes in processor 2023-02-22 10:20:15 +06:00
InsanusMokrassar 9c40d7da3d add generator for koin definitions 2023-02-22 01:34:42 +06:00
InsanusMokrassar 2b76ad0aa9 improvements in selectByIds of CommonExposedRepo 2023-02-20 11:55:14 +06:00
InsanusMokrassar e4b619e050 start 0.16.12 2023-02-20 11:54:26 +06:00
InsanusMokrassar 36c09feaf2 Merge pull request #222 from InsanusMokrassar/0.16.11
0.16.11
2023-02-20 00:49:12 +06:00
InsanusMokrassar 2d68321503 Update build.gradle 2023-02-20 00:19:27 +06:00
InsanusMokrassar 85455ab21c improvements in language codes 2023-02-19 19:34:42 +06:00
InsanusMokrassar 18d63eb980 start 0.16.11 2023-02-19 19:20:03 +06:00
InsanusMokrassar 2e429e9704 Merge pull request #221 from InsanusMokrassar/0.16.10
0.16.10
2023-02-17 13:54:09 +06:00
InsanusMokrassar f4af28059b improvements in ReadKeyValueFromCRUDRepo 2023-02-17 13:45:22 +06:00
InsanusMokrassar c1476bd075 add ReadCRUDFromKeyValueRepo 2023-02-15 20:16:54 +06:00
InsanusMokrassar 16c720fddd start 0.16.10 2023-02-15 20:14:55 +06:00
InsanusMokrassar 8b4b4a5eca Merge pull request #220 from InsanusMokrassar/0.16.9
0.16.9
2023-02-13 16:09:55 +06:00
InsanusMokrassar 32e6e5b7e2 Update CHANGELOG.md 2023-02-13 16:09:44 +06:00
InsanusMokrassar a9f7fd8e32 new extension HttpResponse.bodyOrNullOnNoContent 2023-02-10 15:17:08 +06:00
InsanusMokrassar 95be1a26f2 improvements in HttpResponse.bodyOrNull 2023-02-10 15:14:03 +06:00
InsanusMokrassar ef9b31aee0 start 0.16.9 2023-02-05 18:17:20 +06:00
InsanusMokrassar df3c01ff0a Merge pull request #219 from InsanusMokrassar/0.16.8
0.16.8
2023-02-04 01:46:43 +06:00
InsanusMokrassar 4704c5a33d Update CHANGELOG.md 2023-02-04 01:39:49 +06:00
InsanusMokrassar 225c06550a fixes in FileKeyValueRepo 2023-02-03 10:23:52 +06:00
InsanusMokrassar f0987614c6 fixes in FileKeyValueRepo 2023-02-03 10:07:24 +06:00
InsanusMokrassar 269c2876f3 actualize all make it possible to disable clear on actualization 2023-02-02 20:07:31 +06:00
InsanusMokrassar 168d6acf7c actualizeAll now is overridable in auto recache repos 2023-02-02 20:05:25 +06:00
InsanusMokrassar a5f718e257 add meppers for kv<->kvs repos 2023-02-02 12:29:00 +06:00
InsanusMokrassar 4f68459582 start add kv to kvs transformations 2023-02-02 10:15:37 +06:00
InsanusMokrassar 442db122cf remove redundant id getter in keyvalues autocached repo 2023-02-01 23:02:06 +06:00
InsanusMokrassar 580d757be2 fixes in download file and upgrade ktor version 2023-02-01 22:28:17 +06:00
InsanusMokrassar 47b0f6d2d8 fixes 2023-02-01 13:03:51 +06:00
InsanusMokrassar 3f6f6ebc2b realize invalidate method in fallback cache repos 2023-01-31 10:09:55 +06:00
InsanusMokrassar 2645ea29d6 Update ActionWrapper.kt 2023-01-31 00:11:45 +06:00
InsanusMokrassar 79f2041565 Update AutoRecacheReadCRUDRepo.kt 2023-01-30 23:59:48 +06:00
InsanusMokrassar 4a7567f288 Update AutoRecacheWriteCRUDRepo.kt 2023-01-30 23:59:19 +06:00
InsanusMokrassar 8a890ed6ed Update AutoRecacheReadKeyValueRepo.kt 2023-01-30 23:58:43 +06:00
InsanusMokrassar 3d90df6897 Update AutoRecacheWriteKeyValueRepo.kt 2023-01-30 23:58:11 +06:00
InsanusMokrassar 681c13144a Update AutoRecacheReadKeyValuesRepo.kt 2023-01-30 23:57:40 +06:00
InsanusMokrassar b64f2e6d32 Update AutoRecacheWriteKeyValuesRepo.kt 2023-01-30 23:56:57 +06:00
InsanusMokrassar 428eabb1bd Create FallbackCacheRepo.kt 2023-01-30 23:54:32 +06:00
InsanusMokrassar 2162e83bce fixes in actualizeAll 2023-01-29 22:51:39 +06:00
InsanusMokrassar 6142022283 improve actualizeAll to lazily clear repo 2023-01-29 22:46:32 +06:00
InsanusMokrassar e6d9c8250f add all autorecaches repos 2023-01-29 22:18:22 +06:00
InsanusMokrassar 46178e723b fixes 2023-01-29 20:54:32 +06:00
InsanusMokrassar 605f55acd2 fixes in Write* cache repos 2023-01-29 20:35:10 +06:00
InsanusMokrassar 0f8b69aa60 start 0.16.8 2023-01-29 20:35:10 +06:00
InsanusMokrassar 551d8ec480 Merge pull request #218 from InsanusMokrassar/0.16.7
0.16.7
2023-01-29 13:20:16 +06:00
InsanusMokrassar fc48446ec4 temporarily remove fallback repo 2023-01-29 13:15:56 +06:00
InsanusMokrassar 3644b83ac6 fill changelog 2023-01-29 13:08:41 +06:00
InsanusMokrassar cd73791b6f add docs to the MutableState.asState 2023-01-29 12:46:27 +06:00
InsanusMokrassar 03de71df2e add docs to as compose state 2023-01-29 12:43:51 +06:00
InsanusMokrassar 83d5d3faf4 improve flow as state functionality 2023-01-29 12:28:22 +06:00
InsanusMokrassar 0c8bec4c89 add extension actualizeAll 2023-01-27 15:15:27 +06:00
InsanusMokrassar 7fc93817c1 start to add fallback repos 2023-01-27 14:45:31 +06:00
InsanusMokrassar d0a00031a1 Update CHANGELOG.md 2023-01-26 22:54:17 +06:00
InsanusMokrassar 6ebc5aa0c2 potential fix of state value change in asMutableComposeState 2023-01-23 15:21:47 +06:00
InsanusMokrassar 8a6b4bb49e add alsoIfTrue/alsoIfFalse/letIfTrue/letIfFalse 2023-01-22 23:01:06 +06:00
InsanusMokrassar 20799b9a3e add repeat on failure with callback 2023-01-22 22:43:26 +06:00
InsanusMokrassar ec3afc615c add serializable diff 2023-01-20 13:29:45 +06:00
InsanusMokrassar da692ccfc3 add ifTrue/ifFalse 2023-01-19 20:21:35 +06:00
InsanusMokrassar 53b89f3a18 start 0.16.7 2023-01-19 20:19:21 +06:00
InsanusMokrassar 58cded28d3 Merge pull request #217 from InsanusMokrassar/0.16.6
0.16.6
2023-01-18 22:28:44 +06:00
InsanusMokrassar 592c5f3732 Column extensions eqOrIsNull and neqOrIsNotNull 2023-01-14 20:17:57 +06:00
InsanusMokrassar f44a78a5f5 small improvement of openBaseWebSocketFlow 2023-01-14 15:20:52 +06:00
InsanusMokrassar e0bdd5dfdc improvements in microutils 2023-01-14 13:22:07 +06:00
InsanusMokrassar 99c0f06b72 repos update 2023-01-14 13:15:59 +06:00
InsanusMokrassar 66fc6df3d7 Improvements in 'StartLauncherPlugin#start' methods 2023-01-08 13:52:53 +06:00
InsanusMokrassar a36425a905 start 0.16.6 2023-01-08 13:51:34 +06:00
InsanusMokrassar d920fee6d4 Merge pull request #216 from InsanusMokrassar/0.16.5
0.16.5
2023-01-04 20:21:15 +06:00
InsanusMokrassar 23590be5de Update CHANGELOG.md 2023-01-04 20:20:25 +06:00
InsanusMokrassar 94acc3c93b Update libs.versions.toml 2023-01-04 08:56:46 +06:00
InsanusMokrassar 5616326a3b start 0.16.5 2023-01-04 08:50:19 +06:00
InsanusMokrassar 7601860c5c Merge pull request #214 from InsanusMokrassar/0.16.4
0.16.4
2022-12-27 19:03:35 +06:00
InsanusMokrassar 8b43d785cc update changelog 2022-12-27 18:51:01 +06:00
InsanusMokrassar b62d3a0b7d launchInCurrentThread 2022-12-27 18:50:41 +06:00
InsanusMokrassar fad73c7213 start 0.16.4 2022-12-27 18:49:04 +06:00
InsanusMokrassar 2403c7c2b0 Merge pull request #213 from InsanusMokrassar/0.16.3
0.16.3
2022-12-25 13:24:37 +06:00
InsanusMokrassar fa090bf920 Update StartLauncherPlugin.kt 2022-12-25 10:29:16 +06:00
InsanusMokrassar a83ee86340 improvements in startup launcher 2022-12-25 10:26:44 +06:00
InsanusMokrassar 204955bcce add template for startup and readme 2022-12-19 17:51:05 +06:00
InsanusMokrassar ee56e9543a start 0.16.3 2022-12-17 17:27:15 +06:00
InsanusMokrassar 96fdff6ffd Merge pull request #212 from InsanusMokrassar/0.16.2
0.16.2
2022-12-16 13:59:47 +06:00
InsanusMokrassar 58b007cbb3 fill changelog 2022-12-16 13:59:24 +06:00
InsanusMokrassar 4f0c139889 remove redundant stop koin expect-actual 2022-12-16 11:58:18 +06:00
InsanusMokrassar c584c24fce fixes and improvements 2022-12-15 15:07:10 +06:00
InsanusMokrassar 85e5cee154 replace createStartupPluginAndRegister 2022-12-15 14:59:07 +06:00
InsanusMokrassar 5af91981f1 upgrades and filling of README 2022-12-15 10:26:31 +06:00
InsanusMokrassar 2fe4f08059 update compose 2022-12-15 08:51:53 +06:00
InsanusMokrassar 83796f345a start fix startup 2022-12-14 22:26:23 +06:00
InsanusMokrassar c1e21364a6 start 0.16.2 2022-12-14 21:40:18 +06:00
InsanusMokrassar 067d9d0d3b Merge pull request #211 from InsanusMokrassar/0.16.1
0.16.1
2022-12-09 19:58:54 +06:00
InsanusMokrassar 03f527d83e Update CHANGELOG.md 2022-12-09 19:46:58 +06:00
InsanusMokrassar ced05a4586 improve default runCatchingSafely/safelyWithResult and add suspend variances of safe/unsafe SafeWrapper interface 2022-12-09 12:14:24 +06:00
InsanusMokrassar 43fe06206a add safe wrapper 2022-12-09 11:09:32 +06:00
InsanusMokrassar 023657558e start 0.16.1 2022-12-09 10:52:53 +06:00
InsanusMokrassar 9b0b726c80 Merge pull request #210 from InsanusMokrassar/0.16.0
0.16.0
2022-12-08 09:29:12 +06:00
InsanusMokrassar 4ee67321c4 fill changelog and update android dependencies 2022-12-08 09:26:59 +06:00
InsanusMokrassar 59f1f2e59b Update libs.versions.toml 2022-12-08 08:53:37 +06:00
InsanusMokrassar 0766d48b7c Update libs.versions.toml 2022-12-08 07:56:04 +06:00
InsanusMokrassar e18903b9e9 Update gradle.properties 2022-12-08 07:54:53 +06:00
InsanusMokrassar d0eecdead2 Update gradle.properties 2022-12-08 07:53:59 +06:00
InsanusMokrassar cc4a83a033 Update gradle.properties 2022-12-08 07:53:08 +06:00
InsanusMokrassar 1cf911bbde Update build.gradle 2022-12-07 19:40:30 +06:00
InsanusMokrassar 36d73d5023 Update StartupLaunchingTests.kt 2022-12-07 11:39:45 +06:00
InsanusMokrassar c395242e3e fixes in StartupLauncingTests 2022-12-07 10:50:51 +06:00
InsanusMokrassar cd9cd7cc5d Merge pull request #208 from InsanusMokrassar/0.15.1
0.15.1
2022-12-07 09:43:48 +06:00
InsanusMokrassar acbb8a0c07 complete prepare startup module 2022-12-06 13:15:08 +06:00
InsanusMokrassar b9d8528599 complete kdocs for the startup module 2022-12-06 13:14:05 +06:00
InsanusMokrassar 4971326eca add kdocs for the config of startup 2022-12-06 13:08:37 +06:00
InsanusMokrassar 09d1047260 add kdocs to the startup module 2022-12-06 13:06:21 +06:00
InsanusMokrassar 02dbd493c2 add tests and make several replacements/improvements 2022-12-06 12:38:24 +06:00
InsanusMokrassar b17931e7bd complete startup module 2022-12-05 22:31:15 +06:00
InsanusMokrassar 2a4570eafc Update ServerLauncher.kt 2022-12-05 21:52:36 +06:00
InsanusMokrassar c9514d3a6d Create DefaultJson.kt 2022-12-05 21:47:00 +06:00
InsanusMokrassar 072805efc7 Update ServerLauncher.kt 2022-12-05 21:45:30 +06:00
InsanusMokrassar 369ff26627 initialize startup module 2022-12-05 21:19:38 +06:00
InsanusMokrassar c5abbbbd2d start 0.15.1 2022-12-05 20:04:50 +06:00
InsanusMokrassar d974639f1e fixes in source roots of dokka 2022-12-05 07:47:35 +06:00
InsanusMokrassar 26efde316b remove redundant fix of android 32 dx files from worflows 2022-12-05 07:09:31 +06:00
InsanusMokrassar fafe50f80a suppress kdocs of uniupload in actual realizations 2022-12-05 07:00:31 +06:00
InsanusMokrassar 41504469db Revert "potential fix of dokka"
This reverts commit 31022733ac.
2022-12-05 06:57:29 +06:00
InsanusMokrassar 03b3ddd98b Revert "remove redundant dokka println"
This reverts commit b53cfd5504.
2022-12-05 06:57:27 +06:00
InsanusMokrassar 89d919f2be Merge pull request #207 from InsanusMokrassar/0.15.0
0.15.0
2022-12-04 19:26:14 +06:00
InsanusMokrassar b53cfd5504 remove redundant dokka println 2022-12-04 19:03:44 +06:00
InsanusMokrassar 31022733ac potential fix of dokka 2022-12-04 19:00:16 +06:00
InsanusMokrassar f9a8c39879 updates and fixes in mime types 2022-12-02 21:07:32 +06:00
InsanusMokrassar a812c2dd2f refresh language codes 2022-12-02 20:03:29 +06:00
InsanusMokrassar 217e977f0d ids in crud repos 2022-12-02 13:46:06 +06:00
InsanusMokrassar 04c301d1ac upgrade version up to 0.15.0 2022-12-02 13:31:11 +06:00
InsanusMokrassar 7f0c425389 start 0.14.5 2022-12-02 13:04:44 +06:00
InsanusMokrassar 1ede1c423b Merge pull request #206 from InsanusMokrassar/0.14.4
0.14.4
2022-11-27 17:34:07 +06:00
InsanusMokrassar 7cb064896a fill changelog 2022-11-27 14:44:03 +06:00
InsanusMokrassar 0c5e2862ca improvements in ktor client-server files handling 2022-11-27 14:38:35 +06:00
InsanusMokrassar 30d4507f54 hotfix in handleUniUpload 2022-11-26 12:12:01 +06:00
InsanusMokrassar b6c6d89455 Update gradle.properties 2022-11-25 10:16:31 +06:00
InsanusMokrassar 9d218ee534 Update UniloadMultipart.kt 2022-11-25 10:15:59 +06:00
InsanusMokrassar 11116d8cab Merge pull request #205 from InsanusMokrassar/0.14.3
0.14.3
2022-11-24 13:15:08 +06:00
InsanusMokrassar 58d754bbde handleUniUpload now is inline 2022-11-24 12:29:48 +06:00
InsanusMokrassar 8f25c123dd add download and downloadToTemporalFile extensions 2022-11-24 11:27:30 +06:00
InsanusMokrassar 76e214fc08 upfixes 2022-11-22 14:39:31 +06:00
InsanusMokrassar 2b5380f8d6 add server part of uniUpload, fill changelog 2022-11-22 13:38:36 +06:00
InsanusMokrassar 844a129094 complete universal uniupload 2022-11-22 12:57:43 +06:00
InsanusMokrassar a3090cca9d add uniupload for JVM 2022-11-22 10:36:15 +06:00
InsanusMokrassar b7b5159e9c Revert "Revert "start adding uniupload""
This reverts commit 0d1aae0ef7.
2022-11-22 09:51:10 +06:00
InsanusMokrassar 0f8bc2c950 fix in workflow build 2022-11-21 20:50:28 +06:00
InsanusMokrassar 69f5c49f45 small update of build workflows 2022-11-21 20:49:04 +06:00
InsanusMokrassar 9b308e6fb8 update workflow 2022-11-21 20:32:48 +06:00
InsanusMokrassar 3e3f91128b add dependency of common android repos onto jvm 2022-11-21 20:23:05 +06:00
InsanusMokrassar 0d1aae0ef7 Revert "start adding uniupload"
This reverts commit 4d022f0480.
2022-11-21 20:20:37 +06:00
InsanusMokrassar 4d022f0480 start adding uniupload 2022-11-21 13:39:11 +06:00
InsanusMokrassar 153e20d00e start 0.14.3 2022-11-21 12:49:04 +06:00
InsanusMokrassar a9a8171dd6 add gitea repo 2022-11-16 21:35:18 +06:00
InsanusMokrassar bf5c3b59b2 Merge pull request #204 from InsanusMokrassar/0.14.2
0.14.2
2022-11-15 10:02:11 +06:00
InsanusMokrassar 607c432bdb Update CHANGELOG.md 2022-11-15 10:01:58 +06:00
InsanusMokrassar ae5c010770 Update libs.versions.toml 2022-11-15 09:54:18 +06:00
InsanusMokrassar d5e432437f Update gradle.properties 2022-11-15 09:53:28 +06:00
InsanusMokrassar 9f99ebce01 Merge pull request #203 from InsanusMokrassar/0.14.1
0.14.1
2022-11-10 17:19:17 +06:00
InsanusMokrassar 64ee899b84 revert koin version change 2022-11-10 17:13:25 +06:00
InsanusMokrassar e0e0c1658b revert kotlin versin version change 2022-11-10 17:11:45 +06:00
InsanusMokrassar 2c586f667c update version 2022-11-10 17:09:12 +06:00
InsanusMokrassar 64164ef6c1 update dependencies 2022-11-10 17:06:20 +06:00
InsanusMokrassar 22343c0731 Merge pull request #202 from InsanusMokrassar/0.14.0
0.14.0
2022-11-08 14:20:12 +06:00
InsanusMokrassar f4ec1a4c60 add deprecations removing note 2022-11-08 14:19:48 +06:00
InsanusMokrassar c1c33cceb1 remove deprecations 2022-11-08 14:17:45 +06:00
InsanusMokrassar a3e975b2ba Update CHANGELOG.md 2022-11-08 14:13:36 +06:00
InsanusMokrassar 06e705a687 update klock 2022-11-08 13:12:39 +06:00
InsanusMokrassar d56eb6c867 fixes 2022-11-08 12:47:59 +06:00
InsanusMokrassar 9cbca864e3 Update CHANGELOG.md 2022-11-08 08:00:18 +06:00
InsanusMokrassar abb4378694 Update libs.versions.toml 2022-11-08 07:59:50 +06:00
InsanusMokrassar 0eb698d9a4 start 0.14.0 2022-11-08 07:57:31 +06:00
InsanusMokrassar 15ea9f2093 add documentation for KeyValue repo 2022-11-03 13:01:51 +06:00
InsanusMokrassar d47aca0923 Merge pull request #201 from InsanusMokrassar/0.13.2
0.13.2
2022-10-30 22:35:07 +06:00
InsanusMokrassar 1ac50e9959 update several dependencies and fill changelog 2022-10-30 21:45:19 +06:00
InsanusMokrassar 6adfbe3a96 Update exposed and revert several dependencies updates 2022-10-24 23:52:04 +06:00
InsanusMokrassar 59f36e62e9 update dependencies 2022-10-22 14:25:46 +06:00
InsanusMokrassar 54af116009 start 0.13.2 2022-10-22 14:14:12 +06:00
InsanusMokrassar 38fbec8e3b Merge pull request #200 from InsanusMokrassar/0.13.1
0.13.1
2022-10-17 15:42:13 +06:00
InsanusMokrassar babbfc55e4 update default of AbstractExposedWriteCRUDRepo 2022-10-17 15:31:27 +06:00
InsanusMokrassar 2511e18d69 AbstractExposedWriteCRUDRepo#createAndInsertId now is optional and returns nullable value 2022-10-17 14:42:53 +06:00
InsanusMokrassar 29658c70a0 start 0.13.1 2022-10-17 14:35:16 +06:00
InsanusMokrassar 96311ee43d Merge pull request #199 from InsanusMokrassar/0.13.0
0.13.0
2022-10-13 16:50:50 +06:00
InsanusMokrassar bd33b09052 A LOT OF KTOR METHODS RELATED TO UnifierRouter/UnifiedRequester HAVE BEEN REMOVED 2022-10-11 13:24:39 +06:00
InsanusMokrassar 8055003b47 deprecations removing 2022-10-11 12:58:29 +06:00
InsanusMokrassar 1257492f85 changes in insert/update exposed methods and rewriting of read keyvalue(s) exposed repos to be extending abstract key value(s) repos 2022-10-11 12:55:25 +06:00
InsanusMokrassar 1107b7f4ef start 0.13.0 2022-10-11 12:07:49 +06:00
InsanusMokrassar a1a1171240 start 0.12.18 2022-10-04 15:36:43 +06:00
InsanusMokrassar 46c02e5df1 Merge pull request #198 from InsanusMokrassar/0.12.17
0.12.17
2022-10-01 21:59:42 +06:00
InsanusMokrassar 2e9efc57de update dependencies 2022-10-01 21:56:47 +06:00
InsanusMokrassar acecadef17 start 0.12.17 2022-10-01 21:41:34 +06:00
InsanusMokrassar 19394b5e69 Merge pull request #197 from InsanusMokrassar/0.12.16
0.12.16
2022-09-26 02:16:17 +06:00
InsanusMokrassar de999e197f fix of setOnHierarchyChangeListenerRecursively 2022-09-26 01:10:10 +06:00
InsanusMokrassar 9d95687d3c FlowOnHierarchyChangeListener 2022-09-26 01:02:12 +06:00
InsanusMokrassar aa9dfb4ab8 start 0.12.16 2022-09-26 00:47:32 +06:00
InsanusMokrassar 9c5b44efb3 Merge pull request #196 from InsanusMokrassar/0.12.15
0.12.15
2022-09-24 01:04:01 +06:00
InsanusMokrassar ac587a67e6 findViewsByTag 2022-09-23 16:43:33 +06:00
InsanusMokrassar 59428140a8 applyDiff: Diff 2022-09-23 16:05:32 +06:00
InsanusMokrassar 60bdb59d71 fix version change 2022-09-23 12:41:57 +06:00
InsanusMokrassar be52871de8 flows extensions 2022-09-23 12:41:07 +06:00
InsanusMokrassar b7934cf357 flows extensions 2022-09-23 12:33:00 +06:00
InsanusMokrassar dbfbeef90a start 0.12.15 2022-09-23 12:12:15 +06:00
InsanusMokrassar 00943c9cdf add docs for Diff class 2022-09-23 12:10:24 +06:00
InsanusMokrassar 8745c6a16a Merge pull request #195 from InsanusMokrassar/0.12.14
0.12.14
2022-09-23 00:19:12 +06:00
InsanusMokrassar 433ba4b58f argumentOrNull/argumentOrThrow 2022-09-22 23:39:08 +06:00
InsanusMokrassar d40376e524 Update CHANGELOG.md 2022-09-22 21:51:40 +06:00
InsanusMokrassar a2982f88f5 Update libs.versions.toml 2022-09-21 21:17:34 +06:00
InsanusMokrassar 1642f7abd9 improvements in AwaitFirst 2022-09-21 18:00:39 +06:00
InsanusMokrassar a10d2184ff start 0.12.14 2022-09-21 17:53:57 +06:00
InsanusMokrassar 522435f096 Merge pull request #194 from InsanusMokrassar/0.12.13
make actor not async
2022-09-15 01:43:21 +06:00
InsanusMokrassar 79b30290c0 fix build 2022-09-15 01:19:05 +06:00
InsanusMokrassar f8b8626859 make actor not async 2022-09-15 01:11:20 +06:00
InsanusMokrassar b061b85a08 Merge pull request #193 from InsanusMokrassar/0.12.13
0.12.13
2022-09-14 23:27:59 +06:00
InsanusMokrassar 3870db1c88 fix of #155 and build 2022-09-14 22:47:57 +06:00
InsanusMokrassar 1be1070eb4 fix of #160 2022-09-14 22:32:00 +06:00
InsanusMokrassar 2696e663cf add RandomQualifier 2022-09-14 22:21:30 +06:00
InsanusMokrassar 1e1f7df86d create koin module 2022-09-14 22:14:20 +06:00
InsanusMokrassar 1d8ded8fd3 start 0.12.13 2022-09-14 21:42:29 +06:00
InsanusMokrassar 197825123a Merge pull request #192 from InsanusMokrassar/0.12.12
0.12.12
2022-09-13 22:08:52 +06:00
InsanusMokrassar 422b2e6db1 improve SkeletonAnimation 2022-09-13 22:01:02 +06:00
InsanusMokrassar 1973e0b5bf SkeletonAnimation 2022-09-13 01:30:36 +06:00
InsanusMokrassar 8258cf93a9 start 0.12.12 2022-09-12 21:03:07 +06:00
InsanusMokrassar 1d49bd5947 Merge pull request #191 from InsanusMokrassar/0.12.11
0.12.11
2022-09-08 23:46:55 +06:00
InsanusMokrassar 44317d1519 start 0.12.11 and add values in key value cache repo 2022-09-08 22:38:24 +06:00
InsanusMokrassar 48e08fcc69 Merge pull request #190 from InsanusMokrassar/0.12.10
0.12.10
2022-09-07 23:54:33 +06:00
InsanusMokrassar 1a3ce6e623 hotfix 2022-09-07 23:47:13 +06:00
InsanusMokrassar fb122f3e70 0.12.10 2022-09-07 23:45:59 +06:00
InsanusMokrassar 7cca6039cc Merge pull request #189 from InsanusMokrassar/0.12.9
fix of cache filling without clearing of values
2022-09-07 22:16:50 +06:00
InsanusMokrassar 118e3dba39 fix of cache filling without clearing of values 2022-09-07 21:56:41 +06:00
InsanusMokrassar 87070710fa Merge pull request #188 from InsanusMokrassar/0.12.9
update korlibs
2022-09-07 21:14:26 +06:00
InsanusMokrassar 38499c3d4a update korlibs 2022-09-07 21:09:57 +06:00
InsanusMokrassar 5d754d968b Merge pull request #187 from InsanusMokrassar/0.12.9
0.12.9
2022-09-07 20:26:46 +06:00
InsanusMokrassar d543d436bc Fixes in key values cache 2022-09-07 20:01:13 +06:00
InsanusMokrassar 12b54f99af update gradle wrapper 2022-09-07 19:49:29 +06:00
InsanusMokrassar 2a95d7e643 start 0.12.9 2022-09-07 19:48:59 +06:00
InsanusMokrassar e3d3cacfa4 Merge pull request #186 from InsanusMokrassar/0.12.8
0.12.8
2022-09-07 00:57:17 +06:00
InsanusMokrassar 4b13491a0e Update CHANGELOG.md 2022-09-07 00:56:48 +06:00
InsanusMokrassar 85d516d1e9 Update libs.versions.toml 2022-09-06 23:44:02 +06:00
InsanusMokrassar ac58b6a7e3 bodyOrNull/respondOrNoContent 2022-09-06 21:16:41 +06:00
InsanusMokrassar 2cc6126765 start 0.12.8 2022-09-06 21:15:01 +06:00
InsanusMokrassar f94b085850 Merge pull request #185 from InsanusMokrassar/0.12.7
0.12.7
2022-09-05 18:35:56 +06:00
InsanusMokrassar c9822a491b WriteCRUDCacheRepo subscribtions and changeResultsUnchecked(Pagination) 2022-09-05 15:07:33 +06:00
InsanusMokrassar 23b2d60295 start 0.12.7 2022-09-05 14:20:58 +06:00
InsanusMokrassar f4bc9eed39 Merge pull request #184 from InsanusMokrassar/0.12.6
0.12.6
2022-08-31 04:10:33 +06:00
InsanusMokrassar e310f188b0 fixed absence of image/* in known mime types 2022-08-31 03:01:06 +06:00
InsanusMokrassar 6c1571188c start 0.12.6 2022-08-31 02:59:29 +06:00
InsanusMokrassar 945d2fa284 Merge pull request #183 from InsanusMokrassar/0.12.5
0.12.5
2022-08-30 17:38:57 +06:00
InsanusMokrassar 020095f1ff Update CHANGELOG.md 2022-08-30 17:37:59 +06:00
InsanusMokrassar b165a76e62 fixes in selectPaginated 2022-08-30 15:20:45 +06:00
InsanusMokrassar 03c8830672 start 0.12.5 2022-08-30 15:17:09 +06:00
InsanusMokrassar 38448da89b Merge pull request #182 from InsanusMokrassar/0.12.4
0.12.4
2022-08-23 13:02:19 +06:00
InsanusMokrassar 2ade5aff91 update dependencies 2022-08-23 12:57:16 +06:00
InsanusMokrassar 29bf6e80ec start 0.12.4 2022-08-23 12:55:52 +06:00
InsanusMokrassar 027e927e1b Merge pull request #181 from InsanusMokrassar/0.12.3
0.12.3
2022-08-22 01:44:17 +06:00
InsanusMokrassar fa061f88e2 refactor 2022-08-22 01:42:04 +06:00
InsanusMokrassar 1d01b65b5f fix 2022-08-22 01:26:28 +06:00
InsanusMokrassar 2c2b364167 add default unoptimized realization of selectByIds 2022-08-22 01:25:07 +06:00
InsanusMokrassar 7c5fc9bf7c selectPaginated and abstract exposed keyvalue(s) repos 2022-08-22 01:11:09 +06:00
InsanusMokrassar 193d22ff20 start 0.12.3 2022-08-22 00:02:34 +06:00
InsanusMokrassar 0f3b553ba2 Merge pull request #180 from InsanusMokrassar/0.12.2
0.12.2
2022-08-19 16:25:24 +06:00
InsanusMokrassar 4eb1013446 Update CHANGELOG.md 2022-08-19 15:54:46 +06:00
InsanusMokrassar be1b2563ec Update libs.versions.toml 2022-08-19 15:54:30 +06:00
InsanusMokrassar 1c9c2f1e70 Update libs.versions.toml 2022-08-19 02:00:29 +06:00
InsanusMokrassar 52dfded741 start 0.12.2 2022-08-19 01:59:09 +06:00
InsanusMokrassar 0a115e5cf4 Merge pull request #179 from InsanusMokrassar/0.12.1
0.12.1
2022-08-11 23:50:12 +06:00
InsanusMokrassar c349af999b Update CHANGELOG.md 2022-08-11 23:36:01 +06:00
InsanusMokrassar 9a5709a34d Update libs.versions.toml 2022-08-11 22:52:34 +06:00
InsanusMokrassar 28d311160b start 0.12.1 2022-08-11 22:47:56 +06:00
InsanusMokrassar 1ca7081a40 Merge pull request #176 from InsanusMokrassar/0.12.0
0.12.0
2022-08-04 13:55:30 +06:00
InsanusMokrassar 5ce8ebe82c Merge branch 'master' into 0.12.0 2022-08-04 13:51:12 +06:00
InsanusMokrassar a7a88b29b9 Merge pull request #178 from InsanusMokrassar/0.11.14
0.11.14
2022-08-04 13:48:18 +06:00
InsanusMokrassar cd7b982385 update android version 2022-08-04 12:50:36 +06:00
InsanusMokrassar ee59100075 fix of build 2022-08-04 12:36:23 +06:00
InsanusMokrassar f808ac58ef Delete HmacSHA256.kt 2022-08-04 11:30:15 +06:00
InsanusMokrassar f33ada5396 deprecations handling 2022-08-04 10:59:04 +06:00
InsanusMokrassar 984d781f2f fill changelog 2022-08-04 10:14:52 +06:00
InsanusMokrassar dd33e1e8bc change version of kotlin 2022-08-04 10:05:29 +06:00
InsanusMokrassar 2950de29e5 fixes 2022-08-04 09:59:05 +06:00
InsanusMokrassar 50a8799f9d update serialization 2022-08-04 09:47:29 +06:00
InsanusMokrassar bdb0ce6fc7 Update libs.versions.toml 2022-08-04 09:19:57 +06:00
InsanusMokrassar 18ec2bca96 Update libs.versions.toml 2022-08-03 10:09:38 +06:00
InsanusMokrassar 937ef48794 Update libs.versions.toml 2022-08-01 21:47:05 +06:00
InsanusMokrassar 6331f13e9a actualize changelog 2022-07-26 14:58:28 +06:00
InsanusMokrassar 5213a2ff8e add kdocs for pagination 2022-07-26 14:58:14 +06:00
InsanusMokrassar 087d7452fd encode by default pages number 2022-07-26 14:54:52 +06:00
InsanusMokrassar 703094c924 add several additional constructors for the pagination result 2022-07-26 13:56:47 +06:00
InsanusMokrassar eea645c865 PaginationResult#objectsCount 2022-07-25 13:31:15 +06:00
InsanusMokrassar 324832a189 start 0.11.14 2022-07-25 13:14:55 +06:00
InsanusMokrassar d55d735c51 Merge pull request #177 from InsanusMokrassar/0.11.13
0.11.13
2022-07-22 16:34:58 +06:00
InsanusMokrassar e3ff1b9609 fill changelog 2022-07-22 16:31:33 +06:00
InsanusMokrassar 70c31966ca Update gradle-wrapper.properties 2022-07-18 14:33:04 +06:00
InsanusMokrassar 0e4188882f Update libs.versions.toml 2022-07-18 14:08:23 +06:00
InsanusMokrassar 6bf0ce92ba Update libs.versions.toml 2022-07-18 13:51:00 +06:00
InsanusMokrassar d51bdc5086 Update gradle.properties 2022-07-18 13:48:09 +06:00
InsanusMokrassar f04f262cee Update libs.versions.toml 2022-07-18 13:16:56 +06:00
InsanusMokrassar 0f172055ef Update gradle.properties 2022-07-18 13:11:02 +06:00
InsanusMokrassar e5dd4363f1 Merge pull request #175 from InsanusMokrassar/0.11.12
0.11.12
2022-07-02 02:50:47 +06:00
InsanusMokrassar a3a48bbaac fixes in file key value repo 2022-07-02 02:28:43 +06:00
InsanusMokrassar 5e716fb9a8 start 0.11.12 2022-07-02 02:26:58 +06:00
InsanusMokrassar 11a36153cc Merge pull request #174 from InsanusMokrassar/0.11.11
0.11.11: improvements of cache repos
2022-06-30 14:03:29 +06:00
InsanusMokrassar 8bee354f04 improvements of cache repos 2022-06-30 13:59:32 +06:00
InsanusMokrassar f7dd2b5ce7 Merge pull request #173 from InsanusMokrassar/0.11.11
0.11.11
2022-06-30 13:41:43 +06:00
InsanusMokrassar 8ca10c00bb update dokka workflow 2022-06-30 13:41:12 +06:00
InsanusMokrassar 905c7e8eda deprecate hmacSha256 2022-06-30 13:19:37 +06:00
InsanusMokrassar d4c5e849bf deprecate BodyPair 2022-06-30 13:15:19 +06:00
InsanusMokrassar 8250a2a021 start 0.11.11 2022-06-30 13:14:06 +06:00
InsanusMokrassar 01b3df7b8c Update github_release.gradle 2022-06-30 10:12:54 +06:00
InsanusMokrassar daa6e4aff5 Merge pull request #172 from InsanusMokrassar/0.11.10
0.11.10
2022-06-30 02:56:14 +06:00
InsanusMokrassar 23bcb26a58 complete improvements in caches 2022-06-30 02:44:44 +06:00
InsanusMokrassar e55f60c30b rename unlimited kv cache 2022-06-30 00:22:07 +06:00
InsanusMokrassar 0d0c16e16d add full cache repos 2022-06-29 23:53:49 +06:00
InsanusMokrassar 540d5cce7c start add full repos caches 2022-06-29 19:43:58 +06:00
InsanusMokrassar a548b00979 update repos cache 2022-06-29 19:31:57 +06:00
InsanusMokrassar 4b7ca6d565 start 0.11.10 2022-06-29 19:29:38 +06:00
InsanusMokrassar 0473fa238c Merge pull request #171 from InsanusMokrassar/0.11.9
0.11.9
2022-06-29 01:56:03 +06:00
InsanusMokrassar cfc7119697 update dependencies 2022-06-28 23:06:09 +06:00
InsanusMokrassar 22a6520d3e start 0.11.9 2022-06-28 23:01:32 +06:00
InsanusMokrassar fb25e91191 start 0.12.0 2022-06-28 22:57:21 +06:00
InsanusMokrassar c116b270b6 Merge pull request #170 from InsanusMokrassar/0.11.8
0.11.8
2022-06-28 14:18:11 +06:00
InsanusMokrassar aa2d598689 fixes in FileKeyValueRepo 2022-06-28 14:13:04 +06:00
InsanusMokrassar 5ef3bb746b start 0.11.8 2022-06-28 14:12:12 +06:00
InsanusMokrassar 037616e271 Merge pull request #169 from InsanusMokrassar/0.11.7
0.11.7
2022-06-28 03:07:54 +06:00
InsanusMokrassar abbea906f1 fixes 2022-06-28 01:46:24 +06:00
InsanusMokrassar 9132e216c9 add several extensions for MapperRepo 2022-06-28 01:43:57 +06:00
InsanusMokrassar 12a7e3c4af fixes 2022-06-28 01:06:46 +06:00
InsanusMokrassar b40c093917 SimpleMapper, SimpleSuspendableMapper, mappers for CRUDRepo 2022-06-28 00:56:51 +06:00
InsanusMokrassar 7ac12455c8 add ReadCRUDRepo mappers 2022-06-28 00:19:25 +06:00
InsanusMokrassar 5043eec7a2 start 0.11.7 2022-06-27 23:35:10 +06:00
InsanusMokrassar cf31f53e01 Merge pull request #168 from InsanusMokrassar/0.11.6
0.11.6
2022-06-24 00:19:34 +06:00
InsanusMokrassar cd22d76fa7 fsms fixes 2022-06-23 18:47:59 +06:00
InsanusMokrassar c8759843f7 start 0.11.6 2022-06-23 17:19:07 +06:00
InsanusMokrassar 781bbcc012 Merge pull request #167 from InsanusMokrassar/0.11.5
0.11.5
2022-06-23 12:50:31 +06:00
InsanusMokrassar 6da29c0686 add note about 0.11.4 2022-06-23 12:49:09 +06:00
InsanusMokrassar fcdb6fc45a start and finish 0.11.5 -.- 2022-06-23 12:48:24 +06:00
InsanusMokrassar e785a99bd7 Merge pull request #166 from InsanusMokrassar/0.11.4
0.11.4
2022-06-22 22:37:30 +06:00
InsanusMokrassar 121e513fdd fixes in tempUpload of js part 2022-06-22 22:36:06 +06:00
InsanusMokrassar 9cf01ab54f improve compose list state creation 2022-06-22 16:56:51 +06:00
InsanusMokrassar c655107681 renames in compose states creation 2022-06-22 16:52:19 +06:00
InsanusMokrassar 91a5af6a9a fix of changelog 2022-06-22 16:10:58 +06:00
InsanusMokrassar 86e74c0a6f add extension toMutableListState 2022-06-22 16:09:52 +06:00
InsanusMokrassar d8f01f21a0 start 0.11.4 2022-06-22 16:09:35 +06:00
InsanusMokrassar 9fb8626d8c Rewrite crud.yml 2022-06-16 15:51:22 +06:00
InsanusMokrassar 1c52e04cdb Merge pull request #164 from InsanusMokrassar/0.11.3
0.11.3
2022-06-14 23:59:49 +06:00
InsanusMokrassar 798128256e fixes in websockets 2022-06-14 23:48:10 +06:00
InsanusMokrassar 72c2df47fd start 0.11.3 2022-06-14 19:35:17 +06:00
InsanusMokrassar c9c6d4c0c1 Merge pull request #163 from InsanusMokrassar/0.11.2
0.11.2
2022-06-13 23:21:14 +06:00
InsanusMokrassar 2f4f9f3003 fixes 2022-06-13 23:20:25 +06:00
InsanusMokrassar 22e8f8e5d6 start 0.11.2 2022-06-13 22:19:33 +06:00
InsanusMokrassar 04cf8c3d9a Merge pull request #162 from InsanusMokrassar/0.11.1
0.11.1
2022-06-12 16:32:05 +06:00
InsanusMokrassar 52198be543 fixes in tempupload 2022-06-12 14:26:41 +06:00
InsanusMokrassar 80fd5a489b add pagination type info in crud read repo client 2022-06-11 22:37:32 +06:00
InsanusMokrassar b187043ee1 fixes in kv and kvs of ktor repos 2022-06-10 22:25:16 +06:00
InsanusMokrassar 8965752055 start 0.11.1 2022-06-10 22:23:45 +06:00
InsanusMokrassar b796620267 Merge pull request #161 from InsanusMokrassar/0.11.0
0.11.0
2022-06-05 02:54:05 +06:00
InsanusMokrassar 62df81bb4e update uuid and partially fill changelog 2022-06-05 00:34:45 +06:00
InsanusMokrassar 0a8e0f6178 complete swagger templates 2022-06-04 17:12:05 +06:00
InsanusMokrassar f705020aaa fixes in packages 2022-06-04 16:55:23 +06:00
InsanusMokrassar 78bd3b9853 replaces of new API of ktor 2022-06-04 16:52:01 +06:00
InsanusMokrassar 992b283597 add kv swagger template 2022-06-04 16:47:22 +06:00
InsanusMokrassar 8fc1ff1d59 fixes and filling of cru.yml for swagger 2022-06-04 16:18:48 +06:00
InsanusMokrassar 3bbde61f39 renames in crud repos and some little refactoring 2022-06-04 15:15:17 +06:00
InsanusMokrassar 8d955c4b9d renames in kevalues repos 2022-06-04 15:00:23 +06:00
InsanusMokrassar 18593c530b renames in key value repos 2022-06-04 14:42:16 +06:00
InsanusMokrassar 78903cd4eb complete improvements in repos ktor parts 2022-06-04 00:22:36 +06:00
InsanusMokrassar eaa143f7d7 kv rework, fixes in map keyvalue repo, tests 2022-06-03 22:33:26 +06:00
InsanusMokrassar bcb0e42fa2 add new started clients for crud 2022-06-03 17:52:58 +06:00
InsanusMokrassar 8eed435302 start improvements in ktor parts 2022-06-03 12:22:51 +06:00
InsanusMokrassar 0e4a63057f start 0.11.0 2022-06-02 23:50:06 +06:00
InsanusMokrassar 1af5faa440 Merge pull request #159 from InsanusMokrassar/0.10.8
0.10.8
2022-05-29 20:06:14 +06:00
InsanusMokrassar 7412217b0c add Element.isOverflow 2022-05-29 10:22:57 +06:00
InsanusMokrassar 3e749d75b7 start 0.10.8 2022-05-29 10:19:39 +06:00
InsanusMokrassar 846b5c87c9 Merge pull request #158 from InsanusMokrassar/0.10.7
0.10.7
2022-05-28 23:59:54 +06:00
InsanusMokrassar 7b5e84f80b doForAll and getForAll not suspend 2022-05-28 22:47:06 +06:00
InsanusMokrassar 27822a8a66 start 0.10.7 2022-05-28 18:48:51 +06:00
InsanusMokrassar 36f4e7ec37 Merge pull request #157 from InsanusMokrassar/0.10.6
0.10.6
2022-05-28 09:47:10 +06:00
InsanusMokrassar 187e84ad65 fill changelog and downgrade coroutines 2022-05-28 09:45:18 +06:00
InsanusMokrassar 195fe221c4 Update libs.versions.toml 2022-05-28 00:25:59 +06:00
InsanusMokrassar 6f9c19bbf6 fixes in ResizeObserver 2022-05-27 11:39:09 +06:00
InsanusMokrassar 65bdab4f7e ResizeObserver 2022-05-27 02:37:58 +06:00
InsanusMokrassar c4d5fcfc22 start 0.10.6 2022-05-27 02:37:14 +06:00
InsanusMokrassar 43232afa62 Merge pull request #156 from InsanusMokrassar/0.10.5
0.10.5
2022-05-19 10:44:00 -04:00
InsanusMokrassar 18908a01d7 rewrite the way to use onStateHandlingErrorHandler inside of DefaultStatesMachine 2022-05-19 20:42:22 +06:00
InsanusMokrassar b22fbfb3bc StateHandlingErrorHandler 2022-05-19 20:22:34 +06:00
InsanusMokrassar 57aaea88b6 Update gradle.properties 2022-05-17 12:38:15 +06:00
InsanusMokrassar 140949c5ea Update CHANGELOG.md 2022-05-17 12:32:59 +06:00
InsanusMokrassar 639241e0d3 Update libs.versions.toml 2022-05-17 12:31:50 +06:00
InsanusMokrassar e0eb42bc2d update dexcount 2022-05-16 17:38:49 +06:00
InsanusMokrassar 7990b21cc5 add SharedPreferencesKeyValueRepo 2022-05-16 17:34:34 +06:00
InsanusMokrassar 2ba5c97709 start 0.10.5 2022-05-16 17:33:49 +06:00
InsanusMokrassar 33b7c85fc2 Merge pull request #154 from InsanusMokrassar/0.10.4
0.10.4
2022-05-12 17:24:13 +06:00
InsanusMokrassar 7f6c02ffdf update serialization 2022-05-12 17:04:53 +06:00
InsanusMokrassar f368616e6f start 0.10.4 2022-05-12 17:03:59 +06:00
InsanusMokrassar dd632f4203 Merge pull request #153 from InsanusMokrassar/0.10.3
0.10.3
2022-05-11 08:42:24 +06:00
InsanusMokrassar a8f3ae501b Update CHANGELOG.md 2022-05-11 08:34:44 +06:00
InsanusMokrassar ea76963ac2 Update libs.versions.toml 2022-05-11 08:33:55 +06:00
InsanusMokrassar 99dfa97958 Merge pull request #152 from InsanusMokrassar/0.10.3
0.10.3
2022-05-11 02:49:35 +06:00
InsanusMokrassar f68270a5b3 fixes in AccumulatorFlow 2022-05-11 02:38:48 +06:00
InsanusMokrassar 542ed81034 start 0.10.3 2022-05-11 01:18:48 +06:00
InsanusMokrassar 404a11f5e7 Merge pull request #151 from InsanusMokrassar/0.10.2
0.10.2
2022-05-10 23:44:39 +06:00
InsanusMokrassar 411221070e Update CHANGELOG.md 2022-05-10 23:44:13 +06:00
InsanusMokrassar 25d35d0c76 Update compose 2022-05-10 15:03:04 +06:00
InsanusMokrassar c72904d61c start 0.10.2 2022-05-10 15:00:56 +06:00
InsanusMokrassar b94c9acd26 Merge pull request #150 from InsanusMokrassar/0.10.1
0.10.1
2022-04-29 23:20:27 +06:00
InsanusMokrassar bdb4988569 fixes 2022-04-29 19:46:15 +06:00
InsanusMokrassar 1dafd1352a hotfix 2022-04-29 18:47:23 +06:00
InsanusMokrassar 31fbd3cad7 hmacSha256 and hex 2022-04-29 18:42:59 +06:00
InsanusMokrassar 848bc5ec10 Update gradle.properties 2022-04-28 23:45:57 +06:00
InsanusMokrassar 4d0ad826a0 Update libs.versions.toml 2022-04-28 23:32:35 +06:00
InsanusMokrassar 6955820fcc Merge pull request #149 from InsanusMokrassar/0.10.0
0.10.0
2022-04-28 20:30:52 +06:00
InsanusMokrassar ef530624b9 remove redundant pluginManagement 2022-04-28 20:30:08 +06:00
InsanusMokrassar 9b9e7dd88f fixes in websockets 2022-04-28 19:43:52 +06:00
InsanusMokrassar a13cc9e961 add error propagation for websockets when websockets has not been installed 2022-04-28 18:40:18 +06:00
InsanusMokrassar 0d2b923378 fix signature of createStandardWebsocketFlow 2022-04-28 18:16:14 +06:00
InsanusMokrassar fba84c8ac8 optimize imports in ktor server 2022-04-27 18:30:28 +06:00
InsanusMokrassar db10fe1b2c several fixes 2022-04-27 18:24:51 +06:00
InsanusMokrassar 175dd980f8 several warnings fixes 2022-04-27 15:15:03 +06:00
InsanusMokrassar 8364020671 migration onto new ktor and other dependencies 2022-04-27 14:39:21 +06:00
InsanusMokrassar eba44cd394 update dependencies 2022-04-26 13:36:55 +06:00
InsanusMokrassar b3bac8015a start 0.10.0 2022-04-26 13:35:00 +06:00
InsanusMokrassar 0b48afd251 Merge pull request #147 from InsanusMokrassar/0.9.24
0.9.24
2022-04-21 17:20:45 +06:00
InsanusMokrassar 19857930a4 small refactor in actual MPPFileInput 2022-04-21 16:45:44 +06:00
InsanusMokrassar d0dbe3ed2f MPPFile#input 2022-04-21 16:12:58 +06:00
InsanusMokrassar 8b7e78b63a start 0.9.24 2022-04-21 16:12:21 +06:00
InsanusMokrassar 92a4ecb523 Merge pull request #146 from InsanusMokrassar/0.9.23
0.9.23
2022-04-20 23:46:06 +06:00
InsanusMokrassar 6a5ad4d728 Update CHANGELOG.md 2022-04-20 23:41:59 +06:00
InsanusMokrassar be4aa8daac fixes in inheritance of interfaces 2022-04-20 23:14:06 +06:00
InsanusMokrassar b5eac37782 improvements in ExposedCRUDRepo 2022-04-20 18:41:42 +06:00
InsanusMokrassar b1ad3c5a39 start 0.9.23 2022-04-20 18:22:21 +06:00
InsanusMokrassar ba16bad029 Merge pull request #145 from InsanusMokrassar/0.9.22
0.9.22
2022-04-19 13:55:13 +06:00
InsanusMokrassar ca8ae4cd72 improve ktor server part 2022-04-19 11:16:04 +06:00
InsanusMokrassar 53d35d74b3 start 0.9.22 2022-04-19 11:14:50 +06:00
InsanusMokrassar 49c139e235 Merge pull request #144 from InsanusMokrassar/0.9.21
0.9.21
2022-04-17 08:56:59 +06:00
InsanusMokrassar caf9c821f3 fixes in AbstractExposedWriteCRUDRepo 2022-04-15 00:49:32 +06:00
InsanusMokrassar ca4c6db96f start 0.9.21 2022-04-15 00:44:28 +06:00
InsanusMokrassar 6b2298c752 Merge pull request #143 from InsanusMokrassar/0.9.20
0.9.20
2022-04-13 16:02:12 +06:00
InsanusMokrassar a1bf43def9 upfixes 2022-04-13 16:01:13 +06:00
InsanusMokrassar 15e9254e00 fixes in OneToManyAndroidRepo and adding of CursorIterator 2022-04-13 15:54:48 +06:00
InsanusMokrassar afe5a72c6f small fix of docs 2022-04-12 15:32:25 +06:00
InsanusMokrassar 750a8b9ecf start 0.9.20 2022-04-12 15:13:25 +06:00
InsanusMokrassar 27fc3f93e0 Merge pull request #142 from InsanusMokrassar/0.9.19
0.9.19
2022-04-08 01:16:13 +06:00
InsanusMokrassar 8166d4b99b Update CHANGELOG.md 2022-04-08 01:16:01 +06:00
InsanusMokrassar b61d2ae2eb fixes in versions repo 2022-04-07 15:41:08 +06:00
InsanusMokrassar 4790fe0aea get back either serializer fun 2022-04-07 09:59:58 +06:00
InsanusMokrassar bc37b11cee downgrade kotlin 2022-04-07 09:56:23 +06:00
InsanusMokrassar 223fed910f fix for column name of table version in exposed standard versions repo proxy 2022-04-07 00:43:55 +06:00
InsanusMokrassar b85ab7b061 update coroutines 2022-04-06 11:47:06 +06:00
InsanusMokrassar 888dc299c9 update kotlin 2022-04-04 10:06:57 +06:00
InsanusMokrassar e113dc28ed start 0.9.19 2022-04-04 10:05:56 +06:00
InsanusMokrassar 31e55d2307 Merge pull request #141 from InsanusMokrassar/0.9.18
0.9.18
2022-03-31 20:38:43 +06:00
InsanusMokrassar e90645f248 Element#onActionOutside 2022-03-31 14:48:15 +06:00
InsanusMokrassar 4bb7ba2571 start 0.9.18 2022-03-31 14:31:04 +06:00
InsanusMokrassar 8d31c25bf8 Merge pull request #140 from InsanusMokrassar/0.9.17
0.9.17
2022-03-27 17:47:11 +06:00
InsanusMokrassar c7ee1c28b2 fix of docs for DefaultStatesManager 2022-03-27 17:43:01 +06:00
InsanusMokrassar 99b09c8b28 add conflicts resolver for default states managers 2022-03-27 17:15:23 +06:00
InsanusMokrassar a328c4425a Update CHANGELOG.md 2022-03-27 13:57:08 +06:00
InsanusMokrassar c0f61ca896 Update libs.versions.toml 2022-03-26 19:11:44 +06:00
InsanusMokrassar 86e70c0961 js visibility of objects extensions 2022-03-26 11:01:40 +06:00
InsanusMokrassar d87a3a039f start 0.9.17 2022-03-26 10:57:50 +06:00
InsanusMokrassar 6279a2c40a Merge pull request #139 from InsanusMokrassar/0.9.16
0.9.16
2022-03-18 00:10:25 +06:00
InsanusMokrassar f377ebea88 add renderComposableAndLinkToRoot 2022-03-17 19:16:31 +06:00
InsanusMokrassar 7373fef964 add js onRemoved for nodes and different extensions for Composition 2022-03-17 14:56:14 +06:00
InsanusMokrassar 41ef86dbda start 0.9.16 2022-03-17 14:56:14 +06:00
InsanusMokrassar 7bc2b2336d Merge pull request #138 from InsanusMokrassar/0.9.15
0.9.15
2022-03-16 19:47:28 +06:00
InsanusMokrassar 0a615e6d78 cancel jobs of completed states in DefaultStatesMachine 2022-03-16 19:35:14 +06:00
InsanusMokrassar 8f928e16e1 FSM updates 2022-03-16 18:40:21 +06:00
InsanusMokrassar 72bc8da1e7 start 0.9.15 2022-03-16 17:59:29 +06:00
InsanusMokrassar 51e349a5db Merge pull request #137 from InsanusMokrassar/0.9.14
0.9.14 (upfixes)
2022-03-15 16:32:24 +06:00
InsanusMokrassar 3cbb19ba2c fixes and versions updates 2022-03-15 16:30:32 +06:00
InsanusMokrassar ae3a5bf45d Merge pull request #136 from InsanusMokrassar/0.9.14
0.9.14
2022-03-15 16:22:35 +06:00
InsanusMokrassar 9c667f4b78 several fixes in actual temporal upload of js client 2022-03-15 15:37:41 +06:00
InsanusMokrassar 21195e1bcb temporal files uploading functionality 2022-03-15 15:33:45 +06:00
InsanusMokrassar 03117ac565 start 0.9.14 2022-03-15 15:31:58 +06:00
InsanusMokrassar d13fbdf176 Merge pull request #135 from InsanusMokrassar/0.9.13
0.9.13
2022-03-13 17:14:23 +06:00
InsanusMokrassar 7cecc0e0b6 Update CHANGELOG.md 2022-03-13 14:08:01 +06:00
InsanusMokrassar 203e781f5d Update libs.versions.toml 2022-03-13 14:06:16 +06:00
InsanusMokrassar 3eb6cd77cd start 0.9.13 2022-03-13 14:05:24 +06:00
InsanusMokrassar 51855b2405 Merge pull request #134 from InsanusMokrassar/0.9.12
0.9.12
2022-03-12 01:46:23 +06:00
InsanusMokrassar 00cc26d874 fix in publication scripts 2022-03-12 01:38:13 +06:00
InsanusMokrassar 02520636ad hotfix in selectFile 2022-03-12 01:28:53 +06:00
InsanusMokrassar 76813fae8e hotfix in selectFile 2022-03-12 01:28:41 +06:00
InsanusMokrassar 4693483c2b rename selectFile with result MPPFile to selectFileOrThrow 2022-03-12 01:12:17 +06:00
InsanusMokrassar 6dbd12df59 fill changelog and rename selectOptionalFile to selectFileOrNull 2022-03-12 01:03:41 +06:00
InsanusMokrassar 9e84dc5031 add a set of tools for JS and Web Compose 2022-03-12 00:55:03 +06:00
InsanusMokrassar 8f790360bc start 0.9.12 2022-03-12 00:34:22 +06:00
InsanusMokrassar 808375cea6 Merge pull request #133 from InsanusMokrassar/0.9.11
0.9.11
2022-03-11 13:33:49 +06:00
InsanusMokrassar d9c15db9de add compose submodule and add several functions in top of composition 2022-03-10 17:47:47 +06:00
InsanusMokrassar cf2be8ed43 migration onto toml 2022-03-10 17:04:05 +06:00
InsanusMokrassar 97339c9b1d update wrapper version 2022-03-10 15:55:45 +06:00
InsanusMokrassar eb35903de9 Update CHANGELOG.md 2022-03-10 15:20:42 +06:00
InsanusMokrassar 43e88e00da Update klock 2022-03-08 10:01:53 +06:00
InsanusMokrassar 1e51f9d77b Update CHANGELOG.md 2022-03-08 10:01:02 +06:00
InsanusMokrassar dad738357c start 0.9.11 2022-03-08 10:00:19 +06:00
InsanusMokrassar cb828ab3f2 Merge pull request #132 from InsanusMokrassar/0.9.10
0.9.10
2022-03-06 16:24:51 +06:00
InsanusMokrassar aefaf4a8cc update klock (again) 2022-03-06 16:08:02 +06:00
InsanusMokrassar b29f37a251 update klock 2022-03-04 20:20:17 +06:00
InsanusMokrassar 88854020ac extend functionality of websockets 2022-03-04 20:16:59 +06:00
InsanusMokrassar 14ebe01fc6 improvements in includeWebsocketHandling 2022-03-04 15:31:32 +06:00
InsanusMokrassar 771aed0f0f UnifiedRequester#createStandardWebsocketFlow(String,DeserializationStrategy) 2022-03-04 15:20:16 +06:00
InsanusMokrassar 16c57fcd6a start 0.9.10 2022-03-04 15:17:36 +06:00
InsanusMokrassar 75397a7ccb Merge pull request #131 from InsanusMokrassar/0.9.9
0.9.9
2022-02-24 14:44:13 +06:00
InsanusMokrassar b05404f828 IntersectionObserver 2022-02-24 00:26:07 +06:00
InsanusMokrassar edea942874 small refactor of operatons in applyDiff 2022-02-23 23:02:31 +06:00
InsanusMokrassar 8a8f568b9a add applyDiff in Diff Utils and update korlibs klock version 2022-02-23 22:55:56 +06:00
InsanusMokrassar 4dc8d30c52 start 0.9.9 2022-02-23 22:32:05 +06:00
InsanusMokrassar cb4e08e823 Merge pull request #130 from InsanusMokrassar/0.9.8
0.9.8
2022-02-19 21:44:56 +06:00
InsanusMokrassar c443bf4fa0 update dependencies 2022-02-19 16:15:36 +06:00
InsanusMokrassar a6982de822 start 0.9.8 2022-02-19 16:06:45 +06:00
InsanusMokrassar 4f1a663e75 fixes in ExposedOneToManyKeyValueRepo and includeWebsocketHandling 2022-02-19 16:06:33 +06:00
InsanusMokrassar dab262d626 start 0.9.7 2022-02-19 16:06:33 +06:00
InsanusMokrassar 87a3f61ca6 fix in ExposedOneToManyKeyValueRepo 2022-02-07 20:43:43 +06:00
InsanusMokrassar 506e937a68 start 0.9.6 2022-02-07 20:39:44 +06:00
root 5a037c76dd Merge pull request #126 from InsanusMokrassar/0.9.5
0.9.5
2022-02-01 23:30:26 +06:00
root 313f622f7e Update CHANGELOG.md 2022-02-01 14:27:07 +06:00
root 6cba1fe1a2 Update klock 2022-02-01 14:25:24 +06:00
root fd2d0e80b7 start 0.9.5 2022-02-01 14:24:12 +06:00
InsanusMokrassar 96ab2e8aca Merge pull request #125 from InsanusMokrassar/0.9.4
0.9.4
2022-01-18 18:58:49 +06:00
InsanusMokrassar 0202988cae several fixes in optionallyReverse 2022-01-17 16:11:55 +06:00
InsanusMokrassar d619d59947 Either updates 2022-01-17 15:56:48 +06:00
InsanusMokrassar 85b3e48d18 add optionallyReverse extensions 2022-01-17 15:38:23 +06:00
InsanusMokrassar 7a9b7d98a1 start 0.9.4 2022-01-14 13:22:04 +06:00
InsanusMokrassar b212acfcaf Merge pull request #124 from InsanusMokrassar/0.9.3
0.9.3
2022-01-14 00:46:20 +06:00
InsanusMokrassar 3a45e5dc70 Update CHANGELOG.md 2022-01-14 00:37:03 +06:00
InsanusMokrassar 73190518d5 Update gradle.properties 2022-01-14 00:35:51 +06:00
InsanusMokrassar 03f78180dc Merge pull request #123 from InsanusMokrassar/0.9.2
0.9.2
2022-01-13 11:22:54 +06:00
InsanusMokrassar 1c0b8cf842 Update CHANGELOG.md 2022-01-13 10:20:35 +06:00
InsanusMokrassar a1624ea2a9 Update gradle.properties 2022-01-13 10:19:08 +06:00
InsanusMokrassar 23a050cf1e Merge pull request #122 from InsanusMokrassar/0.9.1
0.9.1
2022-01-08 16:12:04 +06:00
InsanusMokrassar 916f2f96f4 typealiases for exposed one to many 2022-01-08 14:35:28 +06:00
InsanusMokrassar 00cc214754 repo exposed updates 2022-01-08 14:14:44 +06:00
InsanusMokrassar b2e38f72b9 start 0.9.1 2022-01-08 14:12:57 +06:00
InsanusMokrassar e7107d238d Update dokka_push.yml 2021-12-30 02:55:19 +06:00
InsanusMokrassar ed9ebdbd1a Merge pull request #121 from InsanusMokrassar/0.9.0
0.9.0
2021-12-30 02:52:34 +06:00
InsanusMokrassar e80676d3d2 Update packages_push.yml 2021-12-29 19:43:19 +06:00
InsanusMokrassar 02d02fa8f2 update android tools build 2021-12-29 19:24:25 +06:00
InsanusMokrassar bd783fb74f update dokka 2021-12-29 17:44:45 +06:00
InsanusMokrassar 50386adf70 ignore kotlin-js-store folder 2021-12-28 21:19:47 +06:00
InsanusMokrassar f4ee6c2890 update exposed and adapt to new version of kotlin serialization 2021-12-28 21:17:17 +06:00
InsanusMokrassar d45aef9fe5 start 0.9.0 2021-12-28 09:58:59 +06:00
InsanusMokrassar a56cd3dddd Merge pull request #120 from InsanusMokrassar/0.8.9
0.8.9
2021-12-27 17:02:16 +06:00
InsanusMokrassar 419e7070ee more fixes to god of fixes 2021-12-27 17:02:00 +06:00
InsanusMokrassar 612cf40b5f small hotfix 2021-12-27 16:00:07 +06:00
InsanusMokrassar 8b39882e83 fixes in DefaultUpdatableStatesMachine 2021-12-27 15:57:55 +06:00
InsanusMokrassar e639ae172b Fixes in uniloadMultipart 2021-12-27 15:55:05 +06:00
InsanusMokrassar d0446850ae start 0.8.9 2021-12-27 15:45:44 +06:00
InsanusMokrassar c48465b90b Merge pull request #119 from InsanusMokrassar/0.8.8
0.8.8
2021-12-26 22:11:04 +06:00
InsanusMokrassar f419fd03d2 small fix of performing state update for UpdatableStatesMachine 2021-12-26 22:00:26 +06:00
InsanusMokrassar 494812a660 one more fix 2021-12-26 21:25:12 +06:00
InsanusMokrassar eb78f21eec fix FSMBuilder 2021-12-26 21:21:40 +06:00
InsanusMokrassar 4bda70268b small fix of style in DefaultUpdatableStatesMachine 2021-12-26 21:07:40 +06:00
InsanusMokrassar f037ce4371 updates in FSM 2021-12-26 21:06:26 +06:00
InsanusMokrassar 3d2196e35d update dependencies (which possible) 2021-12-26 20:07:13 +06:00
InsanusMokrassar a74f061b02 start 0.8.8 2021-12-26 20:02:18 +06:00
InsanusMokrassar 11ade14676 Merge pull request #118 from InsanusMokrassar/0.8.7
0.8.7
2021-12-15 01:22:42 +06:00
InsanusMokrassar eb562d8784 add stream using for multipart 2021-12-14 22:03:29 +06:00
InsanusMokrassar 1ee5b4bfd4 hotfix for multipart 2021-12-14 21:13:11 +06:00
InsanusMokrassar d97892080b add preview work with multipart 2021-12-14 18:01:41 +06:00
InsanusMokrassar 6f37125724 start 0.8.7 and make UnifiedRequester/UnifiedRouter fields are public 2021-12-14 13:25:58 +06:00
InsanusMokrassar ed1baaade7 Merge pull request #117 from InsanusMokrassar/0.8.6
0.8.6
2021-12-08 15:57:43 +06:00
InsanusMokrassar bb9669f8fd fill changelog 2021-12-08 11:45:01 +06:00
InsanusMokrassar bdac715d48 remove crossinline where possible 2021-12-08 11:41:49 +06:00
InsanusMokrassar acf4971298 downgrade ktor 2021-12-08 11:36:24 +06:00
InsanusMokrassar 249bc83a8c update ktor 2021-11-27 16:22:13 +06:00
InsanusMokrassar 0fbb92f03f start 0.8.6 2021-11-27 16:20:56 +06:00
InsanusMokrassar ca27cb3f82 Merge pull request #116 from InsanusMokrassar/0.8.5
0.8.5
2021-11-27 01:00:18 +06:00
InsanusMokrassar 3a5771a0cc Update RepeatOnFailure.kt 2021-11-26 23:07:00 +06:00
InsanusMokrassar 527a2a91ac repeatOnFailure 2021-11-26 19:45:59 +06:00
InsanusMokrassar 6763e5c4c6 start 0.8.5 2021-11-26 19:32:52 +06:00
InsanusMokrassar 06918d8310 add mime types generator python script 2021-11-24 14:31:24 +06:00
InsanusMokrassar 89ccaa1b57 Merge pull request #115 from InsanusMokrassar/0.8.4
0.8.4
2021-11-19 14:02:38 +06:00
InsanusMokrassar 5d0bdb9bcf fix pagination 2021-11-19 13:58:59 +06:00
InsanusMokrassar 31fdcf74a5 ktor server createKtorServer extensions 2021-11-19 13:24:45 +06:00
InsanusMokrassar afca09cc1d start 0.8.4 2021-11-19 13:18:37 +06:00
InsanusMokrassar 531d89d9db Merge pull request #114 from InsanusMokrassar/0.8.3
0.8.3
2021-11-19 09:49:35 +06:00
InsanusMokrassar 6bbbea0bc3 suppressions in Optional.kt 2021-11-18 23:03:24 +06:00
InsanusMokrassar e337cd98c8 optional workaround 2021-11-17 21:31:35 +06:00
InsanusMokrassar bcbab3b380 add Optional type 2021-11-17 17:38:41 +06:00
InsanusMokrassar fb63de7568 intersect 2021-11-17 14:22:45 +06:00
InsanusMokrassar aa45a4ab13 now Pagination is an ClosedRange 2021-11-17 14:07:11 +06:00
InsanusMokrassar 2af7e2f681 start 0.8.3 2021-11-17 14:01:44 +06:00
InsanusMokrassar 34fd9edce0 Merge pull request #113 from InsanusMokrassar/0.8.2
0.8.2
2021-11-12 13:23:39 +06:00
InsanusMokrassar 2a4cb8c5f9 improvements in FSM 2021-11-12 13:19:15 +06:00
InsanusMokrassar 50ea40bc3a add changelog for dependencies update 2021-11-12 13:14:57 +06:00
InsanusMokrassar a77654052d Update gradle.properties 2021-11-11 21:20:17 +06:00
InsanusMokrassar 88aafce552 start 0.8.2 2021-11-11 20:31:04 +06:00
InsanusMokrassar 4e95d6bfff Merge pull request #112 from InsanusMokrassar/0.8.1
0.8.1
2021-11-09 14:04:11 +06:00
InsanusMokrassar 38d0e34fb5 updates in scripts and update core ktx 2021-11-09 14:03:51 +06:00
InsanusMokrassar 8fbc6b9041 update changelog 2021-11-09 13:43:46 +06:00
InsanusMokrassar e8219d6cf4 start 0.8.1 2021-11-09 10:21:23 +06:00
InsanusMokrassar 6c20fc4ca6 Merge pull request #111 from InsanusMokrassar/0.8.0
0.8.0
2021-11-05 21:56:00 +06:00
InsanusMokrassar 85cd975492 preparations for release 2021-11-05 21:45:01 +06:00
InsanusMokrassar 1171a717fe optimize imports 2021-11-05 15:49:39 +06:00
InsanusMokrassar bbe5320312 rework of FSM + 0.8.0 2021-11-05 15:43:05 +06:00
InsanusMokrassar 00acb9fddd add suppresses to the generated classes 2021-11-03 17:22:32 +06:00
InsanusMokrassar de3d14dc41 solution of #109 2021-11-03 15:36:25 +06:00
InsanusMokrassar 67ff9cc9b3 update dependencies 2021-11-03 15:18:41 +06:00
InsanusMokrassar af132103a0 start 0.7.5 and add either serializer 2021-11-02 12:43:59 +06:00
InsanusMokrassar 3b1124a804 fixes 2021-10-30 12:17:18 +06:00
InsanusMokrassar f226c2dfd6 Merge pull request #106 from InsanusMokrassar/0.7.4
0.7.4
2021-10-29 13:57:58 +06:00
InsanusMokrassar 69d6e63846 getAllBy* 2021-10-29 13:51:59 +06:00
InsanusMokrassar 02c3d397ad solution of #104 2021-10-29 13:40:53 +06:00
InsanusMokrassar 67a1050646 solution for #105 2021-10-28 18:46:53 +06:00
InsanusMokrassar 8cd0775a6c update kdocs of Either 2021-10-28 18:42:05 +06:00
InsanusMokrassar 162294d6c6 either 2021-10-28 18:02:02 +06:00
InsanusMokrassar c4dd19dd00 start 0.7.4 2021-10-28 17:50:28 +06:00
InsanusMokrassar d2314422f1 Merge pull request #103 from InsanusMokrassar/0.7.3
0.7.3
2021-10-23 14:26:42 +06:00
InsanusMokrassar 6fedd6f859 update dependencies 2021-10-23 14:24:31 +06:00
InsanusMokrassar e52b59665f start 0.7.3 2021-10-23 14:19:30 +06:00
InsanusMokrassar cda9d09689 fixes for kdocs 2021-10-18 22:57:25 +06:00
InsanusMokrassar c9237b3f00 Merge pull request #102 from InsanusMokrassar/0.7.2
0.7.2
2021-10-16 09:51:24 +06:00
InsanusMokrassar 18bba66c4a Update CHANGELOG.md 2021-10-16 08:56:38 +06:00
InsanusMokrassar 63418c4a8a Update gradle.properties 2021-10-16 08:55:44 +06:00
InsanusMokrassar 2e66c6f4e3 Merge pull request #101 from InsanusMokrassar/0.7.1
0.7.1
2021-10-13 15:11:26 +06:00
InsanusMokrassar e9c5df4c13 upfill kdocs 2021-10-13 15:09:05 +06:00
InsanusMokrassar bc7789ad2c add kdocs 2021-10-13 15:06:58 +06:00
InsanusMokrassar e3da761249 Fill changelog 2021-10-13 14:38:50 +06:00
InsanusMokrassar 4082f65afa AccumulatorFlow 2021-10-13 13:26:39 +06:00
InsanusMokrassar 5d1cab075d Update gradle.properties 2021-10-12 21:03:47 +06:00
InsanusMokrassar bcf67f7e59 Update gradle.properties 2021-10-12 20:56:00 +06:00
InsanusMokrassar 7d3b1f8e75 StatesMachine is interface 2021-10-06 13:56:58 +06:00
InsanusMokrassar 119a0588cc DefaultStatesManager 2021-10-06 13:30:25 +06:00
InsanusMokrassar fab789d9c0 start rework of FSM states manager 2021-10-06 12:14:02 +06:00
InsanusMokrassar ceba81c08f start 0.7.1 2021-10-06 11:51:55 +06:00
InsanusMokrassar a061af0558 actualize changelog 2021-10-05 13:52:28 +06:00
InsanusMokrassar c7a53846ad Merge pull request #100 from InsanusMokrassar/0.7.0
0.7.0 + migration back to klock
2021-10-05 13:51:41 +06:00
InsanusMokrassar a683cccf0c 0.7.0 + migration back to klock 2021-10-05 13:46:23 +06:00
InsanusMokrassar 50d41e35c1 remove deprecations 2021-10-04 16:09:01 +06:00
InsanusMokrassar aa0e831cea Merge pull request #99 from InsanusMokrassar/0.6.0
0.6.0
2021-10-04 15:57:02 +06:00
InsanusMokrassar 44e26ccb4f migration onto datetime 2021-10-04 15:54:43 +06:00
InsanusMokrassar 2a783f6e2b start 0.6.0 2021-10-03 18:58:15 +06:00
InsanusMokrassar 6058d6a724 update ktor 2021-10-01 16:12:26 +06:00
InsanusMokrassar 2e9c7eb5fa Merge pull request #98 from InsanusMokrassar/0.5.31
0.5.31
2021-10-01 15:42:24 +06:00
InsanusMokrassar e75465ad10 update dependencies 2021-09-30 11:59:44 +06:00
InsanusMokrassar de01ad54e9 start 0.5.31 2021-09-30 11:57:29 +06:00
InsanusMokrassar eeea7ddbe3 Merge pull request #97 from InsanusMokrassar/0.5.30
0.5.30
2021-09-25 16:22:34 +06:00
InsanusMokrassar e0b18bec05 update dependencies 2021-09-25 14:55:56 +06:00
InsanusMokrassar 410e89bba9 start 0.5.30 2021-09-25 14:45:56 +06:00
InsanusMokrassar 9ef19dc42b Merge pull request #96 from InsanusMokrassar/0.5.29
0.5.29
2021-09-23 13:45:55 +06:00
InsanusMokrassar 0337d1b82d add fix of 31.0.0 for kdocs workflow 2021-09-23 13:23:02 +06:00
InsanusMokrassar f5bd4c5ccb update dependencies 2021-09-23 13:12:03 +06:00
InsanusMokrassar 630f9bc0d4 start 0.5.29 2021-09-23 13:10:44 +06:00
InsanusMokrassar 18b4ffece1 Update packages_push.yml 2021-09-22 20:18:14 +06:00
InsanusMokrassar f64e1effa3 Delete build.yml 2021-09-22 20:17:04 +06:00
InsanusMokrassar 847fcbb488 Merge pull request #95 from InsanusMokrassar/0.5.28
0.5.28
2021-09-19 21:59:25 +06:00
InsanusMokrassar 88002ec8e7 set java toolchain version in all projects related to Java 2021-09-19 20:50:24 +06:00
InsanusMokrassar 7f8db6a29d update dependencies 2021-09-19 20:39:15 +06:00
InsanusMokrassar b183b82443 start 0.5.28 2021-09-19 20:36:02 +06:00
InsanusMokrassar 5dad27de72 Merge pull request #94 from InsanusMokrassar/0.5.27
0.5.27
2021-09-15 21:12:34 +06:00
InsanusMokrassar 6b66084d0e update dependencies 2021-09-15 19:07:36 +06:00
InsanusMokrassar 50b56a7c39 start 0.5.27 2021-09-15 19:04:02 +06:00
InsanusMokrassar 7ab7d14471 Merge pull request #93 from InsanusMokrassar/0.5.26
0.5.26
2021-09-09 12:25:12 +06:00
InsanusMokrassar bdcc179b7b protecteds in map repos instead of privates 2021-09-09 12:16:12 +06:00
InsanusMokrassar 55ffd4b46f start 0.5.26 2021-09-09 12:07:56 +06:00
InsanusMokrassar 7fc5ee70e1 Merge pull request #92 from InsanusMokrassar/0.5.25
0.5.25
2021-09-08 12:27:31 +06:00
InsanusMokrassar a24a335743 TypedSerializer#plusAssign and TypedSerializer#minusAssign 2021-09-08 12:18:42 +06:00
InsanusMokrassar ef9af71960 clamp deprecation and Iterable#diff 2021-09-08 12:10:32 +06:00
InsanusMokrassar 925702d315 MPPFile#withoutSlashAtTheEnd 2021-09-08 12:06:23 +06:00
InsanusMokrassar d50dffec8c update dependencies 2021-09-08 12:01:02 +06:00
InsanusMokrassar cef2081a13 start 0.5.25 2021-09-08 11:57:55 +06:00
InsanusMokrassar 06c8bde7c9 Merge pull request #91 from InsanusMokrassar/0.5.24
0.5.24
2021-09-04 14:59:13 +06:00
InsanusMokrassar c9bbfa3820 update gradle config and fix build 2021-09-04 14:58:15 +06:00
InsanusMokrassar eed7cfdc42 CoroutineScope with safely handler parameter 2021-09-04 14:46:12 +06:00
InsanusMokrassar bd9b0d16ab update dependencies 2021-09-04 14:34:27 +06:00
InsanusMokrassar ea6c33b497 start 0.5.24 2021-09-04 14:20:35 +06:00
InsanusMokrassar dc80ade2fb Merge pull request #90 from InsanusMokrassar/0.5.23
0.5.23
2021-09-02 14:35:31 +06:00
InsanusMokrassar f6a06ee8ea small addition to joinTo 2021-09-02 14:33:35 +06:00
InsanusMokrassar 2644f27975 small addition to joinTo 2021-09-02 14:16:02 +06:00
InsanusMokrassar 3dc68a7b8b small addition to joinTo 2021-09-02 14:09:34 +06:00
InsanusMokrassar 97fc1d6239 small addition to joinTo 2021-09-02 14:01:01 +06:00
InsanusMokrassar 662f4d22a3 fill changelog 2021-09-02 13:52:00 +06:00
InsanusMokrassar b70aa12be9 add joinTo 2021-09-02 13:50:40 +06:00
InsanusMokrassar 71f12f5f19 Update exposed 2021-09-02 10:09:45 +06:00
InsanusMokrassar e10504eeeb Update CHANGELOG.md 2021-09-02 10:09:06 +06:00
InsanusMokrassar 2dea9f3bc0 start 0.5.23 2021-09-02 10:08:28 +06:00
InsanusMokrassar 35c9dda5bc Merge pull request #89 from InsanusMokrassar/0.5.22
0.5.22 - Update ktor
2021-08-27 08:57:57 +06:00
InsanusMokrassar e831f3949a Update CHANGELOG.md 2021-08-26 14:30:37 +06:00
InsanusMokrassar b0b39cc693 Update gradle.properties 2021-08-26 14:28:21 +06:00
InsanusMokrassar fc03be3f73 Merge pull request #88 from InsanusMokrassar/0.5.22
0.5.22
2021-08-25 16:35:02 +06:00
InsanusMokrassar b61f6b81f1 update dependencies 2021-08-25 15:50:10 +06:00
InsanusMokrassar f5bc1c1fce start 0.5.22 2021-08-25 15:10:55 +06:00
InsanusMokrassar a729f9568c Merge pull request #87 from InsanusMokrassar/0.5.21
0.5.21
2021-08-17 11:01:03 +06:00
InsanusMokrassar 5749e00377 update klock 2021-08-17 10:36:15 +06:00
InsanusMokrassar ef73c24a0c fixes in TypedSerializer 2021-08-17 10:35:45 +06:00
InsanusMokrassar 94717ee351 start 0.5.21 2021-08-17 10:30:50 +06:00
InsanusMokrassar 9a18ded65b Merge pull request #86 from InsanusMokrassar/0.5.20
0.5.20
2021-08-16 19:14:56 +06:00
InsanusMokrassar b23220f491 cursor get float and cursor get*OrNull 2021-08-16 18:42:08 +06:00
InsanusMokrassar 6e6bb03246 start 0.5.20 2021-08-16 18:35:46 +06:00
InsanusMokrassar 1ae6bae3b8 Merge pull request #85 from InsanusMokrassar/0.5.19
0.5.19#2
2021-08-09 11:24:06 +06:00
InsanusMokrassar 1239ca3256 update exposed 2021-08-09 11:23:22 +06:00
InsanusMokrassar 57b7797ea4 Merge pull request #84 from InsanusMokrassar/0.5.19
0.5.19
2021-08-08 22:52:09 +06:00
InsanusMokrassar 5ee5bfd1d5 updates in IetfLanguageCode 2021-08-08 22:09:33 +06:00
InsanusMokrassar 7229a3e198 start 0.5.19 2021-08-08 21:44:06 +06:00
InsanusMokrassar bee083582f Merge pull request #83 from InsanusMokrassar/0.5.18
0.5.18
2021-08-04 11:53:40 +06:00
InsanusMokrassar 9d7f99f286 add several functions for string to language code conversation 2021-08-04 11:51:02 +06:00
InsanusMokrassar 6ef403853c Merge pull request #82 from InsanusMokrassar/0.5.18
0.5.18
2021-08-04 11:26:06 +06:00
InsanusMokrassar 6ae7ccb9a1 add kdocs to language_codes 2021-08-04 11:14:56 +06:00
InsanusMokrassar dafc50c463 small reformat of code for language_codes 2021-08-04 11:11:43 +06:00
InsanusMokrassar e89e2c931d real creating of module language code -.- 2021-08-04 11:04:03 +06:00
InsanusMokrassar 43a67b99e4 add language_codes 2021-08-04 11:03:25 +06:00
InsanusMokrassar 46c48f4f31 start 0.5.18 2021-08-04 11:03:01 +06:00
InsanusMokrassar bf0fe85aa6 Merge pull request #81 from InsanusMokrassar/0.5.17
0.5.17
2021-07-31 16:36:17 +06:00
InsanusMokrassar 42c5bd3a7f update dependencies 2021-07-31 14:05:52 +06:00
InsanusMokrassar d170e86c8a start 0.5.17 2021-07-16 18:42:35 +06:00
InsanusMokrassar e3078169b1 Merge pull request #80 from InsanusMokrassar/0.5.16
0.5.16
2021-07-10 00:44:36 +06:00
InsanusMokrassar a33ad123f6 Update CHANGELOG.md 2021-07-10 00:36:37 +06:00
InsanusMokrassar 7e14fa2f5c Update gradle-wrapper.properties 2021-07-10 00:08:17 +06:00
InsanusMokrassar ba698b41e1 Update dependencies 2021-07-10 00:07:51 +06:00
InsanusMokrassar e76215987e start 0.5.16 2021-07-10 00:04:15 +06:00
InsanusMokrassar d1a247af8c Merge pull request #79 from InsanusMokrassar/0.5.15
0.5.15
2021-06-28 01:00:58 +06:00
InsanusMokrassar 2b7e9534f3 hotfix 2021-06-28 00:31:46 +06:00
InsanusMokrassar 38521558a1 start 0.5.15 2021-06-27 23:18:08 +06:00
InsanusMokrassar 100f3d214b Delete .travis.yml 2021-06-26 19:39:37 +06:00
InsanusMokrassar 1309867611 Init space CI 2021-06-26 13:38:30 +00:00
InsanusMokrassar 611f64f2e1 Merge pull request #78 from InsanusMokrassar/0.5.14
0.5.14
2021-06-26 00:58:02 +06:00
InsanusMokrassar f118ebce6e update kotlin 2021-06-26 00:50:09 +06:00
InsanusMokrassar 59fc90e556 add subscribeAsync 2021-06-26 00:46:51 +06:00
InsanusMokrassar fb9e4d57fb start 0.5.14 2021-06-25 17:19:28 +06:00
InsanusMokrassar 960c38b696 Merge pull request #77 from InsanusMokrassar/0.5.13
0.5.13
2021-06-23 21:29:56 +06:00
InsanusMokrassar 39895e58a6 changelog upsert 2021-06-23 21:29:28 +06:00
InsanusMokrassar b420d85be5 MPPFile 2021-06-22 13:36:23 +06:00
InsanusMokrassar 19ea2f340a replace repos common extension for fsm 2021-06-20 17:11:51 +06:00
InsanusMokrassar 11b0d059bf start add fsm 2021-06-19 14:41:29 +06:00
InsanusMokrassar c8a25ce544 start 0.5.13 2021-06-18 13:05:45 +06:00
InsanusMokrassar 509583ea2e Merge pull request #76 from InsanusMokrassar/0.5.12
0.5.12
2021-06-17 13:54:36 +06:00
InsanusMokrassar 1c86f3f4bf wrap with trycatch StateFlowBasedRecyclerViewAdapter listener 2021-06-17 13:46:22 +06:00
InsanusMokrassar 6d999be590 small improvement in StateFlowBasedRecyclerViewAdapter 2021-06-17 13:45:19 +06:00
InsanusMokrassar e715772dbf fill changes 2021-06-17 13:39:02 +06:00
InsanusMokrassar 63eb7b7ea8 start 0.5.12 2021-06-17 12:54:06 +06:00
InsanusMokrassar b07683b815 Merge pull request #75 from InsanusMokrassar/0.5.11
0.5.11
2021-06-16 13:25:56 +06:00
InsanusMokrassar 96e97d1691 ExposedOneToManyKeyValueRepo fixes 2021-06-16 13:22:40 +06:00
InsanusMokrassar 261d8827e3 OneToMany fixes 2021-06-16 13:20:05 +06:00
InsanusMokrassar c3156f2e41 strt 0.5.11 2021-06-16 13:15:25 +06:00
InsanusMokrassar 8c08801460 Merge pull request #74 from InsanusMokrassar/0.5.10
0.5.10
2021-06-15 14:38:26 +06:00
InsanusMokrassar aaf1299da7 fill changelog 2021-06-15 14:35:11 +06:00
InsanusMokrassar a411355b4f fixes 2021-06-15 14:24:00 +06:00
InsanusMokrassar eba41066b4 several small improvements in OneToManyAndroidRepo 2021-06-15 01:37:12 +06:00
InsanusMokrassar f295dff8a2 update dependencies 2021-06-14 22:10:25 +06:00
InsanusMokrassar a16815143c doForAllWithCurrentPaging and fun interface for elements in ktor server 2021-06-14 22:04:39 +06:00
InsanusMokrassar 6ff3f6ae42 start 0.5.10 2021-06-14 22:02:41 +06:00
InsanusMokrassar 84071881af Merge pull request #73 from InsanusMokrassar/0.5.9
0.5.9
2021-06-13 11:56:10 +06:00
InsanusMokrassar 7cccf7e56e upfix update 2021-06-13 11:50:48 +06:00
InsanusMokrassar 2516d5e381 update OneToManyAndroidRepo 2021-06-13 11:48:37 +06:00
InsanusMokrassar cdec8bac75 start 0.5.9 2021-06-13 11:48:00 +06:00
InsanusMokrassar fa30aae194 Merge pull request #72 from InsanusMokrassar/0.5.8
0.5.8
2021-06-11 22:36:40 +06:00
InsanusMokrassar eb959a3135 add regular build workflow 2021-06-11 22:33:08 +06:00
InsanusMokrassar 24033e0cac firstNotNull and LinkedSupervisor(Job|Scope) 2021-06-11 17:32:13 +06:00
InsanusMokrassar 71f9a505e0 start 0.5.8 2021-06-11 17:03:20 +06:00
InsanusMokrassar 979b8f017b Merge pull request #71 from InsanusMokrassar/0.5.7
0.5.7
2021-06-06 10:46:13 +06:00
InsanusMokrassar af78f01682 remove progressbar alert dialog 2021-06-06 10:43:42 +06:00
InsanusMokrassar 0b16d5c826 upfix 2021-06-06 02:10:48 +06:00
InsanusMokrassar 597e14bc7e fix of alert dialog with progress bar background 2021-06-06 02:04:21 +06:00
InsanusMokrassar 04a95867e2 fixes 2021-06-06 01:46:33 +06:00
InsanusMokrassar e0d5eb45b7 separate cache repos to read and read/write 2021-06-05 20:29:59 +06:00
InsanusMokrassar b90cab318e start 0.5.7 2021-06-05 20:12:41 +06:00
InsanusMokrassar 3252b61abe Merge pull request #70 from InsanusMokrassar/0.5.6
0.5.6
2021-06-05 15:23:40 +06:00
InsanusMokrassar 2a2da21ff3 fillup safelyWithResult 2021-06-05 15:18:48 +06:00
InsanusMokrassar 04ef371337 update safelyWithResult 2021-06-05 15:18:09 +06:00
InsanusMokrassar 623e0cd369 improve launchSynchronously 2021-06-05 15:16:07 +06:00
InsanusMokrassar 1f466747f0 update exposed 2021-06-05 15:08:22 +06:00
InsanusMokrassar 2215462f99 start 0.5.6 2021-06-05 15:07:27 +06:00
InsanusMokrassar ac4c0a2e4c Merge pull request #69 from InsanusMokrassar/0.5.5
0.5.5
2021-05-28 23:50:35 +06:00
InsanusMokrassar f7496db5ac Update CHANGELOG.md 2021-05-28 19:34:30 +06:00
InsanusMokrassar 3028fe975d Update ktor 2021-05-28 19:33:02 +06:00
InsanusMokrassar 23a5034493 start 0.5.5 2021-05-28 19:32:04 +06:00
InsanusMokrassar 65e339f811 Merge pull request #68 from InsanusMokrassar/0.5.4
0.5.4
2021-05-26 22:33:53 +06:00
InsanusMokrassar 2020e48659 fixes of deprecates 2021-05-26 22:33:08 +06:00
InsanusMokrassar 9566d6f81f upfix of android version increasing 2021-05-26 22:22:43 +06:00
InsanusMokrassar a00d734712 Merge pull request #67 from InsanusMokrassar/0.5.4
0.5.4
2021-05-26 22:07:28 +06:00
InsanusMokrassar 27a3e8706a update klock 2021-05-26 22:05:34 +06:00
InsanusMokrassar e601efcfc0 Update gradle.properties 2021-05-26 22:03:30 +06:00
InsanusMokrassar 2bfad9f885 Merge pull request #66 from InsanusMokrassar/0.5.3
0.5.3
2021-05-26 18:06:39 +06:00
InsanusMokrassar e78e984943 fillup changelog 2021-05-26 18:00:24 +06:00
InsanusMokrassar 242f4b02d0 return previous logic of work with safely 2021-05-26 17:59:45 +06:00
InsanusMokrassar 041be5a1d1 Update gradle.properties 2021-05-25 16:08:07 +06:00
InsanusMokrassar 976ce056c1 runCatching for safely and safelyWithoutExceptions 2021-05-25 00:18:46 +06:00
InsanusMokrassar 00c23c73a8 several small improvements 2021-05-24 20:26:48 +06:00
InsanusMokrassar 9dd1848337 note about safely logic 2021-05-24 12:31:32 +06:00
InsanusMokrassar 9b30efd9a2 optimize imports 2021-05-24 12:29:31 +06:00
InsanusMokrassar 5853f7cc49 coroutines updates 2021-05-24 12:27:54 +06:00
InsanusMokrassar 7b00a06f3e start 0.5.3 2021-05-23 00:03:43 +06:00
InsanusMokrassar 9ef9be0f37 Merge pull request #64 from InsanusMokrassar/0.5.2
0.5.2
2021-05-21 18:08:34 +06:00
InsanusMokrassar 13ca419473 fixes in UnifiedRequester 2021-05-21 18:04:04 +06:00
InsanusMokrassar b80f1a0773 start 0.5.2 2021-05-21 17:56:36 +06:00
InsanusMokrassar e85101c74e Merge pull request #63 from InsanusMokrassar/0.5.1
0.5.1
2021-05-20 10:23:40 +06:00
InsanusMokrassar 90668bdf63 Update CHANGELOG.md 2021-05-20 10:21:09 +06:00
InsanusMokrassar e1a00079a5 Update gradle.properties 2021-05-20 10:11:53 +06:00
InsanusMokrassar e3add4df42 Update CHANGELOG.md 2021-05-20 10:11:07 +06:00
InsanusMokrassar ced1a3bccb start 0.5.1 2021-05-20 10:10:30 +06:00
InsanusMokrassar 8d13a14343 Merge pull request #62 from InsanusMokrassar/0.5.0
0.5.0
2021-05-18 09:42:15 +06:00
InsanusMokrassar 7238e1ea8a Update CHANGELOG.md 2021-05-18 09:41:59 +06:00
InsanusMokrassar bd0423f243 Update CHANGELOG.md 2021-05-15 01:36:56 +06:00
InsanusMokrassar b0441c134c Update gradle.properties 2021-05-15 01:36:26 +06:00
InsanusMokrassar 5860901c30 recyclerview alerts public 2021-05-12 21:16:05 +06:00
InsanusMokrassar df4eaea4b9 doInDefault and doInIO 2021-05-10 19:24:21 +06:00
InsanusMokrassar e9223d5502 add doSynchronously 2021-05-10 19:20:57 +06:00
InsanusMokrassar 702c5a3e5d update coroutines 2021-05-10 13:49:27 +06:00
InsanusMokrassar ccbed95cdc update uuid and fill changelog 2021-05-06 18:18:42 +06:00
InsanusMokrassar c4e2c06cf5 remove excluding signMetadataPublication 2021-05-06 18:02:33 +06:00
InsanusMokrassar a6135738a3 fixes in build 2021-05-06 17:52:53 +06:00
InsanusMokrassar ad1ea985b8 invalid update up to kotlin 1.5.0 2021-05-06 15:58:18 +06:00
InsanusMokrassar 2058950d07 update ktor 2021-05-03 10:48:31 +06:00
InsanusMokrassar 4dc27f4489 all deprecations were removed 2021-04-29 12:28:52 +06:00
InsanusMokrassar 122daa3220 update dependencies 2021-04-28 23:58:55 +06:00
InsanusMokrassar e30928e23d start 0.5.0 2021-04-28 23:25:21 +06:00
InsanusMokrassar 30292306bb hotfix 2021-04-21 02:02:25 +06:00
InsanusMokrassar 2f9aa585f1 fix for repos in building 2021-04-21 01:52:17 +06:00
InsanusMokrassar 9e02c3e5ff rewrite launchSynchronously 2021-04-20 21:39:48 +06:00
InsanusMokrassar 7f813a519b one more update to versions 2021-04-20 20:37:23 +06:00
InsanusMokrassar b5072486b4 hotfix for versions repo in android 2021-04-20 19:38:07 +06:00
InsanusMokrassar 50c1cd8215 fix of including 2021-04-20 19:17:59 +06:00
InsanusMokrassar ed4812e6d8 Merge pull request #61 from InsanusMokrassar/0.4.36
0.4.36
2021-04-20 18:45:40 +06:00
InsanusMokrassar 59e0e751f1 all android submodules with common mpp template now incldes JVM code 2021-04-20 18:37:42 +06:00
InsanusMokrassar a5ae5e6c2b rename template files 2021-04-20 18:36:53 +06:00
InsanusMokrassar a2b87e63c9 start 0.4.36 2021-04-20 18:36:10 +06:00
InsanusMokrassar d95c283653 crutch for nodejs 2021-04-18 17:29:02 +06:00
InsanusMokrassar 6a9ae0c148 Merge pull request #60 from InsanusMokrassar/0.4.35
hotfixes
2021-04-15 14:31:28 +06:00
InsanusMokrassar 040dd517d8 hotfixes 2021-04-15 14:30:45 +06:00
InsanusMokrassar 9663c1ca64 Merge pull request #59 from InsanusMokrassar/0.4.35
0.4.35
2021-04-15 14:19:31 +06:00
InsanusMokrassar ffc2d23be7 add project typed serializer 2021-04-15 14:15:40 +06:00
InsanusMokrassar 49b009e59b update exposed 2021-04-15 13:49:53 +06:00
InsanusMokrassar 778b6a555b start 0.4.35 2021-04-15 13:48:52 +06:00
InsanusMokrassar b3730998e9 Merge pull request #58 from InsanusMokrassar/0.4.34
0.4.34
2021-04-13 12:28:25 +06:00
InsanusMokrassar 837758aebe update uuid 2021-04-13 12:22:04 +06:00
InsanusMokrassar 6ac4149aa1 fixes in crud repos 2021-04-13 12:20:24 +06:00
InsanusMokrassar 278584ae6a start 0.4.34 2021-04-13 12:10:55 +06:00
InsanusMokrassar 126f9d5f41 Merge pull request #57 from InsanusMokrassar/0.4.33
0.4.33
2021-04-05 16:30:58 +06:00
InsanusMokrassar ce15ff4e0a update ktor 2021-04-05 16:22:39 +06:00
InsanusMokrassar 382b956beb make createWeakSubScope private, upfill readme 2021-04-05 16:20:11 +06:00
InsanusMokrassar 36deab4909 weak jobs workaround 2021-04-05 16:10:36 +06:00
InsanusMokrassar 550fc59d9d start 0.4.33 2021-04-05 15:14:21 +06:00
InsanusMokrassar 9100a57458 Merge pull request #56 from InsanusMokrassar/0.4.32
0.4.32
2021-04-03 14:07:01 +06:00
InsanusMokrassar 74d9bbccd9 updates 2021-04-02 18:43:56 +06:00
InsanusMokrassar 75e602a349 update kotlin exposed 2021-04-02 18:39:56 +06:00
InsanusMokrassar e73644db10 start 0.4.32 2021-04-02 18:26:53 +06:00
InsanusMokrassar 148e6bdae7 Merge pull request #55 from InsanusMokrassar/0.4.31
0.4.31
2021-03-29 20:12:11 +06:00
534 changed files with 24269 additions and 4581 deletions

No files matched your search

@@ -1,14 +1,14 @@
name: Publish package to GitHub Packages
name: Build
on: [push]
jobs:
publishing:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: 1.8
java-version: 17
- name: Rewrite version
run: |
branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`"
@@ -18,7 +18,7 @@ jobs:
- name: Build
run: ./gradlew build
- name: Publish
run: ./gradlew --no-parallel publishAllPublicationsToGithubPackagesRepository -x signJsPublication -x signJvmPublication -x signKotlinMultiplatformPublication -x signMetadataPublication -x signAndroidDebugPublication -x signAndroidReleasePublication -x signKotlinMultiplatformPublication
continue-on-error: true
run: ./gradlew publishAllPublicationsToGiteaRepository
env:
GITHUBPACKAGES_USER: ${{ github.actor }}
GITHUBPACKAGES_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
+21
View File
@@ -0,0 +1,21 @@
name: Publish KDocs
on:
push:
branches:
- master
jobs:
publishing:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: 17
- name: Build
run: ./gradlew build && ./gradlew dokkaHtml
- name: Publish KDocs
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dokka/build/dokka/html
publish_branch: kdocs
+1
View File
@@ -11,5 +11,6 @@ out/
secret.gradle
local.properties
kotlin-js-store
publishing.sh
-27
View File
@@ -1,27 +0,0 @@
language: android
install: true
os: linux
dist: trusty
jdk: oraclejdk8
android:
components:
- tools
- platform-tools
- build-tools-30.0.2
- android-30
- add-on
- extra
before_script:
- yes | /usr/local/android-sdk/tools/bin/sdkmanager "build-tools;30.0.2"
- yes | /usr/local/android-sdk/tools/bin/sdkmanager "platforms;android-30"
jobs:
include:
- stage: build
script: ./gradlew build -s -x jvmTest -x jsIrTest -x jsIrBrowserTest -x jsIrNodeTest -x jsLegacyTest -x jsLegacyBrowserTest -x jsLegacyNodeTest
# Tests are temporarily disabled on public travis due to the problems of launching
# - state: test
# script: ./gradlew allTests
+1520
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -10,7 +10,7 @@ kotlin {
sourceSets {
androidMain {
dependencies {
api "androidx.appcompat:appcompat-resources:$appcompat_version"
api libs.android.appCompat.resources
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -1 +0,0 @@
<manifest package="dev.inmo.micro_utils.android.alerts.common"/>
@@ -0,0 +1 @@
<manifest/>
@@ -15,7 +15,7 @@ data class AlertAction(
val callback: (DialogInterface) -> Unit
)
private class ActionViewHolder(
class ActionViewHolder(
container: ViewGroup, dialogInterfaceGetter: () -> DialogInterface
) : AbstractStandardViewHolder<AlertAction>(container, android.R.layout.simple_list_item_1) {
private lateinit var action: AlertAction
@@ -34,10 +34,10 @@ private class ActionViewHolder(
}
}
private class ActionsRecyclerViewAdapter(
data: List<AlertAction>,
class ActionsRecyclerViewAdapter(
override val data: List<AlertAction>,
private val dialogInterfaceGetter: () -> DialogInterface
) : RecyclerViewAdapter<AlertAction>(data) {
) : RecyclerViewAdapter<AlertAction>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractViewHolder<AlertAction> = ActionViewHolder(
parent, dialogInterfaceGetter
)
@@ -1 +0,0 @@
<manifest package="dev.inmo.micro_utils.android.alerts.recyclerview"/>
+18
View File
@@ -0,0 +1,18 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
alias(libs.plugins.jb.compose)
}
apply from: "$mppProjectWithSerializationAndComposePresetPath"
kotlin {
sourceSets {
androidMain {
dependencies {
api project(":micro_utils.android.smalltextfield")
}
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -0,0 +1,27 @@
package dev.inmo.micro_utils.android.pickers
import androidx.compose.animation.core.*
internal suspend fun Animatable<Float, AnimationVector1D>.fling(
initialVelocity: Float,
animationSpec: DecayAnimationSpec<Float>,
adjustTarget: ((Float) -> Float)?,
block: (Animatable<Float, AnimationVector1D>.() -> Unit)? = null,
): AnimationResult<Float, AnimationVector1D> {
val targetValue = animationSpec.calculateTargetValue(value, initialVelocity)
val adjustedTarget = adjustTarget?.invoke(targetValue)
return if (adjustedTarget != null) {
animateTo(
targetValue = adjustedTarget,
initialVelocity = initialVelocity,
block = block
)
} else {
animateDecay(
initialVelocity = initialVelocity,
animationSpec = animationSpec,
block = block,
)
}
}
@@ -0,0 +1,222 @@
package dev.inmo.micro_utils.android.pickers
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.exponentialDecay
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ContentAlpha
import androidx.compose.material.IconButton
import androidx.compose.material.ProvideTextStyle
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.PointerInputScope
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.ExperimentalTextApi
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.center
import androidx.compose.ui.unit.dp
import dev.inmo.micro_utils.android.smalltextfield.SmallTextField
import kotlinx.coroutines.launch
import kotlin.math.abs
import kotlin.math.absoluteValue
import kotlin.math.roundToInt
private inline fun PointerInputScope.checkContains(offset: Offset): Boolean {
return ((size.center.x - offset.x).absoluteValue < size.width / 2) && ((size.center.y - offset.y).absoluteValue < size.height / 2)
}
// src: https://gist.github.com/vganin/a9a84653a9f48a2d669910fbd48e32d5
@OptIn(ExperimentalTextApi::class, ExperimentalComposeUiApi::class)
@Composable
fun NumberPicker(
number: Int,
modifier: Modifier = Modifier,
range: IntRange? = null,
textStyle: TextStyle = LocalTextStyle.current,
arrowsColor: Color = MaterialTheme.colorScheme.primary,
allowUseManualInput: Boolean = true,
onStateChanged: (Int) -> Unit = {},
) {
val coroutineScope = rememberCoroutineScope()
val numbersColumnHeight = 36.dp
val halvedNumbersColumnHeight = numbersColumnHeight / 2
val halvedNumbersColumnHeightPx = with(LocalDensity.current) { halvedNumbersColumnHeight.toPx() }
fun animatedStateValue(offset: Float): Int = number - (offset / halvedNumbersColumnHeightPx).toInt()
val animatedOffset = remember { Animatable(0f) }.apply {
if (range != null) {
val offsetRange = remember(number, range) {
val value = number
val first = -(range.last - value) * halvedNumbersColumnHeightPx
val last = -(range.first - value) * halvedNumbersColumnHeightPx
first..last
}
updateBounds(offsetRange.start, offsetRange.endInclusive)
}
}
val coercedAnimatedOffset = animatedOffset.value % halvedNumbersColumnHeightPx
val animatedStateValue = animatedStateValue(animatedOffset.value)
val disabledArrowsColor = arrowsColor.copy(alpha = ContentAlpha.disabled)
val inputFieldShown = if (allowUseManualInput) {
remember { mutableStateOf(false) }
} else {
null
}
Column(
modifier = modifier
.wrapContentSize()
.draggable(
orientation = Orientation.Vertical,
state = rememberDraggableState { deltaY ->
if (inputFieldShown ?.value != true) {
coroutineScope.launch {
animatedOffset.snapTo(animatedOffset.value + deltaY)
}
}
},
onDragStopped = { velocity ->
if (inputFieldShown ?.value != true) {
coroutineScope.launch {
val endValue = animatedOffset.fling(
initialVelocity = velocity,
animationSpec = exponentialDecay(frictionMultiplier = 20f),
adjustTarget = { target ->
val coercedTarget = target % halvedNumbersColumnHeightPx
val coercedAnchors =
listOf(-halvedNumbersColumnHeightPx, 0f, halvedNumbersColumnHeightPx)
val coercedPoint = coercedAnchors.minByOrNull { abs(it - coercedTarget) }!!
val base =
halvedNumbersColumnHeightPx * (target / halvedNumbersColumnHeightPx).toInt()
coercedPoint + base
}
).endState.value
onStateChanged(animatedStateValue(endValue))
animatedOffset.snapTo(0f)
}
}
}
),
horizontalAlignment = Alignment.CenterHorizontally
) {
val spacing = 4.dp
val upEnabled = range == null || range.first < number
IconButton(
{
onStateChanged(number - 1)
inputFieldShown ?.value = false
},
enabled = upEnabled
) {
Icon(Icons.Default.KeyboardArrowUp, "", tint = if (upEnabled) arrowsColor else disabledArrowsColor)
}
Spacer(modifier = Modifier.height(spacing))
Box(
modifier = Modifier
.offset { IntOffset(x = 0, y = coercedAnimatedOffset.roundToInt()) },
contentAlignment = Alignment.Center
) {
val baseLabelModifier = Modifier.align(Alignment.Center)
ProvideTextStyle(textStyle) {
Text(
text = (animatedStateValue - 1).toString(),
modifier = baseLabelModifier
.offset(y = -halvedNumbersColumnHeight)
.alpha(coercedAnimatedOffset / halvedNumbersColumnHeightPx)
)
if (inputFieldShown ?.value == true) {
val currentValue = remember { mutableStateOf(number.toString()) }
val focusRequester = remember { FocusRequester() }
SmallTextField(
currentValue.value,
{
val asDigit = it.toIntOrNull()
when {
(asDigit == null && it.isEmpty()) -> currentValue.value = (range ?.first ?: 0).toString()
(asDigit != null && (range == null || asDigit in range)) -> currentValue.value = it
else -> { /* do nothing */ }
}
},
baseLabelModifier.focusRequester(focusRequester).width(IntrinsicSize.Min).pointerInput(number) {
detectTapGestures {
if (!checkContains(it)) {
currentValue.value.toIntOrNull() ?.let(onStateChanged)
inputFieldShown.value = false
}
}
},
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number
),
keyboardActions = KeyboardActions {
currentValue.value.toIntOrNull() ?.let(onStateChanged)
inputFieldShown.value = false
},
singleLine = true,
textStyle = textStyle
)
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
} else {
Text(
text = animatedStateValue.toString(),
modifier = baseLabelModifier
.alpha(1 - abs(coercedAnimatedOffset) / halvedNumbersColumnHeightPx)
.clickable {
if (inputFieldShown ?.value == false) {
inputFieldShown.value = true
}
}
)
}
Text(
text = (animatedStateValue + 1).toString(),
modifier = baseLabelModifier
.offset(y = halvedNumbersColumnHeight)
.alpha(-coercedAnimatedOffset / halvedNumbersColumnHeightPx)
)
}
}
Spacer(modifier = Modifier.height(spacing))
val downEnabled = range == null || range.last > number
IconButton(
{
onStateChanged(number + 1)
inputFieldShown ?.value = false
},
enabled = downEnabled
) {
Icon(Icons.Default.KeyboardArrowDown, "", tint = if (downEnabled) arrowsColor else disabledArrowsColor)
}
}
}
@@ -0,0 +1,156 @@
package dev.inmo.micro_utils.android.pickers
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.exponentialDecay
import androidx.compose.foundation.gestures.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.ContentAlpha
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.ExperimentalTextApi
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
import kotlin.math.*
@OptIn(ExperimentalTextApi::class, ExperimentalComposeUiApi::class)
@Composable
fun <T> SetPicker(
current: T,
dataList: List<T>,
modifier: Modifier = Modifier,
textStyle: TextStyle = LocalTextStyle.current,
arrowsColor: Color = MaterialTheme.colorScheme.primary,
dataToString: @Composable (T) -> String = { it.toString() },
onStateChanged: (T) -> Unit = {},
) {
val coroutineScope = rememberCoroutineScope()
val numbersColumnHeight = 8.dp + with(LocalDensity.current) {
textStyle.lineHeight.toDp()
}
val numbersColumnHeightPx = with(LocalDensity.current) { numbersColumnHeight.toPx() }
val halvedNumbersColumnHeight = numbersColumnHeight / 2
val halvedNumbersColumnHeightPx = with(LocalDensity.current) { halvedNumbersColumnHeight.toPx() }
val index = dataList.indexOfFirst { it === current }.takeIf { it > -1 } ?: dataList.indexOf(current)
val lastIndex = dataList.size - 1
fun animatedStateValue(offset: Float): Int = index - (offset / halvedNumbersColumnHeightPx).toInt()
val animatedOffset = remember { Animatable(0f) }.apply {
val offsetRange = remember(index, lastIndex) {
val value = index
val first = -(lastIndex - value) * halvedNumbersColumnHeightPx
val last = value * halvedNumbersColumnHeightPx
first..last
}
updateBounds(offsetRange.start, offsetRange.endInclusive)
}
val indexAnimatedOffset = if (animatedOffset.value > 0) {
(index - floor(animatedOffset.value / halvedNumbersColumnHeightPx).toInt())
} else {
(index - ceil(animatedOffset.value / halvedNumbersColumnHeightPx).toInt())
}
val coercedAnimatedOffset = animatedOffset.value % halvedNumbersColumnHeightPx
val boxOffset = (indexAnimatedOffset * halvedNumbersColumnHeightPx) - coercedAnimatedOffset
val disabledArrowsColor = arrowsColor.copy(alpha = ContentAlpha.disabled)
val scrollState = rememberScrollState()
Column(
modifier = modifier
.wrapContentSize()
.draggable(
orientation = Orientation.Vertical,
state = rememberDraggableState { deltaY ->
coroutineScope.launch {
animatedOffset.snapTo(animatedOffset.value + deltaY)
}
},
onDragStopped = { velocity ->
coroutineScope.launch {
val endValue = animatedOffset.fling(
initialVelocity = velocity,
animationSpec = exponentialDecay(frictionMultiplier = 20f),
adjustTarget = { target ->
val coercedTarget = target % halvedNumbersColumnHeightPx
val coercedAnchors =
listOf(-halvedNumbersColumnHeightPx, 0f, halvedNumbersColumnHeightPx)
val coercedPoint = coercedAnchors.minByOrNull { abs(it - coercedTarget) }!!
val base =
halvedNumbersColumnHeightPx * (target / halvedNumbersColumnHeightPx).toInt()
coercedPoint + base
}
).endState.value
onStateChanged(dataList.elementAt(animatedStateValue(endValue)))
animatedOffset.snapTo(0f)
}
}
),
horizontalAlignment = Alignment.CenterHorizontally
) {
val spacing = 4.dp
val upEnabled = index > 0
IconButton(
{
onStateChanged(dataList.elementAt(index - 1))
},
enabled = upEnabled
) {
Icon(Icons.Default.KeyboardArrowUp, "", tint = if (upEnabled) arrowsColor else disabledArrowsColor)
}
Spacer(modifier = Modifier.height(spacing))
Box(
modifier = Modifier,
contentAlignment = Alignment.Center
) {
ProvideTextStyle(textStyle) {
dataList.forEachIndexed { i, t ->
val alpha = when {
i == indexAnimatedOffset - 1 -> coercedAnimatedOffset / halvedNumbersColumnHeightPx
i == indexAnimatedOffset -> 1 - (abs(coercedAnimatedOffset) / halvedNumbersColumnHeightPx)
i == indexAnimatedOffset + 1 -> -coercedAnimatedOffset / halvedNumbersColumnHeightPx
else -> return@forEachIndexed
}
val offset = when {
i == indexAnimatedOffset - 1 && coercedAnimatedOffset > 0 -> coercedAnimatedOffset - halvedNumbersColumnHeightPx
i == indexAnimatedOffset -> coercedAnimatedOffset
i == indexAnimatedOffset + 1 && coercedAnimatedOffset < 0 -> coercedAnimatedOffset + halvedNumbersColumnHeightPx
else -> return@forEachIndexed
}
Text(
text = dataToString(t),
modifier = Modifier
.alpha(alpha)
.offset(y = with(LocalDensity.current) { offset.toDp() })
)
}
}
}
Spacer(modifier = Modifier.height(spacing))
val downEnabled = index < lastIndex
IconButton(
{
onStateChanged(dataList.elementAt(index + 1))
},
enabled = downEnabled
) {
Icon(Icons.Default.KeyboardArrowDown, "", tint = if (downEnabled) arrowsColor else disabledArrowsColor)
}
}
}
+3 -2
View File
@@ -10,12 +10,13 @@ kotlin {
sourceSets {
commonMain {
dependencies {
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
api libs.kt.coroutines
api project(":micro_utils.common")
}
}
androidMain {
dependencies {
api "androidx.recyclerview:recyclerview:$androidx_recycler_version"
api libs.android.recyclerView
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -1,12 +1,21 @@
package dev.inmo.micro_utils.android.recyclerview
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.flow.*
abstract class RecyclerViewAdapter<T>(
val data: List<T>
): RecyclerView.Adapter<AbstractViewHolder<T>>() {
abstract class RecyclerViewAdapter<T>: RecyclerView.Adapter<AbstractViewHolder<T>>() {
protected abstract val data: List<T>
private val _dataCountState by lazy {
MutableStateFlow<Int>(data.size)
}
val dataCountState: StateFlow<Int> by lazy {
_dataCountState.asStateFlow()
}
var emptyView: View? = null
set(value) {
field = value
@@ -18,31 +27,37 @@ abstract class RecyclerViewAdapter<T>(
object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {
super.onItemRangeChanged(positionStart, itemCount)
_dataCountState.value = data.size
checkEmpty()
}
override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {
super.onItemRangeChanged(positionStart, itemCount, payload)
_dataCountState.value = data.size
checkEmpty()
}
override fun onChanged() {
super.onChanged()
_dataCountState.value = data.size
checkEmpty()
}
override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
super.onItemRangeRemoved(positionStart, itemCount)
_dataCountState.value = data.size
checkEmpty()
}
override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {
super.onItemRangeMoved(fromPosition, toPosition, itemCount)
_dataCountState.value = data.size
checkEmpty()
}
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
super.onItemRangeInserted(positionStart, itemCount)
_dataCountState.value = data.size
checkEmpty()
}
}
@@ -58,7 +73,7 @@ abstract class RecyclerViewAdapter<T>(
private fun checkEmpty() {
emptyView ?. let {
if (data.isEmpty()) {
if (dataCountState.value == 0) {
it.visibility = View.VISIBLE
} else {
it.visibility = View.GONE
@@ -66,3 +81,11 @@ abstract class RecyclerViewAdapter<T>(
}
}
}
fun <T> RecyclerViewAdapter(
data: List<T>,
onCreateViewHolder: (parent: ViewGroup, viewType: Int) -> AbstractViewHolder<T>
) = object : RecyclerViewAdapter<T>() {
override val data: List<T> = data
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractViewHolder<T> = onCreateViewHolder(parent, viewType)
}
@@ -0,0 +1,50 @@
package dev.inmo.micro_utils.android.recyclerview
import dev.inmo.micro_utils.common.Diff
import dev.inmo.micro_utils.common.PreviewFeature
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
@PreviewFeature("This feature in preview state and may contains different bugs. " +
"Besides, this feature can be changed in future in non-compatible way")
abstract class StateFlowBasedRecyclerViewAdapter<T>(
listeningScope: CoroutineScope,
dataState: StateFlow<List<T>>
) : RecyclerViewAdapter<T>() {
override var data: List<T> = emptyList()
init {
dataState.onEach {
try {
val diffForRemoves = Diff(data, it)
val removedIndexes = diffForRemoves.removed.map { it.index }
val leftRemove = removedIndexes.toMutableList()
data = data.filterIndexed { i, _ ->
if (i in leftRemove) {
leftRemove.remove(i)
true
} else {
false
}
}
withContext(Dispatchers.Main) {
removedIndexes.sortedDescending().forEach {
notifyItemRemoved(it)
}
}
val diffAddsAndReplaces = Diff(data, it)
data = it
withContext(Dispatchers.Main) {
diffAddsAndReplaces.replaced.forEach { (from, to) ->
notifyItemMoved(from.index, to.index)
}
diffAddsAndReplaces.added.forEach {
notifyItemInserted(it.index)
}
}
} catch (e: Throwable) {
// currently do nothing
}
}.launchIn(listeningScope)
}
}
@@ -1 +0,0 @@
<manifest package="dev.inmo.micro_utils.android.recyclerview"/>
+18
View File
@@ -0,0 +1,18 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
alias(libs.plugins.jb.compose)
}
apply from: "$mppProjectWithSerializationAndComposePresetPath"
kotlin {
sourceSets {
androidMain {
dependencies {
api libs.android.compose.material3
}
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -0,0 +1,66 @@
package dev.inmo.micro_utils.android.smalltextfield
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.LocalTextSelectionColors
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.VisualTransformation
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SmallTextField(
value: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
readOnly: Boolean = false,
textStyle: TextStyle = LocalTextStyle.current,
textColor: Color = textStyle.color.takeOrElse {
LocalContentColor.current
},
visualTransformation: VisualTransformation = VisualTransformation.None,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions.Default,
singleLine: Boolean = false,
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
minLines: Int = 1,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
BasicTextField(
value = value,
modifier = modifier,
onValueChange = onValueChange,
enabled = enabled,
readOnly = readOnly,
textStyle = textStyle.copy(
color = textColor
),
visualTransformation = visualTransformation,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
interactionSource = interactionSource,
singleLine = singleLine,
maxLines = maxLines,
minLines = minLines,
cursorBrush = SolidColor(
textStyle.color.takeOrElse {
LocalContentColor.current
}
)
)
}
+23 -9
View File
@@ -1,6 +1,5 @@
buildscript {
repositories {
jcenter()
google()
mavenCentral()
mavenLocal()
@@ -8,24 +7,39 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:$dexcount_version"
classpath "com.github.breadmoirai:github-release:$github_release_plugin_version"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
classpath libs.buildscript.kt.gradle
classpath libs.buildscript.kt.serialization
classpath libs.buildscript.kt.ksp
classpath libs.buildscript.jb.dokka
classpath libs.buildscript.gh.release
classpath libs.buildscript.android.gradle
classpath libs.buildscript.android.dexcount
}
}
plugins {
alias(libs.plugins.versions)
}
allprojects {
repositories {
mavenLocal()
jcenter()
mavenCentral()
google()
maven { url "https://kotlin.bintray.com/kotlinx" }
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" }
}
// temporal crutch until legacy tests will be stabled or legacy target will be removed
if (it != rootProject.findProject("docs")) {
tasks.whenTaskAdded { task ->
if(task.name == "jsLegacyBrowserTest" || task.name == "jsLegacyNodeTest") {
task.enabled = false
}
}
}
}
apply from: "./extensions.gradle"
apply from: "./github_release.gradle"
apply from: "./versions_plugin_setup.gradle"
+34 -1
View File
@@ -4,4 +4,37 @@ plugins {
id "com.android.library"
}
apply from: "$mppProjectWithSerializationPresetPath"
apply from: "$mppJvmJsAndroidLinuxMingwLinuxArm64ProjectPresetPath"
kotlin {
sourceSets {
jvmMain {
dependencies {
api project(":micro_utils.coroutines")
}
}
androidMain {
dependencies {
api project(":micro_utils.coroutines")
api libs.android.fragment
}
dependsOn jvmMain
}
linuxX64Main {
dependencies {
api libs.okio
}
}
mingwX64Main {
dependencies {
api libs.okio
}
}
linuxArm64Main {
dependencies {
api libs.okio
}
}
}
}
+18
View File
@@ -0,0 +1,18 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
alias(libs.plugins.jb.compose)
}
apply from: "$mppProjectWithSerializationAndComposePresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api project(":micro_utils.common")
}
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -0,0 +1,16 @@
package dev.inmo.micro_utils.common.compose
import androidx.compose.runtime.DisposableEffectResult
class DefaultDisposableEffectResult(
private val onDispose: () -> Unit
) : DisposableEffectResult {
override fun dispose() {
onDispose()
}
companion object {
val DoNothing = DefaultDisposableEffectResult {}
}
}
@@ -0,0 +1,10 @@
package dev.inmo.micro_utils.common.compose
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf
/**
* Converts current [MutableState] to immutable [State] using [derivedStateOf]
*/
fun <T> MutableState<T>.asState(): State<T> = derivedStateOf { this.value }
@@ -0,0 +1,9 @@
package dev.inmo.micro_utils.common.compose
import androidx.compose.runtime.Composition
import dev.inmo.micro_utils.common.onRemoved
import org.w3c.dom.Element
fun Composition.linkWithElement(element: Element) {
element.onRemoved { dispose() }
}
@@ -0,0 +1,10 @@
package dev.inmo.micro_utils.common.compose
import org.jetbrains.compose.web.attributes.ATarget
fun openLink(link: String, mode: ATarget = ATarget.Blank, features: String = "") = dev.inmo.micro_utils.common.openLink(
link,
mode.targetStr,
features
)
@@ -0,0 +1,13 @@
package dev.inmo.micro_utils.common.compose
import androidx.compose.runtime.*
import org.jetbrains.compose.web.dom.DOMScope
import org.w3c.dom.Element
fun <TElement : Element> renderComposableAndLinkToRoot(
root: TElement,
monotonicFrameClock: MonotonicFrameClock = DefaultMonotonicFrameClock,
content: @Composable DOMScope<TElement>.() -> Unit
): Composition = org.jetbrains.compose.web.renderComposable(root, monotonicFrameClock, content).apply {
linkWithElement(root)
}
@@ -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()
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -0,0 +1,76 @@
package dev.inmo.micro_utils.common
import android.os.Bundle
import android.os.Parcelable
import androidx.fragment.app.Fragment
import java.io.Serializable
import kotlin.reflect.KProperty
object ArgumentPropertyNullableDelegate {
operator fun <T: Any> getValue(thisRef: Fragment, property: KProperty<*>): T? {
val arguments = thisRef.arguments ?: return null
val key = property.name
return when (property.getter.returnType.classifier) {
// Scalars
String::class -> arguments.getString(key)
Boolean::class -> arguments.getBoolean(key)
Byte::class -> arguments.getByte(key)
Char::class -> arguments.getChar(key)
Double::class -> arguments.getDouble(key)
Float::class -> arguments.getFloat(key)
Int::class -> arguments.getInt(key)
Long::class -> arguments.getLong(key)
Short::class -> arguments.getShort(key)
// References
Bundle::class -> arguments.getBundle(key)
CharSequence::class -> arguments.getCharSequence(key)
Parcelable::class -> arguments.getParcelable(key)
// Scalar arrays
BooleanArray::class -> arguments.getBooleanArray(key)
ByteArray::class -> arguments.getByteArray(key)
CharArray::class -> arguments.getCharArray(key)
DoubleArray::class -> arguments.getDoubleArray(key)
FloatArray::class -> arguments.getFloatArray(key)
IntArray::class -> arguments.getIntArray(key)
LongArray::class -> arguments.getLongArray(key)
ShortArray::class -> arguments.getShortArray(key)
Array::class -> {
val componentType = property.returnType.classifier ?.javaClass ?.componentType!!
@Suppress("UNCHECKED_CAST") // Checked by reflection.
when {
Parcelable::class.java.isAssignableFrom(componentType) -> {
arguments.getParcelableArray(key)
}
String::class.java.isAssignableFrom(componentType) -> {
arguments.getStringArray(key)
}
CharSequence::class.java.isAssignableFrom(componentType) -> {
arguments.getCharSequenceArray(key)
}
Serializable::class.java.isAssignableFrom(componentType) -> {
arguments.getSerializable(key)
}
else -> {
val valueType = componentType.canonicalName
throw IllegalArgumentException(
"Illegal value array type $valueType for key \"$key\""
)
}
}
}
Serializable::class -> arguments.getSerializable(key)
else -> null
} as? T
}
}
object ArgumentPropertyNonNullableDelegate {
operator fun <T: Any> getValue(thisRef: Fragment, property: KProperty<*>): T {
return ArgumentPropertyNullableDelegate.getValue<T>(thisRef, property)!!
}
}
fun argumentOrNull() = ArgumentPropertyNullableDelegate
fun argumentOrThrow() = ArgumentPropertyNonNullableDelegate
@@ -0,0 +1,61 @@
package dev.inmo.micro_utils.common
import android.app.Activity
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import androidx.fragment.app.Fragment
fun findViewsByTag(viewGroup: ViewGroup, tag: Any?): List<View> {
return viewGroup.children.flatMap {
findViewsByTag(it, tag)
}.toList()
}
fun findViewsByTag(viewGroup: ViewGroup, key: Int, tag: Any?): List<View> {
return viewGroup.children.flatMap {
findViewsByTag(it, key, tag)
}.toList()
}
fun findViewsByTag(view: View, tag: Any?): List<View> {
val result = mutableListOf<View>()
if (view.tag == tag) {
result.add(view)
}
if (view is ViewGroup) {
result.addAll(findViewsByTag(view, tag))
}
return result.toList()
}
fun findViewsByTag(view: View, key: Int, tag: Any?): List<View> {
val result = mutableListOf<View>()
if (view.getTag(key) == tag) {
result.add(view)
}
if (view is ViewGroup) {
result.addAll(findViewsByTag(view, key, tag))
}
return result.toList()
}
fun Activity.findViewsByTag(tag: Any?) = rootView ?.let {
findViewsByTag(it, tag)
}
fun Activity.findViewsByTag(key: Int, tag: Any?) = rootView ?.let {
findViewsByTag(it, key, tag)
}
fun Fragment.findViewsByTag(tag: Any?) = view ?.let {
findViewsByTag(it, tag)
}
fun Fragment.findViewsByTag(key: Int, tag: Any?) = view ?.let {
findViewsByTag(it, key, tag)
}
fun Fragment.findViewsByTagInActivity(tag: Any?) = activity ?.findViewsByTag(tag)
fun Fragment.findViewsByTagInActivity(key: Int, tag: Any?) = activity ?.findViewsByTag(key, tag)
@@ -0,0 +1,7 @@
package dev.inmo.micro_utils.common
import android.app.Activity
import android.view.View
val Activity.rootView: View?
get() = findViewById<View?>(android.R.id.content) ?.rootView ?: window.decorView.findViewById<View?>(android.R.id.content) ?.rootView
@@ -33,3 +33,15 @@ fun View.toggleVisibility(goneOnHide: Boolean = true) {
show()
}
}
fun View.changeVisibility(show: Boolean = !isShown, goneOnHide: Boolean = true) {
if (show) {
show()
} else {
if (goneOnHide) {
gone()
} else {
hide()
}
}
}
@@ -1,3 +1,5 @@
@file:Suppress("OPT_IN_IS_NOT_ENABLED")
package dev.inmo.micro_utils.common
@RequiresOptIn(
@@ -12,11 +14,9 @@ package dev.inmo.micro_utils.common
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE,
AnnotationTarget.TYPEALIAS,
AnnotationTarget.TYPE_PARAMETER
AnnotationTarget.TYPEALIAS
)
annotation class PreviewFeature
annotation class PreviewFeature(val message: String = "It is possible, that behaviour of this thing will be changed or removed in future releases")
@RequiresOptIn(
"This thing is marked as warned. See message of warn to get more info",
@@ -30,8 +30,6 @@ annotation class PreviewFeature
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE,
AnnotationTarget.TYPEALIAS,
AnnotationTarget.TYPE_PARAMETER
AnnotationTarget.TYPEALIAS
)
annotation class Warning(val message: String)
@@ -1,89 +0,0 @@
package dev.inmo.micro_utils.common
import kotlin.experimental.and
private const val BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
private const val BASE64_MASK: Byte = 0x3f
private const val BASE64_PAD = '='
private val BASE64_INVERSE_ALPHABET = IntArray(256) {
BASE64_ALPHABET.indexOf(it.toChar())
}
internal fun Int.toBase64(): Char = BASE64_ALPHABET[this]
internal fun Byte.fromBase64(): Byte = BASE64_INVERSE_ALPHABET[toInt() and 0xff].toByte() and BASE64_MASK
const val replacedInCrypto = "Replaced in crypto subproject"
@Deprecated(replacedInCrypto, ReplaceWith("EncodedBase64String", "dev.inmo.micro_utils.crypto"))
typealias EncodedBase64String = String
@Deprecated(replacedInCrypto, ReplaceWith("EncodedByteArray", "dev.inmo.micro_utils.crypto"))
typealias EncodedByteArray = ByteArray
@Deprecated(replacedInCrypto, ReplaceWith("encodeBase64String()", "dev.inmo.micro_utils.crypto"))
fun String.encodeBase64String(): EncodedBase64String = encodeToByteArray().encodeBase64String()
@Deprecated(replacedInCrypto, ReplaceWith("encodeBase64()", "dev.inmo.micro_utils.crypto"))
fun String.encodeBase64(): EncodedByteArray = encodeToByteArray().encodeBase64()
@Deprecated(replacedInCrypto, ReplaceWith("encodeBase64String()", "dev.inmo.micro_utils.crypto"))
fun ByteArray.encodeBase64String(): EncodedBase64String = buildString {
var i = 0
while (this@encodeBase64String.size > i) {
val read = kotlin.math.min(3, this@encodeBase64String.size - i)
val data = ByteArray(3) {
if (it < read) {
this@encodeBase64String[it + i]
} else {
0
}
}
val padSize = (data.size - read) * 8 / 6
val chunk = ((data[0].toInt() and 0xFF) shl 16) or
((data[1].toInt() and 0xFF) shl 8) or
(data[2].toInt() and 0xFF)
for (index in data.size downTo padSize) {
val char = (chunk shr (6 * index)) and BASE64_MASK.toInt()
append(char.toBase64())
}
repeat(padSize) { append(BASE64_PAD) }
i += read
}
}
@Deprecated(replacedInCrypto, ReplaceWith("encodeBase64()", "dev.inmo.micro_utils.crypto"))
fun ByteArray.encodeBase64(): EncodedByteArray = encodeBase64String().encodeToByteArray()
@Deprecated(replacedInCrypto, ReplaceWith("decodeBase64()", "dev.inmo.micro_utils.crypto"))
fun EncodedBase64String.decodeBase64() = dropLastWhile { it == BASE64_PAD }.encodeToByteArray().decodeBase64()
@Deprecated(replacedInCrypto, ReplaceWith("decodeBase64String()", "dev.inmo.micro_utils.crypto"))
fun EncodedBase64String.decodeBase64String() = decodeBase64().decodeToString()
@Deprecated(replacedInCrypto, ReplaceWith("decodeBase64()", "dev.inmo.micro_utils.crypto"))
fun EncodedByteArray.decodeBase64(): ByteArray {
val result = mutableListOf<Byte>()
val data = ByteArray(4)
(0 until size step 4).forEach { i ->
var read = 0
for (j in 0 until 4) {
if (j + i < size) {
data[j] = get(j + i)
read++
} else {
break
}
}
val chunk = data.foldIndexed(0) { index, result, current ->
result or (current.fromBase64().toInt() shl ((3 - index) * 6))
}
for (index in data.size - 2 downTo (data.size - read)) {
val origin = (chunk shr (8 * index)) and 0xff
result.add(origin.toByte())
}
}
return result.toByteArray()
}
@Deprecated(replacedInCrypto, ReplaceWith("decodeBase64String()", "dev.inmo.micro_utils.crypto"))
fun EncodedByteArray.decodeBase64String() = decodeBase64().decodeToString()
@@ -1,10 +0,0 @@
package dev.inmo.micro_utils.common
@Suppress("NOTHING_TO_INLINE")
inline fun <T : Comparable<T>> T.clamp(min: T, max: T): T {
return when {
this < min -> min
this > max -> max
else -> this
}
}
@@ -2,6 +2,8 @@
package dev.inmo.micro_utils.common
import kotlinx.serialization.Serializable
private inline fun <T> getObject(
additional: MutableList<T>,
iterator: Iterator<T>
@@ -14,35 +16,49 @@ private inline fun <T> getObject(
/**
* Diff object which contains information about differences between two [Iterable]s
*
* See tests for more info
*
* @param removed The objects which has been presented in the old collection but absent in new one. Index here is the index in the old collection
* @param added The object which appear in new collection only. Indexes here show the index in the new collection
* @param replaced Pair of old-new changes. First object has been presented in the old collection on its
* [IndexedValue.index] place, the second one is the object in new collection. Both have indexes due to the fact that in
* case when some value has been replaced after adds or removes in original collection the object index will be changed
*
* @see calculateDiff
*/
@Serializable
data class Diff<T> internal constructor(
val removed: List<IndexedValue<T>>,
val removed: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>,
/**
* Old-New values pairs
*/
val replaced: List<Pair<IndexedValue<T>, IndexedValue<T>>>,
val added: List<IndexedValue<T>>
)
val replaced: List<Pair<@Serializable(IndexedValueSerializer::class) IndexedValue<T>, @Serializable(IndexedValueSerializer::class) IndexedValue<T>>>,
val added: List<@Serializable(IndexedValueSerializer::class) IndexedValue<T>>
) {
fun isEmpty(): Boolean = removed.isEmpty() && replaced.isEmpty() && added.isEmpty()
}
fun <T> emptyDiff(): Diff<T> = Diff(emptyList(), emptyList(), emptyList())
private inline fun <T> performChanges(
potentialChanges: MutableList<Pair<IndexedValue<T>?, IndexedValue<T>?>>,
additionalsInOld: MutableList<T>,
additionalsInNew: MutableList<T>,
additionsInOld: MutableList<T>,
additionsInNew: MutableList<T>,
changedList: MutableList<Pair<IndexedValue<T>, IndexedValue<T>>>,
removedList: MutableList<IndexedValue<T>>,
addedList: MutableList<IndexedValue<T>>,
strictComparison: Boolean
comparisonFun: (T?, T?) -> Boolean
) {
var i = -1
val (oldObject, newObject) = potentialChanges.lastOrNull() ?: return
for ((old, new) in potentialChanges.take(potentialChanges.size - 1)) {
i++
val oldOneEqualToNewObject = old ?.value === newObject ?.value || (old ?.value == newObject ?.value && !strictComparison)
val newOneEqualToOldObject = new ?.value === oldObject ?.value || (new ?.value == oldObject ?.value && !strictComparison)
val oldOneEqualToNewObject = comparisonFun(old ?.value, newObject ?.value)
val newOneEqualToOldObject = comparisonFun(new ?.value, oldObject ?.value)
if (oldOneEqualToNewObject || newOneEqualToOldObject) {
changedList.addAll(
potentialChanges.take(i).mapNotNull {
@Suppress("UNCHECKED_CAST")
if (it.first != null && it.second != null) it as Pair<IndexedValue<T>, IndexedValue<T>> else null
}
)
@@ -52,20 +68,20 @@ private inline fun <T> performChanges(
newPotentials.first().second ?.let { addedList.add(it) }
newPotentials.drop(1).take(newPotentials.size - 2).forEach { (oldOne, newOne) ->
addedList.add(newOne!!)
oldOne ?.let { additionalsInOld.add(oldOne.value) }
oldOne ?.let { additionsInOld.add(oldOne.value) }
}
if (newPotentials.size > 1) {
newPotentials.last().first ?.value ?.let { additionalsInOld.add(it) }
newPotentials.last().first ?.value ?.let { additionsInOld.add(it) }
}
}
newOneEqualToOldObject -> {
newPotentials.first().first ?.let { removedList.add(it) }
newPotentials.drop(1).take(newPotentials.size - 2).forEach { (oldOne, newOne) ->
removedList.add(oldOne!!)
newOne ?.let { additionalsInNew.add(newOne.value) }
newOne ?.let { additionsInNew.add(newOne.value) }
}
if (newPotentials.size > 1) {
newPotentials.last().second ?.value ?.let { additionalsInNew.add(it) }
newPotentials.last().second ?.value ?.let { additionsInNew.add(it) }
}
}
}
@@ -92,7 +108,7 @@ private inline fun <T> performChanges(
*/
fun <T> Iterable<T>.calculateDiff(
other: Iterable<T>,
strictComparison: Boolean = false
comparisonFun: (T?, T?) -> Boolean
): Diff<T> {
var i = -1
var j = -1
@@ -120,27 +136,60 @@ fun <T> Iterable<T>.calculateDiff(
}
when {
oldObject === newObject || (oldObject == newObject && !strictComparison) -> {
changedObjects.addAll(potentiallyChangedObjects.map { it as Pair<IndexedValue<T>, IndexedValue<T>> })
comparisonFun(oldObject, newObject) -> {
changedObjects.addAll(potentiallyChangedObjects.map {
@Suppress("UNCHECKED_CAST")
it as Pair<IndexedValue<T>, IndexedValue<T>>
})
potentiallyChangedObjects.clear()
}
else -> {
potentiallyChangedObjects.add(oldObject ?.let { IndexedValue(i, oldObject) } to newObject ?.let { IndexedValue(j, newObject) })
val previousOldsAdditionsSize = additionalInOld.size
val previousNewsAdditionsSize = additionalInNew.size
performChanges(potentiallyChangedObjects, additionalInOld, additionalInNew, changedObjects, removedObjects, addedObjects, strictComparison)
performChanges(potentiallyChangedObjects, additionalInOld, additionalInNew, changedObjects, removedObjects, addedObjects, comparisonFun)
i -= (additionalInOld.size - previousOldsAdditionsSize)
j -= (additionalInNew.size - previousNewsAdditionsSize)
}
}
}
potentiallyChangedObjects.add(null to null)
performChanges(potentiallyChangedObjects, additionalInOld, additionalInNew, changedObjects, removedObjects, addedObjects, strictComparison)
performChanges(potentiallyChangedObjects, additionalInOld, additionalInNew, changedObjects, removedObjects, addedObjects, comparisonFun)
return Diff(removedObjects.toList(), changedObjects.toList(), addedObjects.toList())
}
inline fun <T> Diff(old: Iterable<T>, new: Iterable<T>) = old.calculateDiff(new)
/**
* Calculating [Diff] object
*
* @param strictComparison If this parameter set to true, objects which are not equal by links will be used as different
* objects. For example, in case of two "Example" string they will be equal by value, but CAN be different by links
*/
fun <T> Iterable<T>.calculateDiff(
other: Iterable<T>,
strictComparison: Boolean = false
): Diff<T> = calculateDiff(
other,
comparisonFun = if (strictComparison) {
{ t1, t2 ->
t1 === t2
}
} else {
{ t1, t2 ->
t1 === t2 || t1 == t2 // small optimization for cases when t1 and t2 are the same - comparison will be faster potentially
}
}
)
inline fun <T> Iterable<T>.diff(
other: Iterable<T>,
strictComparison: Boolean = false
): Diff<T> = calculateDiff(other, strictComparison)
inline fun <T> Iterable<T>.diff(
other: Iterable<T>,
noinline comparisonFun: (T?, T?) -> Boolean
): Diff<T> = calculateDiff(other, comparisonFun)
inline fun <T> Diff(old: Iterable<T>, new: Iterable<T>) = old.calculateDiff(new, strictComparison = false)
inline fun <T> StrictDiff(old: Iterable<T>, new: Iterable<T>) = old.calculateDiff(new, true)
/**
@@ -149,3 +198,52 @@ inline fun <T> StrictDiff(old: Iterable<T>, new: Iterable<T>) = old.calculateDif
inline fun <T> Iterable<T>.calculateStrictDiff(
other: Iterable<T>
) = calculateDiff(other, strictComparison = true)
/**
* Applies [diff] to [this] [MutableList]
*/
fun <T> MutableList<T>.applyDiff(
diff: Diff<T>
) {
for (i in diff.removed.indices.sortedDescending()) {
removeAt(diff.removed[i].index)
}
diff.added.forEach { (i, t) ->
add(i, t)
}
diff.replaced.forEach { (_, new) ->
set(new.index, new.value)
}
}
/**
* This method call [calculateDiff] with strict mode [strictComparison] and then apply differences to [this]
* mutable list
*/
fun <T> MutableList<T>.applyDiff(
source: Iterable<T>,
strictComparison: Boolean = false
): Diff<T> = calculateDiff(source, strictComparison).also {
applyDiff(it)
}
/**
* This method call [calculateDiff] and then apply differences to [this]
* mutable list
*/
fun <T> MutableList<T>.applyDiff(
source: Iterable<T>,
comparisonFun: (T?, T?) -> Boolean
): Diff<T> = calculateDiff(source, comparisonFun).also {
applyDiff(it)
}
/**
* Reverse [this] [Diff]. Result will contain [Diff.added] on [Diff.removed] (and vice-verse), all the
* [Diff.replaced] values will be reversed too
*/
fun <T> Diff<T>.reversed() = Diff(
removed = added,
replaced = replaced.map { it.second to it.first },
added = removed
)
@@ -0,0 +1,160 @@
@file:Suppress("unused", "NOTHING_TO_INLINE")
package dev.inmo.micro_utils.common
import kotlinx.serialization.*
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
/**
* Realization of this interface will contains at least one not null - [optionalT1] or [optionalT2]
*
* @see EitherFirst
* @see EitherSecond
* @see Either.Companion.first
* @see Either.Companion.second
* @see Either.onFirst
* @see Either.onSecond
* @see Either.mapOnFirst
* @see Either.mapOnSecond
*/
@Serializable(EitherSerializer::class)
sealed interface Either<T1, T2> {
val optionalT1: Optional<T1>
val optionalT2: Optional<T2>
val t1OrNull: T1?
get() = optionalT1.dataOrNull()
val t2OrNull: T2?
get() = optionalT2.dataOrNull()
}
class EitherSerializer<T1, T2>(
t1Serializer: KSerializer<T1>,
t2Serializer: KSerializer<T2>,
) : KSerializer<Either<T1, T2>> {
@OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class)
override val descriptor: SerialDescriptor = buildSerialDescriptor(
"TypedSerializer",
SerialKind.CONTEXTUAL
) {
element("type", String.serializer().descriptor)
element("value", ContextualSerializer(Either::class).descriptor)
}
private val t1EitherSerializer = EitherFirst.serializer(t1Serializer, t2Serializer)
private val t2EitherSerializer = EitherSecond.serializer(t1Serializer, t2Serializer)
override fun deserialize(decoder: Decoder): Either<T1, T2> {
return decoder.decodeStructure(descriptor) {
var type: String? = null
lateinit var result: Either<T1, T2>
while (true) {
when (val index = decodeElementIndex(descriptor)) {
0 -> type = decodeStringElement(descriptor, 0)
1 -> {
result = when (type) {
"t1" -> decodeSerializableElement(
descriptor,
1,
t1EitherSerializer
)
"t2" -> decodeSerializableElement(
descriptor,
1,
t2EitherSerializer
)
else -> error("Unknown type of either: $type")
}
}
CompositeDecoder.DECODE_DONE -> break
else -> error("Unexpected index: $index")
}
}
result
}
}
override fun serialize(encoder: Encoder, value: Either<T1, T2>) {
encoder.encodeStructure(descriptor) {
when (value) {
is EitherFirst -> {
encodeStringElement(descriptor, 0, "t1")
encodeSerializableElement(descriptor, 1, t1EitherSerializer, value)
}
is EitherSecond -> {
encodeStringElement(descriptor, 0, "t2")
encodeSerializableElement(descriptor, 1, t2EitherSerializer, value)
}
}
}
}
}
/**
* This type [Either] will always have not nullable [optionalT1]
*/
@Serializable
data class EitherFirst<T1, T2>(
val t1: T1
) : Either<T1, T2> {
override val optionalT1: Optional<T1> = t1.optional
override val optionalT2: Optional<T2> = Optional.absent()
}
/**
* This type [Either] will always have not nullable [optionalT2]
*/
@Serializable
data class EitherSecond<T1, T2>(
val t2: T2
) : Either<T1, T2> {
override val optionalT1: Optional<T1> = Optional.absent()
override val optionalT2: Optional<T2> = t2.optional
}
/**
* @return New instance of [EitherFirst]
*/
inline fun <T1, T2> Either.Companion.first(t1: T1): Either<T1, T2> = EitherFirst(t1)
/**
* @return New instance of [EitherSecond]
*/
inline fun <T1, T2> Either.Companion.second(t2: T2): Either<T1, T2> = EitherSecond(t2)
/**
* Will call [block] in case when [this] is [EitherFirst]
*/
inline fun <T1, T2, E : Either<T1, T2>> E.onFirst(block: (T1) -> Unit): E {
optionalT1.onPresented(block)
return this
}
/**
* Will call [block] in case when [this] is [EitherSecond]
*/
inline fun <T1, T2, E : Either<T1, T2>> E.onSecond(block: (T2) -> Unit): E {
optionalT2.onPresented(block)
return this
}
/**
* @return Result of [block] if [this] is [EitherFirst]
*/
inline fun <T1, R> Either<T1, *>.mapOnFirst(block: (T1) -> R): R? {
return optionalT1.mapOnPresented(block)
}
/**
* @return Result of [block] if [this] is [EitherSecond]
*/
inline fun <T2, R> Either<*, T2>.mapOnSecond(block: (T2) -> R): R? {
return optionalT2.mapOnPresented(block)
}
inline fun <reified T1, reified T2> Any.either() = when (this) {
is T1 -> Either.first<T1, T2>(this)
is T2 -> Either.second<T1, T2>(this)
else -> error("Incorrect type of either argument $this")
}
@@ -0,0 +1,43 @@
package dev.inmo.micro_utils.common
inline fun <T> Boolean.letIfTrue(block: () -> T): T? {
return if (this) {
block()
} else {
null
}
}
inline fun <T> Boolean.letIfFalse(block: () -> T): T? {
return if (this) {
null
} else {
block()
}
}
inline fun Boolean.alsoIfTrue(block: () -> Unit): Boolean {
letIfTrue(block)
return this
}
inline fun Boolean.alsoIfFalse(block: () -> Unit): Boolean {
letIfFalse(block)
return this
}
inline fun <T> Boolean.ifTrue(block: () -> T): T? {
return if (this) {
block()
} else {
null
}
}
inline fun <T> Boolean.ifFalse(block: () -> T): T? {
return if (this) {
null
} else {
block()
}
}
@@ -0,0 +1,30 @@
package dev.inmo.micro_utils.common
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializer
import kotlinx.serialization.builtins.PairSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
class IndexedValueSerializer<T>(private val subSerializer: KSerializer<T>) : KSerializer<IndexedValue<T>> {
private val originalSerializer = PairSerializer(Int.serializer(), subSerializer)
override val descriptor: SerialDescriptor
get() = originalSerializer.descriptor
override fun deserialize(decoder: Decoder): IndexedValue<T> {
val pair = originalSerializer.deserialize(decoder)
return IndexedValue(
pair.first,
pair.second
)
}
override fun serialize(encoder: Encoder, value: IndexedValue<T>) {
originalSerializer.serialize(
encoder,
Pair(value.index, value.value)
)
}
}
@@ -7,9 +7,17 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
typealias ByteArrayAllocator = () -> ByteArray
typealias SuspendByteArrayAllocator = suspend () -> ByteArray
val ByteArray.asAllocator: ByteArrayAllocator
get() = { this }
val ByteArray.asSuspendAllocator: SuspendByteArrayAllocator
get() = { this }
val ByteArrayAllocator.asSuspendAllocator: SuspendByteArrayAllocator
get() = { this() }
suspend fun SuspendByteArrayAllocator.asAllocator(): ByteArrayAllocator {
return invoke().asAllocator
}
object ByteArrayAllocatorSerializer : KSerializer<ByteArrayAllocator> {
private val realSerializer = ByteArraySerializer()
@@ -17,7 +25,7 @@ object ByteArrayAllocatorSerializer : KSerializer<ByteArrayAllocator> {
override fun deserialize(decoder: Decoder): ByteArrayAllocator {
val bytes = realSerializer.deserialize(decoder)
return { bytes }
return bytes.asAllocator
}
override fun serialize(encoder: Encoder, value: ByteArrayAllocator) {
@@ -0,0 +1,3 @@
package dev.inmo.micro_utils.common
fun <T> Iterable<T?>.firstNotNull() = first { it != null }!!
@@ -0,0 +1,59 @@
package dev.inmo.micro_utils.common
inline fun <I, R> Iterable<I>.joinTo(
separatorFun: (I) -> R?,
prefix: R? = null,
postfix: R? = null,
transform: (I) -> R?
): List<R> {
val result = mutableListOf<R>()
val iterator = iterator()
prefix ?.let(result::add)
while (iterator.hasNext()) {
val element = iterator.next()
result.add(transform(element) ?: continue)
if (iterator.hasNext()) {
result.add(separatorFun(element) ?: continue)
}
}
postfix ?.let(result::add)
return result
}
inline fun <I, R> Iterable<I>.joinTo(
separator: R? = null,
prefix: R? = null,
postfix: R? = null,
transform: (I) -> R?
): List<R> = joinTo({ separator }, prefix, postfix, transform)
inline fun <I> Iterable<I>.joinTo(
separatorFun: (I) -> I?,
prefix: I? = null,
postfix: I? = null
): List<I> = joinTo<I, I>(separatorFun, prefix, postfix) { it }
inline fun <I> Iterable<I>.joinTo(
separator: I? = null,
prefix: I? = null,
postfix: I? = null
): List<I> = joinTo<I>({ separator }, prefix, postfix)
inline fun <I, reified R> Array<I>.joinTo(
separatorFun: (I) -> R?,
prefix: R? = null,
postfix: R? = null,
transform: (I) -> R?
): Array<R> = asIterable().joinTo(separatorFun, prefix, postfix, transform).toTypedArray()
inline fun <I, reified R> Array<I>.joinTo(
separator: R? = null,
prefix: R? = null,
postfix: R? = null,
transform: (I) -> R?
): Array<R> = asIterable().joinTo(separator, prefix, postfix, transform).toTypedArray()
@@ -0,0 +1,34 @@
package dev.inmo.micro_utils.common
import kotlinx.serialization.Serializable
import kotlin.jvm.JvmInline
@Serializable
@JvmInline
value class FileName(val string: String) {
val name: String
get() = withoutSlashAtTheEnd.takeLastWhile { it != '/' }
val extension: String
get() = name.takeLastWhile { it != '.' }
val nameWithoutExtension: String
get() {
val filename = name
return filename.indexOfLast { it == '.' }.takeIf { it > -1 } ?.let {
filename.substring(0, it)
} ?: filename
}
val withoutSlashAtTheEnd: String
get() = string.dropLastWhile { it == '/' }
override fun toString(): String = string
}
expect class MPPFile
expect val MPPFile.filename: FileName
expect val MPPFile.filesize: Long
expect val MPPFile.bytesAllocatorSync: ByteArrayAllocator
expect val MPPFile.bytesAllocator: SuspendByteArrayAllocator
fun MPPFile.bytesSync() = bytesAllocatorSync()
suspend fun MPPFile.bytes() = bytesAllocator()
@@ -0,0 +1,135 @@
package dev.inmo.micro_utils.common
/**
* Contains diff based on the comparison of objects with the same [K].
*
* @param removed Contains map with keys removed from parent map
* @param changed Contains map with keys values changed new map in comparison with old one
* @param added Contains map with new keys and values
*/
data class MapDiff<K, V> @Warning(warning) constructor(
val removed: Map<K, V>,
val changed: Map<K, Pair<V, V>>,
val added: Map<K, V>
) {
fun isEmpty() = removed.isEmpty() && changed.isEmpty() && added.isEmpty()
inline fun isNotEmpty() = !isEmpty()
companion object {
private const val warning = "This feature can be changed without any warranties. Use with caution and only in case you know what you are doing"
fun <K, V> empty() = MapDiff<K, V>(emptyMap(), emptyMap(), emptyMap())
}
}
private inline fun <K, V> createCompareFun(
strictComparison: Boolean
): (K, V, V) -> Boolean = if (strictComparison) {
{ _, first, second -> first === second }
} else {
{ _, first, second -> first == second }
}
/**
* Compare [this] [Map] with the [other] one in principle when [other] is newer than [this]
*
* @param compareFun Will be used to determine changed values
*/
fun <K, V> Map<K, V>.diff(
other: Map<K, V>,
compareFun: (K, V, V) -> Boolean
): MapDiff<K, V> {
val removed: Map<K, V> = (keys - other.keys).associateWith {
getValue(it)
}
val added: Map<K, V> = (other.keys - keys).associateWith {
other.getValue(it)
}
val changed = keys.intersect(other.keys).mapNotNull {
val old = getValue(it)
val new = other.getValue(it)
if (compareFun(it, old, new)) {
return@mapNotNull null
} else {
it to (old to new)
}
}.toMap()
return MapDiff(
removed,
changed,
added
)
}
/**
* Compare [this] [Map] with the [other] one in principle when [other] is newer than [this]
*
* @param strictComparison If true, will use strict (===) comparison for the values' comparison. Otherwise, standard
* `equals` will be used
*/
fun <K, V> Map<K, V>.diff(
other: Map<K, V>,
strictComparison: Boolean = false
): MapDiff<K, V> = diff(
other,
compareFun = createCompareFun(strictComparison)
)
/**
* Will apply [mapDiff] to [this] [MutableMap]
*/
fun <K, V> MutableMap<K, V>.applyDiff(
mapDiff: MapDiff<K, V>
) {
mapDiff.apply {
removed.keys.forEach { remove(it) }
changed.forEach { (k, oldNew) ->
put(k, oldNew.second)
}
added.forEach { (k, new) ->
put(k, new)
}
}
}
/**
* Will apply changes with [from] map into [this] one
*
* @param compareFun Will be used to determine changed values
*
* @return [MapDiff] applied to [this] [MutableMap]
*/
fun <K, V> MutableMap<K, V>.applyDiff(
from: Map<K, V>,
compareFun: (K, V, V) -> Boolean
): MapDiff<K, V> {
return diff(from, compareFun).also {
applyDiff(it)
}
}
/**
* Will apply changes with [from] map into [this] one
*
* @param strictComparison If true, will use strict (===) comparison for the values' comparison. Otherwise, standard
* `equals` will be used
*
* @return [MapDiff] applied to [this] [MutableMap]
*/
fun <K, V> MutableMap<K, V>.applyDiff(
from: Map<K, V>,
strictComparison: Boolean = false
): MapDiff<K, V> = applyDiff(
from,
compareFun = createCompareFun(strictComparison)
)
/**
* Reverse [this] [MapDiff]. Result will contain [MapDiff.added] on [MapDiff.removed] (and vice-verse), all the
* [MapDiff.changed] values will be reversed too
*/
fun <K, V> MapDiff<K, V>.reversed(): MapDiff<K, V> = MapDiff(
removed = added,
changed = changed.mapValues { (_, oldNew) -> oldNew.second to oldNew.first },
added = removed
)
@@ -0,0 +1,53 @@
package dev.inmo.micro_utils.common
import kotlin.jvm.JvmName
interface SimpleMapper<T1, T2> {
fun convertToT1(from: T2): T1
fun convertToT2(from: T1): T2
}
@JvmName("convertFromT2")
fun <T1, T2> SimpleMapper<T1, T2>.convert(from: T2) = convertToT1(from)
@JvmName("convertFromT1")
fun <T1, T2> SimpleMapper<T1, T2>.convert(from: T1) = convertToT2(from)
class SimpleMapperImpl<T1, T2>(
private val t1: (T2) -> T1,
private val t2: (T1) -> T2,
) : SimpleMapper<T1, T2> {
override fun convertToT1(from: T2): T1 = t1.invoke(from)
override fun convertToT2(from: T1): T2 = t2.invoke(from)
}
@Suppress("NOTHING_TO_INLINE")
inline fun <T1, T2> simpleMapper(
noinline t1: (T2) -> T1,
noinline t2: (T1) -> T2,
) = SimpleMapperImpl(t1, t2)
interface SimpleSuspendableMapper<T1, T2> {
suspend fun convertToT1(from: T2): T1
suspend fun convertToT2(from: T1): T2
}
@JvmName("convertFromT2")
suspend fun <T1, T2> SimpleSuspendableMapper<T1, T2>.convert(from: T2) = convertToT1(from)
@JvmName("convertFromT1")
suspend fun <T1, T2> SimpleSuspendableMapper<T1, T2>.convert(from: T1) = convertToT2(from)
class SimpleSuspendableMapperImpl<T1, T2>(
private val t1: suspend (T2) -> T1,
private val t2: suspend (T1) -> T2,
) : SimpleSuspendableMapper<T1, T2> {
override suspend fun convertToT1(from: T2): T1 = t1.invoke(from)
override suspend fun convertToT2(from: T1): T2 = t2.invoke(from)
}
@Suppress("NOTHING_TO_INLINE")
inline fun <T1, T2> simpleSuspendableMapper(
noinline t1: suspend (T2) -> T1,
noinline t2: suspend (T1) -> T2,
) = SimpleSuspendableMapperImpl(t1, t2)
@@ -0,0 +1,97 @@
@file:Suppress("unused")
package dev.inmo.micro_utils.common
import kotlinx.serialization.Serializable
/**
* This type represents [T] as not only potentially nullable data, but also as a data which can not be presented. This
* type will be useful in cases when [T] is nullable and null as valuable data too in time of data absence should be
* presented by some third type.
*
* Let's imagine, you have nullable name in some database. In case when name is not nullable everything is clear - null
* will represent absence of row in the database. In case when name is nullable null will be a little bit dual-meaning,
* cause this null will say nothing about availability of the row (of course, it is exaggerated example)
*
* @see Optional.presented
* @see Optional.absent
* @see Optional.optional
* @see Optional.onPresented
* @see Optional.onAbsent
*/
@Serializable
data class Optional<T> internal constructor(
@Warning("It is unsafe to use this data directly")
val data: T?,
@Warning("It is unsafe to use this data directly")
val dataPresented: Boolean
) {
companion object {
/**
* Will create [Optional] with presented data
*/
fun <T> presented(data: T) = Optional(data, true)
/**
* Will create [Optional] without data
*/
fun <T> absent() = Optional<T>(null, false)
}
}
inline val <T> T.optional
get() = Optional.presented(this)
inline val <T : Any> T?.optionalOrAbsentIfNull
get() = if (this == null) {
Optional.absent<T>()
} else {
Optional.presented(this)
}
/**
* Will call [block] when data presented ([Optional.dataPresented] == true)
*/
inline fun <T> Optional<T>.onPresented(block: (T) -> Unit): Optional<T> = apply {
@OptIn(Warning::class)
if (dataPresented) { @Suppress("UNCHECKED_CAST") block(data as T) }
}
/**
* Will call [block] when data presented ([Optional.dataPresented] == true)
*/
inline fun <T, R> Optional<T>.mapOnPresented(block: (T) -> R): R? = run {
@OptIn(Warning::class)
if (dataPresented) { @Suppress("UNCHECKED_CAST") block(data as T) } else null
}
/**
* Will call [block] when data absent ([Optional.dataPresented] == false)
*/
inline fun <T> Optional<T>.onAbsent(block: () -> Unit): Optional<T> = apply {
@OptIn(Warning::class)
if (!dataPresented) { block() }
}
/**
* Will call [block] when data presented ([Optional.dataPresented] == true)
*/
inline fun <T, R> Optional<T>.mapOnAbsent(block: () -> R): R? = run {
@OptIn(Warning::class)
if (!dataPresented) { block() } else null
}
/**
* Returns [Optional.data] if [Optional.dataPresented] of [this] is true, or null otherwise
*/
fun <T> Optional<T>.dataOrNull() = @OptIn(Warning::class) if (dataPresented) @Suppress("UNCHECKED_CAST") (data as T) else null
/**
* Returns [Optional.data] if [Optional.dataPresented] of [this] is true, or throw [throwable] otherwise
*/
fun <T> Optional<T>.dataOrThrow(throwable: Throwable) = @OptIn(Warning::class) if (dataPresented) @Suppress("UNCHECKED_CAST") (data as T) else throw throwable
/**
* Returns [Optional.data] if [Optional.dataPresented] of [this] is true, or call [block] and returns the result of it
*/
inline fun <T> Optional<T>.dataOrElse(block: () -> T) = @OptIn(Warning::class) if (dataPresented) @Suppress("UNCHECKED_CAST") (data as T) else block()
@@ -0,0 +1,28 @@
package dev.inmo.micro_utils.common
/**
* Convert [this] [Long] to [Int] with bounds of [Int.MIN_VALUE] and [Int.MAX_VALUE]
*/
fun Long.toCoercedInt(): Int = coerceIn(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong()).toInt()
/**
* Convert [this] [Long] to [Short] with bounds of [Short.MIN_VALUE] and [Short.MAX_VALUE]
*/
fun Long.toCoercedShort(): Short = coerceIn(Short.MIN_VALUE.toLong(), Short.MAX_VALUE.toLong()).toShort()
/**
* Convert [this] [Long] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
*/
fun Long.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toLong(), Byte.MAX_VALUE.toLong()).toByte()
/**
* Convert [this] [Int] to [Short] with bounds of [Short.MIN_VALUE] and [Short.MAX_VALUE]
*/
fun Int.toCoercedShort(): Short = coerceIn(Short.MIN_VALUE.toInt(), Short.MAX_VALUE.toInt()).toShort()
/**
* Convert [this] [Int] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
*/
fun Int.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toInt(), Byte.MAX_VALUE.toInt()).toByte()
/**
* Convert [this] [Short] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
*/
fun Short.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toShort(), Byte.MAX_VALUE.toShort()).toByte()
@@ -0,0 +1,37 @@
package dev.inmo.micro_utils.common
import kotlinx.serialization.Serializable
import kotlin.jvm.JvmInline
@Serializable
@JvmInline
value class Progress private constructor(
val of1: Double
) {
val of1Float
get() = of1.toFloat()
val of100
get() = of1 * 100
val of100Float
get() = of100.toFloat()
val of100Int
get() = of100.toInt()
init {
require(of1 in rangeOfValues) {
"Progress main value should be in $rangeOfValues, but incoming value is $of1"
}
}
companion object {
val rangeOfValues = 0.0 .. 1.0
val START = Progress(rangeOfValues.start)
val COMPLETED = Progress(rangeOfValues.endInclusive)
operator fun invoke(of1: Double) = Progress(of1.coerceIn(rangeOfValues))
operator fun invoke(part: Number, total: Number) = Progress(
part.toDouble() / total.toDouble()
)
}
}
@@ -0,0 +1,80 @@
@file:Suppress(
"RemoveRedundantCallsOfConversionMethods",
"RedundantVisibilityModifier",
)
package dev.inmo.micro_utils.common
import kotlin.Byte
import kotlin.Double
import kotlin.Float
import kotlin.Int
import kotlin.Long
import kotlin.Short
import kotlin.Suppress
public operator fun Progress.plus(other: Progress): Progress = Progress(of1 + other.of1)
public operator fun Progress.minus(other: Progress): Progress = Progress(of1 - other.of1)
public operator fun Progress.plus(i: Byte): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Byte): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Byte): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Byte): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Byte): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.plus(i: Short): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Short): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Short): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Short): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Short): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.plus(i: Int): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Int): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Int): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Int): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Int): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.plus(i: Long): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Long): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Long): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Long): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Long): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.plus(i: Float): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Float): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Float): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Float): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Float): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.plus(i: Double): Progress = Progress((of1 + i).toDouble())
public operator fun Progress.minus(i: Double): Progress = Progress((of1 - i).toDouble())
public operator fun Progress.times(i: Double): Progress = Progress((of1 * i).toDouble())
public operator fun Progress.div(i: Double): Progress = Progress((of1 / i).toDouble())
public operator fun Progress.rem(i: Double): Progress = Progress((of1 % i).toDouble())
public operator fun Progress.compareTo(other: Progress): Int = (of1 - other.of1).toInt()
@@ -0,0 +1,19 @@
package dev.inmo.micro_utils.common
fun <T : Comparable<T>> ClosedRange<T>.intersect(other: ClosedRange<T>): Pair<T, T>? = when {
start == other.start && endInclusive == other.endInclusive -> start to endInclusive
start > other.endInclusive || other.start > endInclusive -> null
else -> maxOf(start, other.start) to minOf(endInclusive, other.endInclusive)
}
fun IntRange.intersect(
other: IntRange
): IntRange? = (this as ClosedRange<Int>).intersect(other as ClosedRange<Int>) ?.let {
it.first .. it.second
}
fun LongRange.intersect(
other: LongRange
): LongRange? = (this as ClosedRange<Long>).intersect(other as ClosedRange<Long>) ?.let {
it.first .. it.second
}
@@ -0,0 +1,54 @@
package dev.inmo.micro_utils.common
/**
* Executes the given [action] until getting of successful result specified number of [times].
*
* A zero-based index of current iteration is passed as a parameter to [action].
*/
inline fun <R> repeatOnFailure(
onFailure: (Throwable) -> Boolean,
action: () -> R
): Result<R> {
do {
runCatching {
action()
}.onFailure {
if (!onFailure(it)) {
return Result.failure(it)
}
}.onSuccess {
return Result.success(it)
}
} while (true)
}
/**
* Executes the given [action] until getting of successful result specified number of [times].
*
* A zero-based index of current iteration is passed as a parameter to [action].
*/
inline fun <R> repeatOnFailure(
times: Int,
onEachFailure: (Throwable) -> Unit = {},
action: (Int) -> R
): Optional<R> {
var i = 0
val result = repeatOnFailure(
{
onEachFailure(it)
if (i < times) {
i++
true
} else {
false
}
}
) {
action(i)
}
return if (result.isSuccess) {
Optional.presented(result.getOrThrow())
} else {
Optional.absent()
}
}
@@ -0,0 +1,6 @@
package dev.inmo.micro_utils.common
val FixedSignsRange = 0 .. 100
expect fun Float.fixed(signs: Int): Float
expect fun Double.fixed(signs: Int): Double
@@ -1,33 +0,0 @@
package dev.inmo.micro_utils.common
import kotlin.random.Random
import kotlin.test.Test
import kotlin.test.assertEquals
class Base64Text {
val testText = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"""
val base64Text = """TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgpTZWQgdXQgcGVyc3BpY2lhdGlzIHVuZGUgb21uaXMgaXN0ZSBuYXR1cyBlcnJvciBzaXQgdm9sdXB0YXRlbSBhY2N1c2FudGl1bSBkb2xvcmVtcXVlIGxhdWRhbnRpdW0sIHRvdGFtIHJlbSBhcGVyaWFtLCBlYXF1ZSBpcHNhIHF1YWUgYWIgaWxsbyBpbnZlbnRvcmUgdmVyaXRhdGlzIGV0IHF1YXNpIGFyY2hpdGVjdG8gYmVhdGFlIHZpdGFlIGRpY3RhIHN1bnQgZXhwbGljYWJvLiBOZW1vIGVuaW0gaXBzYW0gdm9sdXB0YXRlbSBxdWlhIHZvbHVwdGFzIHNpdCBhc3Blcm5hdHVyIGF1dCBvZGl0IGF1dCBmdWdpdCwgc2VkIHF1aWEgY29uc2VxdXVudHVyIG1hZ25pIGRvbG9yZXMgZW9zIHF1aSByYXRpb25lIHZvbHVwdGF0ZW0gc2VxdWkgbmVzY2l1bnQuIE5lcXVlIHBvcnJvIHF1aXNxdWFtIGVzdCwgcXVpIGRvbG9yZW0gaXBzdW0gcXVpYSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIsIGFkaXBpc2NpIHZlbGl0LCBzZWQgcXVpYSBub24gbnVtcXVhbSBlaXVzIG1vZGkgdGVtcG9yYSBpbmNpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hbSBhbGlxdWFtIHF1YWVyYXQgdm9sdXB0YXRlbS4gVXQgZW5pbSBhZCBtaW5pbWEgdmVuaWFtLCBxdWlzIG5vc3RydW0gZXhlcmNpdGF0aW9uZW0gdWxsYW0gY29ycG9yaXMgc3VzY2lwaXQgbGFib3Jpb3NhbSwgbmlzaSB1dCBhbGlxdWlkIGV4IGVhIGNvbW1vZGkgY29uc2VxdWF0dXI/IFF1aXMgYXV0ZW0gdmVsIGV1bSBpdXJlIHJlcHJlaGVuZGVyaXQgcXVpIGluIGVhIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIHF1YW0gbmloaWwgbW9sZXN0aWFlIGNvbnNlcXVhdHVyLCB2ZWwgaWxsdW0gcXVpIGRvbG9yZW0gZXVtIGZ1Z2lhdCBxdW8gdm9sdXB0YXMgbnVsbGEgcGFyaWF0dXI/"""
@Test
fun decodeEncode() {
val encoded = testText.encodeBase64String()
assertEquals(base64Text, encoded)
val decoded = encoded.decodeBase64String()
assertEquals(testText, decoded)
}
val urlTestText = "https://example.com?isitexample=1"
val urlTestBase64Text = "aHR0cHM6Ly9leGFtcGxlLmNvbT9pc2l0ZXhhbXBsZT0x"
@Test
fun decodeEncodeUrl() {
val encoded = urlTestText.encodeBase64String()
assertEquals(urlTestBase64Text, encoded)
val decoded = encoded.decodeBase64String()
assertEquals(urlTestText, decoded)
}
}
@@ -11,7 +11,7 @@ class DiffUtilsTests {
val withIndex = oldList.withIndex()
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
for ((i, v) in withIndex) {
for ((i, _) in withIndex) {
if (i + count > oldList.lastIndex) {
continue
}
@@ -32,7 +32,7 @@ class DiffUtilsTests {
val withIndex = oldList.withIndex()
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
for ((i, v) in withIndex) {
for ((i, _) in withIndex) {
if (i + count > oldList.lastIndex) {
continue
}
@@ -54,8 +54,8 @@ class DiffUtilsTests {
val oldList = (0 until 10).map { it.toString() }
val withIndex = oldList.withIndex()
for (step in 0 until oldList.size) {
for ((i, v) in withIndex) {
for (step in oldList.indices) {
for ((i, _) in withIndex) {
val mutable = oldList.toMutableList()
val changes = (
if (step == 0) i until oldList.size else (i until oldList.size step step)
@@ -73,4 +73,83 @@ class DiffUtilsTests {
}
}
}
@Test
fun testThatSimpleRemoveApplyWorks() {
val oldList = (0 until 10).toList()
val withIndex = oldList.withIndex()
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
for ((i, _) in withIndex) {
if (i + count > oldList.lastIndex) {
continue
}
val removedSublist = oldList.subList(i, i + count)
val mutableOldList = oldList.toMutableList()
val targetList = oldList - removedSublist
mutableOldList.applyDiff(targetList)
assertEquals(
targetList,
mutableOldList
)
}
}
}
@Test
fun testThatSimpleAddApplyWorks() {
val oldList = (0 until 10).map { it.toString() }
val withIndex = oldList.withIndex()
for (count in 1 .. (floor(oldList.size.toFloat() / 2).toInt())) {
for ((i, _) in withIndex) {
if (i + count > oldList.lastIndex) {
continue
}
val addedSublist = oldList.subList(i, i + count).map { "added$it" }
val mutable = oldList.toMutableList()
mutable.addAll(i, addedSublist)
val mutableOldList = oldList.toMutableList()
mutableOldList.applyDiff(mutable)
assertEquals(
mutable,
mutableOldList
)
}
}
}
@Test
fun testThatSimpleChangesApplyWorks() {
val oldList = (0 until 10).map { it.toString() }
val withIndex = oldList.withIndex()
for (step in oldList.indices) {
for ((i, _) in withIndex) {
val mutable = oldList.toMutableList()
val newList = if (step == 0) {
i until oldList.size
} else {
i until oldList.size step step
}
newList.forEach { index ->
IndexedValue(index, mutable[index]) to IndexedValue(index, "changed$index").also {
mutable[index] = it.value
}
}
val mutableOldList = oldList.toMutableList()
mutableOldList.applyDiff(mutable)
assertEquals(
mutable,
mutableOldList
)
}
}
}
}
@@ -0,0 +1,61 @@
package dev.inmo.micro_utils.common
import kotlinx.browser.document
import org.w3c.dom.*
fun Node.onRemoved(block: () -> Unit): MutationObserver {
lateinit var observer: MutationObserver
observer = MutationObserver { _, _ ->
fun checkIfRemoved(node: Node): Boolean {
return node.parentNode != document && (node.parentNode ?.let { checkIfRemoved(it) } ?: true)
}
if (checkIfRemoved(this)) {
observer.disconnect()
block()
}
}
observer.observe(document, MutationObserverInit(childList = true, subtree = true))
return observer
}
fun Element.onVisibilityChanged(block: IntersectionObserverEntry.(Float, IntersectionObserver) -> Unit): IntersectionObserver {
var previousIntersectionRatio = -1f
val observer = IntersectionObserver { entries, observer ->
entries.forEach {
if (previousIntersectionRatio != it.intersectionRatio) {
previousIntersectionRatio = it.intersectionRatio.toFloat()
it.block(previousIntersectionRatio, observer)
}
}
}
observer.observe(this)
return observer
}
fun Element.onVisible(block: Element.(IntersectionObserver) -> Unit) {
var previous = -1f
onVisibilityChanged { intersectionRatio, observer ->
if (previous != intersectionRatio) {
if (intersectionRatio > 0 && previous == 0f) {
block(observer)
}
previous = intersectionRatio
}
}
}
fun Element.onInvisible(block: Element.(IntersectionObserver) -> Unit): IntersectionObserver {
var previous = -1f
return onVisibilityChanged { intersectionRatio, observer ->
if (previous != intersectionRatio) {
if (intersectionRatio == 0f && previous != 0f) {
block(observer)
}
previous = intersectionRatio
}
}
}
@@ -0,0 +1,124 @@
package dev.inmo.micro_utils.common
import org.w3c.dom.DOMRectReadOnly
import org.w3c.dom.Element
external interface IntersectionObserverOptions {
/**
* An Element or Document object which is an ancestor of the intended target, whose bounding rectangle will be
* considered the viewport. Any part of the target not visible in the visible area of the root is not considered
* visible.
*/
var root: Element?
/**
* A string which specifies a set of offsets to add to the root's bounding_box when calculating intersections,
* effectively shrinking or growing the root for calculation purposes. The syntax is approximately the same as that
* for the CSS margin property; see The root element and root margin in Intersection Observer API for more
* information on how the margin works and the syntax. The default is "0px 0px 0px 0px".
*/
var rootMargin: String?
/**
* Either a single number or an array of numbers between 0.0 and 1.0, specifying a ratio of intersection area to
* total bounding box area for the observed target. A value of 0.0 means that even a single visible pixel counts as
* the target being visible. 1.0 means that the entire target element is visible. See Thresholds in Intersection
* Observer API for a more in-depth description of how thresholds are used. The default is a threshold of 0.0.
*/
var threshold: Array<Number>?
}
fun IntersectionObserverOptions(
block: IntersectionObserverOptions.() -> Unit = {}
): IntersectionObserverOptions = js("{}").unsafeCast<IntersectionObserverOptions>().apply(block)
external interface IntersectionObserverEntry {
/**
* Returns the bounds rectangle of the target element as a DOMRectReadOnly. The bounds are computed as described in
* the documentation for Element.getBoundingClientRect().
*/
val boundingClientRect: DOMRectReadOnly
/**
* Returns the ratio of the intersectionRect to the boundingClientRect.
*/
val intersectionRatio: Number
/**
* Returns a DOMRectReadOnly representing the target's visible area.
*/
val intersectionRect: DOMRectReadOnly
/**
* A Boolean value which is true if the target element intersects with the intersection observer's root. If this is
* true, then, the IntersectionObserverEntry describes a transition into a state of intersection; if it's false,
* then you know the transition is from intersecting to not-intersecting.
*/
val isIntersecting: Boolean
/**
* Returns a DOMRectReadOnly for the intersection observer's root.
*/
val rootBounds: DOMRectReadOnly
/**
* The Element whose intersection with the root changed.
*/
val target: Element
/**
* A DOMHighResTimeStamp indicating the time at which the intersection was recorded, relative to the
* IntersectionObserver's time origin.
*/
val time: Double
}
typealias IntersectionObserverCallback = (entries: Array<IntersectionObserverEntry>, observer: IntersectionObserver) -> Unit
/**
* This is just an implementation from [this commentary](https://youtrack.jetbrains.com/issue/KT-43157#focus=Comments-27-4498582.0-0)
* of Kotlin JS issue related to the absence of [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver)
*/
external class IntersectionObserver(callback: IntersectionObserverCallback) {
constructor(callback: IntersectionObserverCallback, options: IntersectionObserverOptions)
/**
* The Element or Document whose bounds are used as the bounding box when testing for intersection. If no root value
* was passed to the constructor or its value is null, the top-level document's viewport is used.
*/
val root: Element
/**
* An offset rectangle applied to the root's bounding box when calculating intersections, effectively shrinking or
* growing the root for calculation purposes. The value returned by this property may not be the same as the one
* specified when calling the constructor as it may be changed to match internal requirements. Each offset can be
* expressed in pixels (px) or as a percentage (%). The default is "0px 0px 0px 0px".
*/
val rootMargin: String
/**
* A list of thresholds, sorted in increasing numeric order, where each threshold is a ratio of intersection area to
* bounding box area of an observed target. Notifications for a target are generated when any of the thresholds are
* crossed for that target. If no value was passed to the constructor, 0 is used.
*/
val thresholds: Array<Number>
/**
* Stops the IntersectionObserver object from observing any target.
*/
fun disconnect()
/**
* Tells the IntersectionObserver a target element to observe.
*/
fun observe(targetElement: Element)
/**
* Returns an array of IntersectionObserverEntry objects for all observed targets.
*/
fun takeRecords(): Array<IntersectionObserverEntry>
/**
* Tells the IntersectionObserver to stop observing a particular target element.
*/
fun unobserve(targetElement: Element)
}
@@ -0,0 +1,12 @@
package dev.inmo.micro_utils.common
import org.w3c.dom.Element
inline val Element.isOverflowWidth
get() = scrollWidth > clientWidth
inline val Element.isOverflowHeight
get() = scrollHeight > clientHeight
inline val Element.isOverflow
get() = isOverflowHeight || isOverflowWidth
@@ -0,0 +1,54 @@
package dev.inmo.micro_utils.common
import org.khronos.webgl.ArrayBuffer
import org.w3c.dom.ErrorEvent
import org.w3c.files.*
import kotlin.js.Promise
/**
* @suppress
*/
actual typealias MPPFile = File
fun MPPFile.readBytesPromise() = Promise<ByteArray> { success, failure ->
val reader = FileReader()
reader.onload = {
success((reader.result as ArrayBuffer).toByteArray())
Unit
}
reader.onerror = {
failure(Exception((it as ErrorEvent).message))
Unit
}
reader.readAsArrayBuffer(this)
}
fun MPPFile.readBytes(): ByteArray {
val reader = FileReaderSync()
return reader.readAsArrayBuffer(this).toByteArray()
}
private suspend fun MPPFile.dirtyReadBytes(): ByteArray = readBytesPromise().await()
/**
* @suppress
*/
actual val MPPFile.filename: FileName
get() = FileName(name)
/**
* @suppress
*/
actual val MPPFile.filesize: Long
get() = size.toLong()
/**
* @suppress
*/
@Warning("That is not optimized version of bytes allocator. Use asyncBytesAllocator everywhere you can")
actual val MPPFile.bytesAllocatorSync: ByteArrayAllocator
get() = ::readBytes
/**
* @suppress
*/
@Warning("That is not optimized version of bytes allocator. Use asyncBytesAllocator everywhere you can")
actual val MPPFile.bytesAllocator: SuspendByteArrayAllocator
get() = ::dirtyReadBytes
@@ -0,0 +1,38 @@
package dev.inmo.micro_utils.common
import kotlinx.browser.document
import org.w3c.dom.*
import org.w3c.dom.events.Event
import org.w3c.dom.events.EventListener
fun Element.onActionOutside(type: String, options: dynamic = null, callback: (Event) -> Unit): EventListener {
lateinit var observer: MutationObserver
val listener = EventListener {
val elementsToCheck = mutableListOf<Element>(this@onActionOutside)
while (it.target != this@onActionOutside && elementsToCheck.isNotEmpty()) {
val childrenGettingElement = elementsToCheck.removeFirst()
for (i in 0 until childrenGettingElement.childElementCount) {
elementsToCheck.add(childrenGettingElement.children[i] ?: continue)
}
}
if (elementsToCheck.isEmpty()) {
callback(it)
}
}
if (options == null) {
document.addEventListener(type, listener)
} else {
document.addEventListener(type, listener, options)
}
observer = onRemoved {
if (options == null) {
document.removeEventListener(type, listener)
} else {
document.removeEventListener(type, listener, options)
}
observer.disconnect()
}
return listener
}
fun Element.onClickOutside(options: dynamic = null, callback: (Event) -> Unit) = onActionOutside("click", options, callback)
@@ -0,0 +1,8 @@
package dev.inmo.micro_utils.common
import kotlinx.browser.window
fun openLink(link: String, target: String = "_blank", features: String = "") {
window.open(link, target, features) ?.focus()
}
@@ -0,0 +1,8 @@
package dev.inmo.micro_utils.common
import kotlin.coroutines.*
import kotlin.js.Promise
suspend fun <T> Promise<T>.await(): T = suspendCoroutine { cont ->
then({ cont.resume(it) }, { cont.resumeWithException(it) })
}
@@ -0,0 +1,58 @@
package dev.inmo.micro_utils.common
import org.w3c.dom.*
import kotlin.js.Json
import kotlin.js.json
external class ResizeObserver(
callback: (Array<ResizeObserverEntry>, ResizeObserver) -> Unit
) {
fun observe(target: Element, options: Json = definedExternally)
fun unobserve(target: Element)
fun disconnect()
}
external interface ResizeObserverSize {
val blockSize: Float
val inlineSize: Float
}
external interface ResizeObserverEntry {
val borderBoxSize: Array<ResizeObserverSize>
val contentBoxSize: Array<ResizeObserverSize>
val devicePixelContentBoxSize: Array<ResizeObserverSize>
val contentRect: DOMRectReadOnly
val target: Element
}
fun ResizeObserver.observe(target: Element, options: ResizeObserverObserveOptions) = observe(
target,
json(
"box" to options.box ?.name
)
)
class ResizeObserverObserveOptions(
val box: Box? = null
) {
sealed interface Box {
val name: String
object Content : Box {
override val name: String
get() = "content-box"
}
object Border : Box {
override val name: String
get() = "border-box"
}
object DevicePixelContent : Box {
override val name: String
get() = "device-pixel-content-box"
}
}
}
@@ -0,0 +1,30 @@
package dev.inmo.micro_utils.common
import kotlinx.browser.document
import kotlinx.dom.createElement
import org.w3c.dom.HTMLElement
import org.w3c.dom.HTMLInputElement
import org.w3c.files.get
fun selectFile(
inputSetup: (HTMLInputElement) -> Unit = {},
onFailure: (Throwable) -> Unit = {},
onFile: (MPPFile) -> Unit
) {
(document.createElement("input") {
(this as HTMLInputElement).apply {
type = "file"
onchange = {
runCatching {
files ?.get(0) ?: error("File must not be null")
}.onSuccess {
onFile(it)
}.onFailure {
onFailure(it)
}
}
inputSetup(this)
}
} as HTMLElement).click()
}
@@ -0,0 +1,14 @@
package dev.inmo.micro_utils.common
import kotlinx.browser.document
import org.w3c.dom.HTMLAnchorElement
fun triggerDownloadFile(filename: String, fileLink: String) {
val hiddenElement = document.createElement("a") as HTMLAnchorElement
hiddenElement.href = fileLink
hiddenElement.target = "_blank"
hiddenElement.download = filename
hiddenElement.click()
}
@@ -0,0 +1,4 @@
package dev.inmo.micro_utils.common
actual fun Float.fixed(signs: Int): Float = this.asDynamic().toFixed(signs.coerceIn(FixedSignsRange)).unsafeCast<String>().toFloat()
actual fun Double.fixed(signs: Int): Double = this.asDynamic().toFixed(signs.coerceIn(FixedSignsRange)).unsafeCast<String>().toDouble()
@@ -0,0 +1,20 @@
package dev.inmo.micro_utils.common
import java.io.File
import java.io.InputStream
import java.util.UUID
fun InputStream.downloadToTempFile(
fileName: String = UUID.randomUUID().toString(),
fileExtension: String? = ".temp",
folder: File? = null
) = File.createTempFile(
fileName,
fileExtension,
folder
).apply {
outputStream().use {
copyTo(it)
}
deleteOnExit()
}
@@ -0,0 +1,37 @@
package dev.inmo.micro_utils.common
import dev.inmo.micro_utils.coroutines.doInIO
import dev.inmo.micro_utils.coroutines.doOutsideOfCoroutine
import java.io.File
/**
* @suppress
*/
actual typealias MPPFile = File
/**
* @suppress
*/
actual val MPPFile.filename: FileName
get() = FileName(name)
/**
* @suppress
*/
actual val MPPFile.filesize: Long
get() = length()
/**
* @suppress
*/
actual val MPPFile.bytesAllocatorSync: ByteArrayAllocator
get() = ::readBytes
/**
* @suppress
*/
actual val MPPFile.bytesAllocator: SuspendByteArrayAllocator
get() = {
doInIO {
doOutsideOfCoroutine {
readBytes()
}
}
}
@@ -0,0 +1,12 @@
package dev.inmo.micro_utils.common
import java.math.BigDecimal
import java.math.RoundingMode
actual fun Float.fixed(signs: Int): Float = BigDecimal.valueOf(this.toDouble())
.setScale(signs.coerceIn(FixedSignsRange), RoundingMode.HALF_UP)
.toFloat();
actual fun Double.fixed(signs: Int): Double = BigDecimal.valueOf(this)
.setScale(signs.coerceIn(FixedSignsRange), RoundingMode.HALF_UP)
.toDouble();
@@ -0,0 +1,36 @@
package dev.inmo.micro_utils.common
import okio.FileSystem
import okio.Path
import okio.use
actual typealias MPPFile = Path
/**
* @suppress
*/
actual val MPPFile.filename: FileName
get() = FileName(toString())
/**
* @suppress
*/
actual val MPPFile.filesize: Long
get() = FileSystem.SYSTEM.openReadOnly(this).use {
it.size()
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocatorSync: ByteArrayAllocator
get() = {
FileSystem.SYSTEM.read(this) {
readByteArray()
}
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocator: SuspendByteArrayAllocator
get() = {
bytesAllocatorSync()
}
+25
View File
@@ -0,0 +1,25 @@
package dev.inmo.micro_utils.common
import kotlinx.cinterop.*
import platform.posix.snprintf
import platform.posix.sprintf
@OptIn(ExperimentalForeignApi::class)
actual fun Float.fixed(signs: Int): Float {
return memScoped {
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toFloat()
}
}
@OptIn(ExperimentalForeignApi::class)
actual fun Double.fixed(signs: Int): Double {
return memScoped {
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toDouble()
}
}
@@ -0,0 +1,36 @@
package dev.inmo.micro_utils.common
import okio.FileSystem
import okio.Path
import okio.use
actual typealias MPPFile = Path
/**
* @suppress
*/
actual val MPPFile.filename: FileName
get() = FileName(toString())
/**
* @suppress
*/
actual val MPPFile.filesize: Long
get() = FileSystem.SYSTEM.openReadOnly(this).use {
it.size()
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocatorSync: ByteArrayAllocator
get() = {
FileSystem.SYSTEM.read(this) {
readByteArray()
}
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocator: SuspendByteArrayAllocator
get() = {
bytesAllocatorSync()
}
+25
View File
@@ -0,0 +1,25 @@
package dev.inmo.micro_utils.common
import kotlinx.cinterop.*
import platform.posix.snprintf
import platform.posix.sprintf
@OptIn(ExperimentalForeignApi::class)
actual fun Float.fixed(signs: Int): Float {
return memScoped {
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toFloat()
}
}
@OptIn(ExperimentalForeignApi::class)
actual fun Double.fixed(signs: Int): Double {
return memScoped {
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toDouble()
}
}
-1
View File
@@ -1 +0,0 @@
<manifest package="dev.inmo.micro_utils.common"/>
@@ -0,0 +1,36 @@
package dev.inmo.micro_utils.common
import okio.FileSystem
import okio.Path
import okio.use
actual typealias MPPFile = Path
/**
* @suppress
*/
actual val MPPFile.filename: FileName
get() = FileName(toString())
/**
* @suppress
*/
actual val MPPFile.filesize: Long
get() = FileSystem.SYSTEM.openReadOnly(this).use {
it.size()
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocatorSync: ByteArrayAllocator
get() = {
FileSystem.SYSTEM.read(this) {
readByteArray()
}
}
/**
* @suppress
*/
actual val MPPFile.bytesAllocator: SuspendByteArrayAllocator
get() = {
bytesAllocatorSync()
}
+25
View File
@@ -0,0 +1,25 @@
package dev.inmo.micro_utils.common
import kotlinx.cinterop.*
import platform.posix.snprintf
import platform.posix.sprintf
@OptIn(ExperimentalForeignApi::class)
actual fun Float.fixed(signs: Int): Float {
return memScoped {
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toFloat()
}
}
@OptIn(ExperimentalForeignApi::class)
actual fun Double.fixed(signs: Int): Double {
return memScoped {
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
sprintf(buff, "%.${signs}f", this@fixed)
buff.toKString().toDouble()
}
}
+10 -4
View File
@@ -4,19 +4,25 @@ plugins {
id "com.android.library"
}
apply from: "$mppProjectWithSerializationPresetPath"
apply from: "$mppJvmJsAndroidLinuxMingwLinuxArm64ProjectPresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
api libs.kt.coroutines
}
}
jsMain {
dependencies {
api project(":micro_utils.common")
}
}
androidMain {
dependencies {
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
api libs.kt.coroutines.android
}
dependsOn(jvmMain)
}
}
}
}
+20
View File
@@ -0,0 +1,20 @@
plugins {
id "org.jetbrains.kotlin.multiplatform"
id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library"
alias(libs.plugins.jb.compose)
}
apply from: "$mppProjectWithSerializationAndComposePresetPath"
kotlin {
sourceSets {
commonMain {
dependencies {
api libs.kt.coroutines
api project(":micro_utils.coroutines")
api project(":micro_utils.common.compose")
}
}
}
}
@@ -0,0 +1 @@
<manifest/>
@@ -0,0 +1,60 @@
package dev.inmo.micro_utils.coroutines.compose
import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList
import dev.inmo.micro_utils.common.applyDiff
import dev.inmo.micro_utils.coroutines.ExceptionHandler
import dev.inmo.micro_utils.coroutines.defaultSafelyWithoutExceptionHandlerWithNull
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.withContext
import kotlin.coroutines.CoroutineContext
/**
* Each value of [this] [Flow] will trigger [applyDiff] to the result [SnapshotStateList]
*
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [SnapshotStateList]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*/
@Suppress("NOTHING_TO_INLINE")
inline fun <reified T> Flow<List<T>>.asMutableComposeListState(
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
noinline onException: ExceptionHandler<List<T>?> = defaultSafelyWithoutExceptionHandlerWithNull,
): SnapshotStateList<T> {
val state = mutableStateListOf<T>()
val changeBlock: suspend (List<T>) -> Unit = useContextOnChange ?.let {
{
withContext(useContextOnChange) {
state.applyDiff(it)
}
}
} ?: {
state.applyDiff(it)
}
subscribeSafelyWithoutExceptions(scope, onException, changeBlock)
return state
}
/**
* In fact, it is just classcast of [asMutableComposeListState] to [List]
*
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [List]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*
* @return Changing in time [List] which follow [Flow] values
*/
@Suppress("NOTHING_TO_INLINE")
inline fun <reified T> Flow<List<T>>.asComposeList(
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
noinline onException: ExceptionHandler<List<T>?> = defaultSafelyWithoutExceptionHandlerWithNull,
): List<T> = asMutableComposeListState(scope, useContextOnChange, onException)
@@ -0,0 +1,94 @@
package dev.inmo.micro_utils.coroutines.compose
import androidx.compose.runtime.*
import dev.inmo.micro_utils.common.compose.asState
import dev.inmo.micro_utils.coroutines.ExceptionHandler
import dev.inmo.micro_utils.coroutines.defaultSafelyWithoutExceptionHandlerWithNull
import dev.inmo.micro_utils.coroutines.doInUI
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.withContext
import kotlin.coroutines.CoroutineContext
/**
* Will map [this] [Flow] as [MutableState]. Returned [MutableState] WILL NOT change source [Flow]
*
* @param initial First value which will be passed to the result [MutableState]
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [MutableState]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*/
fun <T> Flow<T>.asMutableComposeState(
initial: T,
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
onException: ExceptionHandler<T?> = defaultSafelyWithoutExceptionHandlerWithNull,
): MutableState<T> {
val state = mutableStateOf(initial)
val changeBlock: suspend (T) -> Unit = useContextOnChange ?.let {
{
withContext(useContextOnChange) {
state.value = it
}
}
} ?: {
state.value = it
}
subscribeSafelyWithoutExceptions(scope, onException, block = changeBlock)
return state
}
/**
* Will map [this] [StateFlow] as [MutableState]. Returned [MutableState] WILL NOT change source [StateFlow].
* This conversation will pass its [StateFlow.value] as the first value
*
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [MutableState]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*/
@Suppress("NOTHING_TO_INLINE")
inline fun <T> StateFlow<T>.asMutableComposeState(
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
noinline onException: ExceptionHandler<T?> = defaultSafelyWithoutExceptionHandlerWithNull,
): MutableState<T> = asMutableComposeState(value, scope, useContextOnChange, onException)
/**
* Will create [MutableState] using [asMutableComposeState] and use [asState] to convert it as immutable state
*
* @param initial First value which will be passed to the result [State]
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [State]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*/
fun <T> Flow<T>.asComposeState(
initial: T,
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
onException: ExceptionHandler<T?> = defaultSafelyWithoutExceptionHandlerWithNull,
): State<T> {
val state = asMutableComposeState(initial, scope, useContextOnChange, onException)
return state.asState()
}
/**
* Will map [this] [StateFlow] as [State]. This conversation will pass its [StateFlow.value] as the first value
*
* @param scope Will be used to [subscribeSafelyWithoutExceptions] on [this] to update returned [State]
* @param useContextOnChange Will be used to change context inside of [subscribeSafelyWithoutExceptions] to ensure that
* change will happen in the required [CoroutineContext]. [Dispatchers.Main] by default
* @param onException Will be passed to the [subscribeSafelyWithoutExceptions] as uncaught exceptions handler
*/
@Suppress("NOTHING_TO_INLINE")
inline fun <T> StateFlow<T>.asComposeState(
scope: CoroutineScope,
useContextOnChange: CoroutineContext? = Dispatchers.Main,
noinline onException: ExceptionHandler<T?> = defaultSafelyWithoutExceptionHandlerWithNull,
): State<T> = asComposeState(value, scope, useContextOnChange, onException)
@@ -0,0 +1,43 @@
package dev.inmo.micro_utils.coroutines.compose
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf
import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow
import dev.inmo.micro_utils.coroutines.doInUI
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
class FlowState<T>(
private val state: MutableState<T>,
internalScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
) : MutableState<T>,
SpecialMutableStateFlow.Default<T>(state.value, internalScope) {
override var value: T
get() = super.value
set(value) {
tryEmit(value)
}
override fun component1(): T = state.component1()
override fun component2(): (T) -> Unit = state.component2()
private val stateState = derivedStateOf {
if (value != state.value) {
value = state.value
}
}
override suspend fun onChange(value: T) {
super.onChange(value)
if (state.value != value) {
doInUI {
state.value = value
}
}
}
}
fun <T> MutableState<T>.asFlowState(scope: CoroutineScope = CoroutineScope(Dispatchers.Main)) = FlowState(this, scope)
Loaded 100 of 534 files, more files were not shown because too many files have changed in this diff. Show more