mirror of
https://github.com/GayPizzaSpecifications/dough.git
synced 2025-08-05 06:21:32 +00:00
dough-core and all of that
This commit is contained in:
10
dough-core/build.gradle.kts
Normal file
10
dough-core/build.gradle.kts
Normal file
@ -0,0 +1,10 @@
|
||||
plugins {
|
||||
dough_component
|
||||
}
|
||||
|
||||
kotlin {
|
||||
js(IR) {
|
||||
nodejs()
|
||||
browser()
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package gay.pizza.dough.core
|
||||
|
||||
import gay.pizza.dough.core.time.ClockProvider
|
||||
|
||||
expect val PlatformClock: ClockProvider
|
@ -0,0 +1,5 @@
|
||||
package gay.pizza.dough.core.time
|
||||
|
||||
interface ClockProvider {
|
||||
fun now(): UnixTime
|
||||
}
|
@ -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())
|
||||
}
|
||||
}
|
@ -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<UnixTime> {
|
||||
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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package gay.pizza.dough.core
|
||||
|
||||
import gay.pizza.dough.core.time.ClockProvider
|
||||
|
||||
actual val PlatformClock: ClockProvider = StandardClockProvider
|
@ -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)
|
||||
}
|
@ -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())
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package gay.pizza.dough.core
|
||||
|
||||
import gay.pizza.dough.core.time.ClockProvider
|
||||
|
||||
actual val PlatformClock: ClockProvider = JavaClockProvider
|
@ -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()
|
Reference in New Issue
Block a user