From d9b02c847f57a415d606fcc630f8a7ca0a7dc2dc Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Thu, 16 Feb 2023 19:31:01 -0800 Subject: [PATCH] dough-core and all of that --- dough-core/build.gradle.kts | 10 +++++ .../gay/pizza/dough/core/PlatformSpecific.kt | 5 +++ .../pizza/dough/core/time/ClockProvider.kt | 5 +++ .../dough/core/time/StaticClockProvider.kt | 11 +++++ .../gay/pizza/dough/core/time/UnixTime.kt | 44 +++++++++++++++++++ .../gay/pizza/dough/core/JsPlatformType.kt | 23 ++++++++++ .../gay/pizza/dough/core/PlatformClock.kt | 5 +++ .../pizza/dough/core/StandardClockProvider.kt | 9 ++++ .../gay/pizza/dough/core/JavaClockProvider.kt | 8 ++++ .../gay/pizza/dough/core/PlatformSpecific.kt | 5 +++ .../pizza/dough/core/UnixTimeExtensions.kt | 9 ++++ dough-fs/build.gradle.kts | 10 +++++ .../kotlin/gay/pizza/dough/fs/FsOperations.kt | 4 ++ .../kotlin/gay/pizza/dough/fs/FsProvider.kt | 8 ++++ .../gay/pizza/dough/fs/PlatformSpecific.kt | 2 +- .../gay/pizza/dough/fs/JavaFsOperations.kt | 7 ++- .../gay/pizza/dough/fs/JavaFsProvider.kt | 14 ++++++ .../gay/pizza/dough/fs/PlatformSpecific.kt | 6 +-- settings.gradle.kts | 6 ++- 19 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 dough-core/build.gradle.kts create mode 100644 dough-core/src/commonMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt create mode 100644 dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/ClockProvider.kt create mode 100644 dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/StaticClockProvider.kt create mode 100644 dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/UnixTime.kt create mode 100644 dough-core/src/jsMain/kotlin/gay/pizza/dough/core/JsPlatformType.kt create mode 100644 dough-core/src/jsMain/kotlin/gay/pizza/dough/core/PlatformClock.kt create mode 100644 dough-core/src/jsMain/kotlin/gay/pizza/dough/core/StandardClockProvider.kt create mode 100644 dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/JavaClockProvider.kt create mode 100644 dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt create mode 100644 dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/UnixTimeExtensions.kt create mode 100644 dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsProvider.kt create mode 100644 dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsProvider.kt diff --git a/dough-core/build.gradle.kts b/dough-core/build.gradle.kts new file mode 100644 index 0000000..8a5c0bf --- /dev/null +++ b/dough-core/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + dough_component +} + +kotlin { + js(IR) { + nodejs() + browser() + } +} diff --git a/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt new file mode 100644 index 0000000..146a4bc --- /dev/null +++ b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt @@ -0,0 +1,5 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.ClockProvider + +expect val PlatformClock: ClockProvider diff --git a/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/ClockProvider.kt b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/ClockProvider.kt new file mode 100644 index 0000000..e392c81 --- /dev/null +++ b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/ClockProvider.kt @@ -0,0 +1,5 @@ +package gay.pizza.dough.core.time + +interface ClockProvider { + fun now(): UnixTime +} diff --git a/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/StaticClockProvider.kt b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/StaticClockProvider.kt new file mode 100644 index 0000000..2ee21f7 --- /dev/null +++ b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/StaticClockProvider.kt @@ -0,0 +1,11 @@ +package gay.pizza.dough.core.time + +import gay.pizza.dough.core.PlatformClock + +class StaticClockProvider(private val value: UnixTime) : ClockProvider { + override fun now(): UnixTime = value + + companion object { + fun snapshot(): StaticClockProvider = StaticClockProvider(PlatformClock.now()) + } +} diff --git a/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/UnixTime.kt b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/UnixTime.kt new file mode 100644 index 0000000..18f0d8b --- /dev/null +++ b/dough-core/src/commonMain/kotlin/gay/pizza/dough/core/time/UnixTime.kt @@ -0,0 +1,44 @@ +package gay.pizza.dough.core.time + +import kotlin.jvm.JvmInline +import kotlin.time.Duration +import kotlin.time.DurationUnit +import kotlin.time.toDuration + +@JvmInline +value class UnixTime(val millisecondsSinceEpoch: Long) : Comparable { + operator fun plus(time: UnixTime): UnixTime = + UnixTime(millisecondsSinceEpoch + time.millisecondsSinceEpoch) + + operator fun minus(time: UnixTime): UnixTime = + UnixTime(millisecondsSinceEpoch - time.millisecondsSinceEpoch) + + operator fun times(time: UnixTime): UnixTime = + UnixTime(millisecondsSinceEpoch * time.millisecondsSinceEpoch) + + operator fun div(duration: Duration): UnixTime = + UnixTime(millisecondsSinceEpoch / duration.inWholeMilliseconds) + + operator fun rem(time: UnixTime): UnixTime = + UnixTime(millisecondsSinceEpoch % time.millisecondsSinceEpoch) + + operator fun plus(duration: Duration): UnixTime = + UnixTime(millisecondsSinceEpoch + duration.inWholeMilliseconds) + + operator fun minus(duration: Duration): UnixTime = + UnixTime(millisecondsSinceEpoch - duration.inWholeMilliseconds) + + operator fun times(duration: Duration): UnixTime = + UnixTime(millisecondsSinceEpoch * duration.inWholeMilliseconds) + + operator fun div(time: UnixTime): UnixTime = + UnixTime(millisecondsSinceEpoch / time.millisecondsSinceEpoch) + + operator fun rem(duration: Duration): UnixTime = + UnixTime(millisecondsSinceEpoch % duration.inWholeMilliseconds) + + fun toDuration(): Duration = millisecondsSinceEpoch.toDuration(DurationUnit.MILLISECONDS) + + override fun compareTo(other: UnixTime): Int = + millisecondsSinceEpoch.compareTo(other.millisecondsSinceEpoch) +} diff --git a/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/JsPlatformType.kt b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/JsPlatformType.kt new file mode 100644 index 0000000..3e7c887 --- /dev/null +++ b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/JsPlatformType.kt @@ -0,0 +1,23 @@ +package gay.pizza.dough.core + +enum class JsPlatformType { + Nodejs, + Browser, + Unknown; + + companion object { + fun current(): JsPlatformType { + val isWindowAvailable = js("typeof window") != undefined + val isProcessAvailable = js("typeof process") != undefined + + if (isProcessAvailable) { + return Nodejs + } + + if (isWindowAvailable) { + return Browser + } + return Unknown + } + } +} diff --git a/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/PlatformClock.kt b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/PlatformClock.kt new file mode 100644 index 0000000..0c620d5 --- /dev/null +++ b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/PlatformClock.kt @@ -0,0 +1,5 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.ClockProvider + +actual val PlatformClock: ClockProvider = StandardClockProvider diff --git a/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/StandardClockProvider.kt b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/StandardClockProvider.kt new file mode 100644 index 0000000..0650a59 --- /dev/null +++ b/dough-core/src/jsMain/kotlin/gay/pizza/dough/core/StandardClockProvider.kt @@ -0,0 +1,9 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.ClockProvider +import gay.pizza.dough.core.time.UnixTime + +object StandardClockProvider : ClockProvider { + override fun now(): UnixTime = + UnixTime(js("(new Date()).getTime()") as Long) +} diff --git a/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/JavaClockProvider.kt b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/JavaClockProvider.kt new file mode 100644 index 0000000..56547bb --- /dev/null +++ b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/JavaClockProvider.kt @@ -0,0 +1,8 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.ClockProvider +import gay.pizza.dough.core.time.UnixTime + +object JavaClockProvider : ClockProvider { + override fun now(): UnixTime = UnixTime(System.currentTimeMillis()) +} diff --git a/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt new file mode 100644 index 0000000..eb7956b --- /dev/null +++ b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/PlatformSpecific.kt @@ -0,0 +1,5 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.ClockProvider + +actual val PlatformClock: ClockProvider = JavaClockProvider diff --git a/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/UnixTimeExtensions.kt b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/UnixTimeExtensions.kt new file mode 100644 index 0000000..0e18e1a --- /dev/null +++ b/dough-core/src/jvmMain/kotlin/gay/pizza/dough/core/UnixTimeExtensions.kt @@ -0,0 +1,9 @@ +package gay.pizza.dough.core + +import gay.pizza.dough.core.time.UnixTime +import java.nio.file.attribute.FileTime +import java.time.Instant + +fun UnixTime.toInstant(): Instant = Instant.ofEpochMilli(millisecondsSinceEpoch) +fun Instant.toUnixTime(): UnixTime = UnixTime(toEpochMilli()) +fun FileTime.toUnixTime(): UnixTime = toInstant().toUnixTime() diff --git a/dough-fs/build.gradle.kts b/dough-fs/build.gradle.kts index e8d6017..51d3b2e 100644 --- a/dough-fs/build.gradle.kts +++ b/dough-fs/build.gradle.kts @@ -1,3 +1,13 @@ plugins { dough_component } + +kotlin { + sourceSets { + commonMain { + dependencies { + api(project(":dough-core")) + } + } + } +} diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt index 37d4987..6b2767c 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsOperations.kt @@ -1,10 +1,12 @@ package gay.pizza.dough.fs +import gay.pizza.dough.core.time.UnixTime import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerializationStrategy interface FsOperations { fun exists(path: FsPath): Boolean + fun isDirectory(path: FsPath): Boolean fun isRegularFile(path: FsPath): Boolean fun isSymbolicLink(path: FsPath): Boolean @@ -12,6 +14,8 @@ interface FsOperations { fun isWritable(path: FsPath): Boolean fun isExecutable(path: FsPath): Boolean + fun lastModified(path: FsPath): UnixTime + fun list(path: FsPath): Sequence fun walk(path: FsPath): Sequence diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsProvider.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsProvider.kt new file mode 100644 index 0000000..7294973 --- /dev/null +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/FsProvider.kt @@ -0,0 +1,8 @@ +package gay.pizza.dough.fs + +interface FsProvider { + val currentWorkingDirectory: FsPath + val operations: FsOperations + + fun resolve(path: String): FsPath +} diff --git a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt index 90b4e64..4319a40 100644 --- a/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt +++ b/dough-fs/src/commonMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt @@ -1,3 +1,3 @@ package gay.pizza.dough.fs -expect fun FsPath(path: String): FsPath +expect val PlatformFsProvider: FsProvider diff --git a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt index 6426c9b..1aa6a76 100644 --- a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt +++ b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsOperations.kt @@ -1,5 +1,7 @@ package gay.pizza.dough.fs +import gay.pizza.dough.core.time.UnixTime +import gay.pizza.dough.core.toUnixTime import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.json.Json @@ -11,6 +13,7 @@ import kotlin.streams.asSequence object JavaFsOperations : FsOperations { override fun exists(path: FsPath): Boolean = Files.exists(path.toJavaPath()) + override fun isDirectory(path: FsPath): Boolean = Files.isDirectory(path.toJavaPath()) override fun isRegularFile(path: FsPath): Boolean = Files.isRegularFile(path.toJavaPath()) override fun isSymbolicLink(path: FsPath): Boolean = Files.isSymbolicLink(path.toJavaPath()) @@ -18,10 +21,12 @@ object JavaFsOperations : FsOperations { override fun isWritable(path: FsPath): Boolean = Files.isWritable(path.toJavaPath()) override fun isExecutable(path: FsPath): Boolean = Files.isExecutable(path.toJavaPath()) + override fun lastModified(path: FsPath): UnixTime = Files.getLastModifiedTime(path.toJavaPath()).toUnixTime() + override fun list(path: FsPath): Sequence = Files.list(path.toJavaPath()).asSequence().map { it.toFsPath() } override fun walk(path: FsPath): Sequence = Files.walk(path.toJavaPath()).asSequence().map { it.toFsPath() } - override fun visit(path: FsPath, visitor: FsPathVisitor) = + override fun visit(path: FsPath, visitor: FsPathVisitor): Unit = Files.walkFileTree(path.toJavaPath(), JavaFsPathVisitorAdapter(visitor)).run {} override fun readString(path: FsPath): String = Files.readString(path.toJavaPath()) diff --git a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsProvider.kt b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsProvider.kt new file mode 100644 index 0000000..8db58da --- /dev/null +++ b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/JavaFsProvider.kt @@ -0,0 +1,14 @@ +package gay.pizza.dough.fs + +import java.nio.file.FileSystem +import kotlin.io.path.absolute + +class JavaFsProvider(val fileSystem: FileSystem) : FsProvider { + override val currentWorkingDirectory: FsPath + get() = fileSystem.getPath(".").absolute().toFsPath() + + override val operations: FsOperations = JavaFsOperations + + override fun resolve(path: String): FsPath = + fileSystem.getPath(path).toFsPath() +} diff --git a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt index 08b4f21..b5cc33a 100644 --- a/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt +++ b/dough-fs/src/jvmMain/kotlin/gay/pizza/dough/fs/PlatformSpecific.kt @@ -1,7 +1,5 @@ package gay.pizza.dough.fs -import java.nio.file.Paths +import java.nio.file.FileSystems -actual fun FsPath(path: String): FsPath { - return JavaPath(Paths.get(path)) -} +actual val PlatformFsProvider: FsProvider = JavaFsProvider(FileSystems.getDefault()) diff --git a/settings.gradle.kts b/settings.gradle.kts index d5556d3..7c39e8f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,6 @@ rootProject.name = "dough" -include("dough-fs") + +include( + "dough-core", + "dough-fs" +)