diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1b25f5c..a55c8ac 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,4 +10,4 @@ - [ ] All tests pass (`./gradlew allTests`) - [ ] Lint passes (`./gradlew ktlintCheck`) -- [ ] API compatibility verified (`./gradlew apiCheck`) +- [ ] API compatibility verified (`./gradlew checkKotlinAbi`) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fa22a05..3293e44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,7 @@ jobs: run: ./gradlew :deci:ktlintCheck - name: API compatibility check - run: ./gradlew :deci:apiCheck + run: ./gradlew :deci:checkKotlinAbi - name: Run JVM tests run: ./gradlew :deci:jvmTest diff --git a/CHANGELOG.md b/CHANGELOG.md index 95665aa..0322810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,38 @@ # Changelog -## [Unreleased] +## [0.3.0] - 2026-06-09 + +### Changed + +- **The `/` and `%` operators are now fixed to `DeciContext.DEFAULT`.** Behaviour + is unchanged for any code that never reassigned the (now-removed) global + `divisionPolicy`: bare division still yields 20 fractional digits with + `HALF_UP` rounding, and `%` (which is computed via `/`) is likewise unaffected. + +- **Migrated to the Kotlin Gradle plugin's built-in ABI validation — no public + API or runtime changes.** Dropped the deprecated standalone + `org.jetbrains.kotlinx:binary-compatibility-validator` plugin in favour of the + Kotlin Gradle plugin's `abiValidation { }` DSL. The `apiDump` / `apiCheck` + tasks are replaced by `updateKotlinAbi` / `checkKotlinAbi`, and the reference + dump now lives at `deci/api/jvm/deci.api` (JVM) plus `deci/api/deci.klib.api` + (Kotlin/Native, JS, and Wasm). Removed the `binary-compatibility-validator` + version and `bcv-gradle-plugin` version-catalog entries. + +### Removed + +- **Deprecated division-policy configuration removed (breaking).** Deleted + `DeciConfiguration.divisionPolicy`, `DeciConfiguration.resetDivisionPolicy()`, + and the `DeciDivisionPolicy` class. The `/` operator no longer reads a global + mutable policy; it always divides with `DeciContext.DEFAULT` (20 fractional + digits, `HALF_UP`) — identical to the previous out-of-the-box default. To + customise division scale or rounding, pass an explicit context per call: + `a.divide(b, DeciContext.CURRENCY_USD)` or + `a.divide(b, scale = 4, roundingMode = RoundingMode.HALF_EVEN)`. + `DeciConfiguration.logSink` / `disableLogging()` are unaffected. + +- **`Iterable.averageDeci()` removed (breaking).** Use + `Iterable.mean()` from `org.kimplify.deci.statistics` instead — a drop-in + replacement with the same signature and semantics: `values.mean(context)`. ## [0.2.2] - 2026-06-05 diff --git a/CLAUDE.md b/CLAUDE.md index 1b8ce38..2f5b115 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -113,19 +113,19 @@ val expected = 0.10.toDecimal() ./gradlew publishToMavenLocal # Generate API binary-compatibility dump -./gradlew apiDump +./gradlew updateKotlinAbi # Check for binary-compatibility regressions -./gradlew apiCheck +./gradlew checkKotlinAbi ``` --- ## API Stability -- This library uses [kotlin-binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator). -- Run `./gradlew apiDump` after any public API change and commit the updated `.api` file. -- `./gradlew apiCheck` runs in CI and will fail the build on unintentional API changes. +- This library uses the Kotlin Gradle plugin's [built-in ABI validation](https://kotlinlang.org/docs/whatsnew2120.html#binary-compatibility-validation-in-the-kotlin-gradle-plugin) (`abiValidation`). +- Run `./gradlew updateKotlinAbi` after any public API change and commit the updated dump files under `deci/api/` (`jvm/deci.api` for JVM, `deci.klib.api` for the Kotlin/Native, JS, and Wasm targets). +- `./gradlew checkKotlinAbi` runs in CI and will fail the build on unintentional API changes. - Mark experimental APIs with `@ExperimentalDeciApi` and require opt-in. --- diff --git a/README.MD b/README.MD index 2294c9c..6e0dbea 100644 --- a/README.MD +++ b/README.MD @@ -169,17 +169,19 @@ Values serialize as JSON **strings** to preserve trailing zeros and avoid lossy ## Configuration +Division scale and rounding are chosen per call via `DeciContext` — there is no global +mutable division policy. The `/` operator uses `DeciContext.DEFAULT` (20 fractional +digits, `HALF_UP`); pass an explicit context or `scale`/`roundingMode` for anything else: + ```kotlin -DeciConfiguration.divisionPolicy = DeciDivisionPolicy( - fractionalDigits = 6, - roundingMode = RoundingMode.HALF_UP -) +Deci("10") / Deci("3") // DeciContext.DEFAULT +Deci("10").divide(Deci("3"), DeciContext.CURRENCY_USD) // 2 digits, HALF_UP +Deci("10").divide(Deci("3"), scale = 4, roundingMode = RoundingMode.HALF_EVEN) DeciConfiguration.logSink = DeciLogSink { tag, message -> println("[$tag] $message") } -DeciConfiguration.resetDivisionPolicy() DeciConfiguration.disableLogging() ``` diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 8d62509..8478d06 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -4,5 +4,4 @@ dependencies { implementation(libs.kotlin.gradle.plugin) implementation(libs.android.gradle.plugin) implementation(libs.ktlint.gradle.plugin) - implementation(libs.bcv.gradle.plugin) } diff --git a/build-logic/src/main/kotlin/deci.kmp.library.gradle.kts b/build-logic/src/main/kotlin/deci.kmp.library.gradle.kts index 1d6a742..65ad150 100644 --- a/build-logic/src/main/kotlin/deci.kmp.library.gradle.kts +++ b/build-logic/src/main/kotlin/deci.kmp.library.gradle.kts @@ -1,15 +1,19 @@ -@file:OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class) +@file:OptIn( + org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class, + org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation::class, +) plugins { id("org.jetbrains.kotlin.multiplatform") id("com.android.kotlin.multiplatform.library") id("org.jlleitschuh.gradle.ktlint") - id("org.jetbrains.kotlinx.binary-compatibility-validator") } kotlin { jvmToolchain(21) + abiValidation {} + jvm() js { browser() } wasmJs { browser() } diff --git a/deci/api/android/deci.api b/deci/api/android/deci.api deleted file mode 100644 index d1bd540..0000000 --- a/deci/api/android/deci.api +++ /dev/null @@ -1,352 +0,0 @@ -public final class org/kimplify/deci/Deci : java/lang/Comparable { - public static final field Companion Lorg/kimplify/deci/Deci$Companion; - public fun (D)V - public fun (I)V - public fun (J)V - public fun (Ljava/lang/String;)V - public fun (Ljava/math/BigDecimal;)V - public final fun abs ()Lorg/kimplify/deci/Deci; - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lorg/kimplify/deci/Deci;)I - public final fun div (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun divide (Lorg/kimplify/deci/Deci;ILorg/kimplify/deci/RoundingMode;)Lorg/kimplify/deci/Deci; - public final fun divide (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public fun equals (Ljava/lang/Object;)Z - public fun hashCode ()I - public final fun isNegative ()Z - public final fun isPositive ()Z - public final fun isZero ()Z - public final fun max (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun min (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun minus (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun negate ()Lorg/kimplify/deci/Deci; - public final fun plus (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun rem (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun setScale (ILorg/kimplify/deci/RoundingMode;)Lorg/kimplify/deci/Deci; - public final fun times (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public final fun toDouble ()D - public fun toString ()Ljava/lang/String; - public final fun unaryMinus ()Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/Deci$Companion { - public final fun fromStringOrNull (Ljava/lang/String;)Lorg/kimplify/deci/Deci; - public final fun fromStringOrZero (Ljava/lang/String;)Lorg/kimplify/deci/Deci; - public final fun getONE ()Lorg/kimplify/deci/Deci; - public final fun getTEN ()Lorg/kimplify/deci/Deci; - public final fun getZERO ()Lorg/kimplify/deci/Deci; - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - -public final class org/kimplify/deci/DeciConstants { - public static final field INSTANCE Lorg/kimplify/deci/DeciConstants; - public final fun getE ()Lorg/kimplify/deci/Deci; - public final fun getHALF ()Lorg/kimplify/deci/Deci; - public final fun getHUNDRED ()Lorg/kimplify/deci/Deci; - public final fun getMILLION ()Lorg/kimplify/deci/Deci; - public final fun getNEGATIVE_ONE ()Lorg/kimplify/deci/Deci; - public final fun getONE_HUNDREDTH ()Lorg/kimplify/deci/Deci; - public final fun getONE_TENTH ()Lorg/kimplify/deci/Deci; - public final fun getONE_THOUSANDTH ()Lorg/kimplify/deci/Deci; - public final fun getPI ()Lorg/kimplify/deci/Deci; - public final fun getTHOUSAND ()Lorg/kimplify/deci/Deci; - public final fun getTWO ()Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/DeciContext { - public static final field Companion Lorg/kimplify/deci/DeciContext$Companion; - public fun (ILorg/kimplify/deci/RoundingMode;)V - public final fun component1 ()I - public final fun component2 ()Lorg/kimplify/deci/RoundingMode; - public final fun copy (ILorg/kimplify/deci/RoundingMode;)Lorg/kimplify/deci/DeciContext; - public static synthetic fun copy$default (Lorg/kimplify/deci/DeciContext;ILorg/kimplify/deci/RoundingMode;ILjava/lang/Object;)Lorg/kimplify/deci/DeciContext; - public fun equals (Ljava/lang/Object;)Z - public final fun getPrecision ()I - public final fun getRoundingMode ()Lorg/kimplify/deci/RoundingMode; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class org/kimplify/deci/DeciContext$Companion { - public final fun forCurrency (Ljava/lang/String;)Lorg/kimplify/deci/DeciContext; - public final fun getBANKING ()Lorg/kimplify/deci/DeciContext; - public final fun getCURRENCY_BTC ()Lorg/kimplify/deci/DeciContext; - public final fun getCURRENCY_EUR ()Lorg/kimplify/deci/DeciContext; - public final fun getCURRENCY_JPY ()Lorg/kimplify/deci/DeciContext; - public final fun getCURRENCY_USD ()Lorg/kimplify/deci/DeciContext; - public final fun getDEFAULT ()Lorg/kimplify/deci/DeciContext; -} - -public final class org/kimplify/deci/DeciSerializer : kotlinx/serialization/KSerializer { - public static final field INSTANCE Lorg/kimplify/deci/DeciSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lorg/kimplify/deci/Deci; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lorg/kimplify/deci/Deci;)V -} - -public final class org/kimplify/deci/RoundingMode : java/lang/Enum { - public static final field CEILING Lorg/kimplify/deci/RoundingMode; - public static final field DOWN Lorg/kimplify/deci/RoundingMode; - public static final field FLOOR Lorg/kimplify/deci/RoundingMode; - public static final field HALF_DOWN Lorg/kimplify/deci/RoundingMode; - public static final field HALF_EVEN Lorg/kimplify/deci/RoundingMode; - public static final field HALF_UP Lorg/kimplify/deci/RoundingMode; - public static final field UP Lorg/kimplify/deci/RoundingMode; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lorg/kimplify/deci/RoundingMode; - public static fun values ()[Lorg/kimplify/deci/RoundingMode; -} - -public final class org/kimplify/deci/bulk/DeciBulkOperationsKt { - public static final fun addToAll (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static final fun applyPercentageChange (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun applyPercentageChange$default (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun applyToAll (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun averageDeci (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun averageDeci$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun bottomN (Ljava/lang/Iterable;I)Ljava/util/List; - public static final fun cumulativeSum (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun differences (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun divideAllBy (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun divideAllBy$default (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun filterInRange (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static final fun filterOutliers (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static synthetic fun filterOutliers$default (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;ILjava/lang/Object;)Ljava/util/List; - public static final fun groupConsecutiveSimilar (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static final fun movingAverage (Ljava/lang/Iterable;ILorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun movingAverage$default (Ljava/lang/Iterable;ILorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun multiplyAll (Ljava/lang/Iterable;)Lorg/kimplify/deci/Deci; - public static final fun multiplyAllBy (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static final fun normalize (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun normalize$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun partitionDeci (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair; - public static final fun roundAll (Ljava/lang/Iterable;ILorg/kimplify/deci/RoundingMode;)Ljava/util/List; - public static final fun scaleToSum (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun scaleToSum$default (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun subtractFromAll (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;)Ljava/util/List; - public static final fun topN (Ljava/lang/Iterable;I)Ljava/util/List; -} - -public final class org/kimplify/deci/config/DeciConfiguration { - public static final field INSTANCE Lorg/kimplify/deci/config/DeciConfiguration; - public final fun disableLogging ()V - public final fun getDivisionPolicy ()Lorg/kimplify/deci/config/DeciDivisionPolicy; - public final fun getLogSink ()Lorg/kimplify/deci/logging/DeciLogSink; - public final fun resetDivisionPolicy ()V - public final fun setDivisionPolicy (Lorg/kimplify/deci/config/DeciDivisionPolicy;)V - public final fun setLogSink (Lorg/kimplify/deci/logging/DeciLogSink;)V -} - -public final class org/kimplify/deci/config/DeciDivisionPolicy { - public fun (ILorg/kimplify/deci/RoundingMode;)V - public final fun component1 ()I - public final fun component2 ()Lorg/kimplify/deci/RoundingMode; - public final fun copy (ILorg/kimplify/deci/RoundingMode;)Lorg/kimplify/deci/config/DeciDivisionPolicy; - public static synthetic fun copy$default (Lorg/kimplify/deci/config/DeciDivisionPolicy;ILorg/kimplify/deci/RoundingMode;ILjava/lang/Object;)Lorg/kimplify/deci/config/DeciDivisionPolicy; - public fun equals (Ljava/lang/Object;)Z - public final fun getFractionalDigits ()I - public final fun getRoundingMode ()Lorg/kimplify/deci/RoundingMode; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public class org/kimplify/deci/exception/DeciArithmeticException : org/kimplify/deci/exception/DeciException { - public fun (Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public final class org/kimplify/deci/exception/DeciDivisionByZeroException : org/kimplify/deci/exception/DeciArithmeticException { - public fun ()V - public fun (Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public abstract class org/kimplify/deci/exception/DeciException : java/lang/RuntimeException { - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public final class org/kimplify/deci/exception/DeciFormatException : org/kimplify/deci/exception/DeciException { - public fun (Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getPattern ()Ljava/lang/String; -} - -public final class org/kimplify/deci/exception/DeciOverflowException : org/kimplify/deci/exception/DeciArithmeticException { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getValue ()Ljava/lang/String; -} - -public final class org/kimplify/deci/exception/DeciParseException : org/kimplify/deci/exception/DeciException { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getRawValue ()Ljava/lang/String; -} - -public final class org/kimplify/deci/exception/DeciScaleException : org/kimplify/deci/exception/DeciException { - public fun (ILjava/lang/String;)V - public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getScale ()I -} - -public final class org/kimplify/deci/exception/DeciSerializationException : org/kimplify/deci/exception/DeciException { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getRawValue ()Ljava/lang/String; -} - -public final class org/kimplify/deci/extension/DeciExtensionsKt { - public static final fun orDefault (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun orOne (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun orZero (Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun precision (Lorg/kimplify/deci/Deci;)I - public static final fun scale (Lorg/kimplify/deci/Deci;)I - public static final fun sumDeci (Ljava/lang/Iterable;)Lorg/kimplify/deci/Deci; - public static final fun toDeci (D)Lorg/kimplify/deci/Deci; - public static final fun toDeci (I)Lorg/kimplify/deci/Deci; - public static final fun toDeci (J)Lorg/kimplify/deci/Deci; - public static final fun toDeci (Ljava/lang/String;)Lorg/kimplify/deci/Deci; - public static final fun toDeciOrNull (Ljava/lang/String;)Lorg/kimplify/deci/Deci; - public static final fun toFloat (Lorg/kimplify/deci/Deci;)F - public static final fun toInt (Lorg/kimplify/deci/Deci;)I - public static final fun toIntOrNull (Lorg/kimplify/deci/Deci;)Ljava/lang/Integer; - public static final fun toLong (Lorg/kimplify/deci/Deci;)J - public static final fun toLongExact (Lorg/kimplify/deci/Deci;)J - public static final fun toLongOrNull (Lorg/kimplify/deci/Deci;)Ljava/lang/Long; -} - -public final class org/kimplify/deci/extension/DeciOperatorExtensionsKt { - public static final fun d (I)Lorg/kimplify/deci/Deci; - public static final fun d (J)Lorg/kimplify/deci/Deci; - public static final fun d (Ljava/lang/String;)Lorg/kimplify/deci/Deci; - public static final fun minus (Lorg/kimplify/deci/Deci;I)Lorg/kimplify/deci/Deci; - public static final fun minus (Lorg/kimplify/deci/Deci;J)Lorg/kimplify/deci/Deci; - public static final fun plus (Lorg/kimplify/deci/Deci;I)Lorg/kimplify/deci/Deci; - public static final fun plus (Lorg/kimplify/deci/Deci;J)Lorg/kimplify/deci/Deci; - public static final fun times (ILorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun times (JLorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun times (Lorg/kimplify/deci/Deci;I)Lorg/kimplify/deci/Deci; - public static final fun times (Lorg/kimplify/deci/Deci;J)Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/financial/DeciAllocationKt { - public static final fun allocate (Lorg/kimplify/deci/Deci;ILorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun allocate$default (Lorg/kimplify/deci/Deci;ILorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; - public static final fun allocateByRatios (Lorg/kimplify/deci/Deci;Ljava/util/List;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; - public static synthetic fun allocateByRatios$default (Lorg/kimplify/deci/Deci;Ljava/util/List;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; -} - -public final class org/kimplify/deci/financial/DeciPercentageKt { - public static final fun grossMargin (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun grossMargin$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun markup (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun markup$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun percentageChangeTo (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun percentageChangeTo$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/financial/DeciTaxKt { - public static final fun preTax (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun preTax$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun taxAmount (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun taxAmount$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun withDiscount (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun withDiscount$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun withTax (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun withTax$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/formatting/DeciFormattingKt { - public static final fun format (Lorg/kimplify/deci/Deci;Ljava/lang/String;)Ljava/lang/String; - public static final fun formatAsPercentage (Lorg/kimplify/deci/Deci;ILjava/lang/String;)Ljava/lang/String; - public static synthetic fun formatAsPercentage$default (Lorg/kimplify/deci/Deci;ILjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun formatCurrency (Lorg/kimplify/deci/Deci;Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String; - public static synthetic fun formatCurrency$default (Lorg/kimplify/deci/Deci;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun formatWithThousandsSeparator (Lorg/kimplify/deci/Deci;Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun formatWithThousandsSeparator$default (Lorg/kimplify/deci/Deci;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun pad (Lorg/kimplify/deci/Deci;ICZ)Ljava/lang/String; - public static synthetic fun pad$default (Lorg/kimplify/deci/Deci;ICZILjava/lang/Object;)Ljava/lang/String; - public static final fun toScientificNotation (Lorg/kimplify/deci/Deci;I)Ljava/lang/String; - public static synthetic fun toScientificNotation$default (Lorg/kimplify/deci/Deci;IILjava/lang/Object;)Ljava/lang/String; - public static final fun toWords (Lorg/kimplify/deci/Deci;)Ljava/lang/String; -} - -public abstract interface class org/kimplify/deci/logging/DeciLogSink { - public abstract fun log (Ljava/lang/String;Ljava/lang/String;)V -} - -public final class org/kimplify/deci/math/DeciMathKt { - public static final fun mod (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun pow (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun pow$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun remainder (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun roundToNearest (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun roundToSignificantDigits (Lorg/kimplify/deci/Deci;I)Lorg/kimplify/deci/Deci; - public static final fun sqrt (Lorg/kimplify/deci/Deci;I)Lorg/kimplify/deci/Deci; - public static synthetic fun sqrt$default (Lorg/kimplify/deci/Deci;IILjava/lang/Object;)Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/statistics/DeciStatisticsKt { - public static final fun countWhere (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)I - public static final fun harmonicMean (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun harmonicMean$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun maxDeci (Ljava/lang/Iterable;)Lorg/kimplify/deci/Deci; - public static final fun mean (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun mean$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun median (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun median$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun minDeci (Ljava/lang/Iterable;)Lorg/kimplify/deci/Deci; - public static final fun range (Ljava/lang/Iterable;)Lorg/kimplify/deci/Deci; - public static final fun standardDeviation (Ljava/lang/Iterable;ZLorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun standardDeviation$default (Ljava/lang/Iterable;ZLorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun sumOfSquares (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun sumOfSquares$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun variance (Ljava/lang/Iterable;ZLorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun variance$default (Ljava/lang/Iterable;ZLorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun weightedAverage (Ljava/lang/Iterable;Ljava/util/List;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun weightedAverage$default (Ljava/lang/Iterable;Ljava/util/List;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; -} - -public final class org/kimplify/deci/validation/DeciValidationKt { - public static final fun clamp (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Lorg/kimplify/deci/Deci; - public static final fun hasValidDecimalPlaces (Lorg/kimplify/deci/Deci;I)Z - public static final fun isApproximatelyEqual (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Z - public static synthetic fun isApproximatelyEqual$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;ILjava/lang/Object;)Z - public static final fun isEven (Lorg/kimplify/deci/Deci;)Z - public static final fun isInRange (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Z - public static final fun isNonNegative (Lorg/kimplify/deci/Deci;)Z - public static final fun isOdd (Lorg/kimplify/deci/Deci;)Z - public static final fun isPositiveStrict (Lorg/kimplify/deci/Deci;)Z - public static final fun isValidCurrencyAmount (Lorg/kimplify/deci/Deci;Ljava/lang/String;)Z - public static synthetic fun isValidCurrencyAmount$default (Lorg/kimplify/deci/Deci;Ljava/lang/String;ILjava/lang/Object;)Z - public static final fun isValidDeci (Ljava/lang/String;)Z - public static final fun isValidInterestRate (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;)Z - public static synthetic fun isValidInterestRate$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;ILjava/lang/Object;)Z - public static final fun isValidPercentage (Lorg/kimplify/deci/Deci;ZZ)Z - public static synthetic fun isValidPercentage$default (Lorg/kimplify/deci/Deci;ZZILjava/lang/Object;)Z - public static final fun isValidTaxRate (Lorg/kimplify/deci/Deci;)Z - public static final fun isWhole (Lorg/kimplify/deci/Deci;)Z - public static final fun safeDivide (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun safeDivide$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; - public static final fun toDeciOrError (Ljava/lang/String;)Ljava/lang/Object; - public static final fun validateForForm (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Ljava/lang/Integer;Z)Lorg/kimplify/deci/validation/ValidationResult; - public static synthetic fun validateForForm$default (Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/Deci;Ljava/lang/Integer;ZILjava/lang/Object;)Lorg/kimplify/deci/validation/ValidationResult; -} - -public final class org/kimplify/deci/validation/ValidationResult { - public fun (ZLjava/lang/String;)V - public synthetic fun (ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lorg/kimplify/deci/validation/ValidationResult; - public static synthetic fun copy$default (Lorg/kimplify/deci/validation/ValidationResult;ZLjava/lang/String;ILjava/lang/Object;)Lorg/kimplify/deci/validation/ValidationResult; - public fun equals (Ljava/lang/Object;)Z - public final fun getErrorMessage ()Ljava/lang/String; - public fun hashCode ()I - public final fun isValid ()Z - public fun toString ()Ljava/lang/String; -} - diff --git a/deci/api/deci.klib.api b/deci/api/deci.klib.api new file mode 100644 index 0000000..0211ec0 --- /dev/null +++ b/deci/api/deci.klib.api @@ -0,0 +1,323 @@ +// Klib ABI Dump +// Targets: [iosArm64, iosSimulatorArm64, js, macosArm64, wasmJs] +// Rendering settings: +// - Signature version: 2 +// - Show manifest properties: true +// - Show declarations: true + +// Library unique name: +final enum class org.kimplify.deci/RoundingMode : kotlin/Enum { // org.kimplify.deci/RoundingMode|null[0] + enum entry CEILING // org.kimplify.deci/RoundingMode.CEILING|null[0] + enum entry DOWN // org.kimplify.deci/RoundingMode.DOWN|null[0] + enum entry FLOOR // org.kimplify.deci/RoundingMode.FLOOR|null[0] + enum entry HALF_DOWN // org.kimplify.deci/RoundingMode.HALF_DOWN|null[0] + enum entry HALF_EVEN // org.kimplify.deci/RoundingMode.HALF_EVEN|null[0] + enum entry HALF_UP // org.kimplify.deci/RoundingMode.HALF_UP|null[0] + enum entry UP // org.kimplify.deci/RoundingMode.UP|null[0] + + final val entries // org.kimplify.deci/RoundingMode.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // org.kimplify.deci/RoundingMode.entries.|#static(){}[0] + + final fun valueOf(kotlin/String): org.kimplify.deci/RoundingMode // org.kimplify.deci/RoundingMode.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // org.kimplify.deci/RoundingMode.values|values#static(){}[0] +} + +abstract fun interface org.kimplify.deci.logging/DeciLogSink { // org.kimplify.deci.logging/DeciLogSink|null[0] + abstract fun log(kotlin/String, kotlin/String) // org.kimplify.deci.logging/DeciLogSink.log|log(kotlin.String;kotlin.String){}[0] +} + +final class org.kimplify.deci.exception/DeciDivisionByZeroException : org.kimplify.deci.exception/DeciArithmeticException { // org.kimplify.deci.exception/DeciDivisionByZeroException|null[0] + constructor (kotlin/String = ..., kotlin/Throwable? = ...) // org.kimplify.deci.exception/DeciDivisionByZeroException.|(kotlin.String;kotlin.Throwable?){}[0] +} + +final class org.kimplify.deci.exception/DeciFormatException : org.kimplify.deci.exception/DeciException { // org.kimplify.deci.exception/DeciFormatException|null[0] + constructor (kotlin/String, kotlin/String = ...) // org.kimplify.deci.exception/DeciFormatException.|(kotlin.String;kotlin.String){}[0] + + final val pattern // org.kimplify.deci.exception/DeciFormatException.pattern|{}pattern[0] + final fun (): kotlin/String // org.kimplify.deci.exception/DeciFormatException.pattern.|(){}[0] +} + +final class org.kimplify.deci.exception/DeciOverflowException : org.kimplify.deci.exception/DeciArithmeticException { // org.kimplify.deci.exception/DeciOverflowException|null[0] + constructor (kotlin/String, kotlin/String = ..., kotlin/Throwable? = ...) // org.kimplify.deci.exception/DeciOverflowException.|(kotlin.String;kotlin.String;kotlin.Throwable?){}[0] + + final val value // org.kimplify.deci.exception/DeciOverflowException.value|{}value[0] + final fun (): kotlin/String // org.kimplify.deci.exception/DeciOverflowException.value.|(){}[0] +} + +final class org.kimplify.deci.exception/DeciParseException : org.kimplify.deci.exception/DeciException { // org.kimplify.deci.exception/DeciParseException|null[0] + constructor (kotlin/String, kotlin/String = ..., kotlin/Throwable? = ...) // org.kimplify.deci.exception/DeciParseException.|(kotlin.String;kotlin.String;kotlin.Throwable?){}[0] + + final val rawValue // org.kimplify.deci.exception/DeciParseException.rawValue|{}rawValue[0] + final fun (): kotlin/String // org.kimplify.deci.exception/DeciParseException.rawValue.|(){}[0] +} + +final class org.kimplify.deci.exception/DeciScaleException : org.kimplify.deci.exception/DeciException { // org.kimplify.deci.exception/DeciScaleException|null[0] + constructor (kotlin/Int, kotlin/String = ...) // org.kimplify.deci.exception/DeciScaleException.|(kotlin.Int;kotlin.String){}[0] + + final val scale // org.kimplify.deci.exception/DeciScaleException.scale|{}scale[0] + final fun (): kotlin/Int // org.kimplify.deci.exception/DeciScaleException.scale.|(){}[0] +} + +final class org.kimplify.deci.exception/DeciSerializationException : org.kimplify.deci.exception/DeciException { // org.kimplify.deci.exception/DeciSerializationException|null[0] + constructor (kotlin/String, kotlin/String = ..., kotlin/Throwable? = ...) // org.kimplify.deci.exception/DeciSerializationException.|(kotlin.String;kotlin.String;kotlin.Throwable?){}[0] + + final val rawValue // org.kimplify.deci.exception/DeciSerializationException.rawValue|{}rawValue[0] + final fun (): kotlin/String // org.kimplify.deci.exception/DeciSerializationException.rawValue.|(){}[0] +} + +final class org.kimplify.deci.validation/ValidationResult { // org.kimplify.deci.validation/ValidationResult|null[0] + constructor (kotlin/Boolean, kotlin/String? = ...) // org.kimplify.deci.validation/ValidationResult.|(kotlin.Boolean;kotlin.String?){}[0] + + final val errorMessage // org.kimplify.deci.validation/ValidationResult.errorMessage|{}errorMessage[0] + final fun (): kotlin/String? // org.kimplify.deci.validation/ValidationResult.errorMessage.|(){}[0] + final val isValid // org.kimplify.deci.validation/ValidationResult.isValid|{}isValid[0] + final fun (): kotlin/Boolean // org.kimplify.deci.validation/ValidationResult.isValid.|(){}[0] + + final fun component1(): kotlin/Boolean // org.kimplify.deci.validation/ValidationResult.component1|component1(){}[0] + final fun component2(): kotlin/String? // org.kimplify.deci.validation/ValidationResult.component2|component2(){}[0] + final fun copy(kotlin/Boolean = ..., kotlin/String? = ...): org.kimplify.deci.validation/ValidationResult // org.kimplify.deci.validation/ValidationResult.copy|copy(kotlin.Boolean;kotlin.String?){}[0] + final fun equals(kotlin/Any?): kotlin/Boolean // org.kimplify.deci.validation/ValidationResult.equals|equals(kotlin.Any?){}[0] + final fun hashCode(): kotlin/Int // org.kimplify.deci.validation/ValidationResult.hashCode|hashCode(){}[0] + final fun toString(): kotlin/String // org.kimplify.deci.validation/ValidationResult.toString|toString(){}[0] +} + +final class org.kimplify.deci/Deci : kotlin/Comparable { // org.kimplify.deci/Deci|null[0] + constructor (kotlin/Double) // org.kimplify.deci/Deci.|(kotlin.Double){}[0] + constructor (kotlin/Int) // org.kimplify.deci/Deci.|(kotlin.Int){}[0] + constructor (kotlin/Long) // org.kimplify.deci/Deci.|(kotlin.Long){}[0] + constructor (kotlin/String) // org.kimplify.deci/Deci.|(kotlin.String){}[0] + + final fun abs(): org.kimplify.deci/Deci // org.kimplify.deci/Deci.abs|abs(){}[0] + final fun compareTo(org.kimplify.deci/Deci): kotlin/Int // org.kimplify.deci/Deci.compareTo|compareTo(org.kimplify.deci.Deci){}[0] + final fun div(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.div|div(org.kimplify.deci.Deci){}[0] + final fun divide(org.kimplify.deci/Deci, kotlin/Int, org.kimplify.deci/RoundingMode): org.kimplify.deci/Deci // org.kimplify.deci/Deci.divide|divide(org.kimplify.deci.Deci;kotlin.Int;org.kimplify.deci.RoundingMode){}[0] + final fun divide(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext): org.kimplify.deci/Deci // org.kimplify.deci/Deci.divide|divide(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] + final fun equals(kotlin/Any?): kotlin/Boolean // org.kimplify.deci/Deci.equals|equals(kotlin.Any?){}[0] + final fun hashCode(): kotlin/Int // org.kimplify.deci/Deci.hashCode|hashCode(){}[0] + final fun isNegative(): kotlin/Boolean // org.kimplify.deci/Deci.isNegative|isNegative(){}[0] + final fun isPositive(): kotlin/Boolean // org.kimplify.deci/Deci.isPositive|isPositive(){}[0] + final fun isZero(): kotlin/Boolean // org.kimplify.deci/Deci.isZero|isZero(){}[0] + final fun max(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.max|max(org.kimplify.deci.Deci){}[0] + final fun min(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.min|min(org.kimplify.deci.Deci){}[0] + final fun minus(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.minus|minus(org.kimplify.deci.Deci){}[0] + final fun negate(): org.kimplify.deci/Deci // org.kimplify.deci/Deci.negate|negate(){}[0] + final fun plus(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.plus|plus(org.kimplify.deci.Deci){}[0] + final fun rem(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.rem|rem(org.kimplify.deci.Deci){}[0] + final fun setScale(kotlin/Int, org.kimplify.deci/RoundingMode): org.kimplify.deci/Deci // org.kimplify.deci/Deci.setScale|setScale(kotlin.Int;org.kimplify.deci.RoundingMode){}[0] + final fun times(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci/Deci.times|times(org.kimplify.deci.Deci){}[0] + final fun toDouble(): kotlin/Double // org.kimplify.deci/Deci.toDouble|toDouble(){}[0] + final fun toString(): kotlin/String // org.kimplify.deci/Deci.toString|toString(){}[0] + final fun unaryMinus(): org.kimplify.deci/Deci // org.kimplify.deci/Deci.unaryMinus|unaryMinus(){}[0] + + final object Companion { // org.kimplify.deci/Deci.Companion|null[0] + final val ONE // org.kimplify.deci/Deci.Companion.ONE|{}ONE[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/Deci.Companion.ONE.|(){}[0] + final val TEN // org.kimplify.deci/Deci.Companion.TEN|{}TEN[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/Deci.Companion.TEN.|(){}[0] + final val ZERO // org.kimplify.deci/Deci.Companion.ZERO|{}ZERO[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/Deci.Companion.ZERO.|(){}[0] + + final fun fromStringOrNull(kotlin/String): org.kimplify.deci/Deci? // org.kimplify.deci/Deci.Companion.fromStringOrNull|fromStringOrNull(kotlin.String){}[0] + final fun fromStringOrZero(kotlin/String): org.kimplify.deci/Deci // org.kimplify.deci/Deci.Companion.fromStringOrZero|fromStringOrZero(kotlin.String){}[0] + final fun serializer(): kotlinx.serialization/KSerializer // org.kimplify.deci/Deci.Companion.serializer|serializer(){}[0] + } +} + +final class org.kimplify.deci/DeciContext { // org.kimplify.deci/DeciContext|null[0] + constructor (kotlin/Int, org.kimplify.deci/RoundingMode) // org.kimplify.deci/DeciContext.|(kotlin.Int;org.kimplify.deci.RoundingMode){}[0] + + final val precision // org.kimplify.deci/DeciContext.precision|{}precision[0] + final fun (): kotlin/Int // org.kimplify.deci/DeciContext.precision.|(){}[0] + final val roundingMode // org.kimplify.deci/DeciContext.roundingMode|{}roundingMode[0] + final fun (): org.kimplify.deci/RoundingMode // org.kimplify.deci/DeciContext.roundingMode.|(){}[0] + + final fun component1(): kotlin/Int // org.kimplify.deci/DeciContext.component1|component1(){}[0] + final fun component2(): org.kimplify.deci/RoundingMode // org.kimplify.deci/DeciContext.component2|component2(){}[0] + final fun copy(kotlin/Int = ..., org.kimplify.deci/RoundingMode = ...): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.copy|copy(kotlin.Int;org.kimplify.deci.RoundingMode){}[0] + final fun equals(kotlin/Any?): kotlin/Boolean // org.kimplify.deci/DeciContext.equals|equals(kotlin.Any?){}[0] + final fun hashCode(): kotlin/Int // org.kimplify.deci/DeciContext.hashCode|hashCode(){}[0] + final fun toString(): kotlin/String // org.kimplify.deci/DeciContext.toString|toString(){}[0] + + final object Companion { // org.kimplify.deci/DeciContext.Companion|null[0] + final val BANKING // org.kimplify.deci/DeciContext.Companion.BANKING|{}BANKING[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.BANKING.|(){}[0] + final val CURRENCY_BTC // org.kimplify.deci/DeciContext.Companion.CURRENCY_BTC|{}CURRENCY_BTC[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.CURRENCY_BTC.|(){}[0] + final val CURRENCY_EUR // org.kimplify.deci/DeciContext.Companion.CURRENCY_EUR|{}CURRENCY_EUR[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.CURRENCY_EUR.|(){}[0] + final val CURRENCY_JPY // org.kimplify.deci/DeciContext.Companion.CURRENCY_JPY|{}CURRENCY_JPY[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.CURRENCY_JPY.|(){}[0] + final val CURRENCY_USD // org.kimplify.deci/DeciContext.Companion.CURRENCY_USD|{}CURRENCY_USD[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.CURRENCY_USD.|(){}[0] + final val DEFAULT // org.kimplify.deci/DeciContext.Companion.DEFAULT|{}DEFAULT[0] + final fun (): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.DEFAULT.|(){}[0] + + final fun forCurrency(kotlin/String): org.kimplify.deci/DeciContext // org.kimplify.deci/DeciContext.Companion.forCurrency|forCurrency(kotlin.String){}[0] + } +} + +open class org.kimplify.deci.exception/DeciArithmeticException : org.kimplify.deci.exception/DeciException { // org.kimplify.deci.exception/DeciArithmeticException|null[0] + constructor (kotlin/String, kotlin/Throwable? = ...) // org.kimplify.deci.exception/DeciArithmeticException.|(kotlin.String;kotlin.Throwable?){}[0] +} + +sealed class org.kimplify.deci.exception/DeciException : kotlin/RuntimeException // org.kimplify.deci.exception/DeciException|null[0] + +final object org.kimplify.deci.config/DeciConfiguration { // org.kimplify.deci.config/DeciConfiguration|null[0] + final var logSink // org.kimplify.deci.config/DeciConfiguration.logSink|{}logSink[0] + final fun (): org.kimplify.deci.logging/DeciLogSink? // org.kimplify.deci.config/DeciConfiguration.logSink.|(){}[0] + final fun (org.kimplify.deci.logging/DeciLogSink?) // org.kimplify.deci.config/DeciConfiguration.logSink.|(org.kimplify.deci.logging.DeciLogSink?){}[0] + + final fun disableLogging() // org.kimplify.deci.config/DeciConfiguration.disableLogging|disableLogging(){}[0] +} + +final object org.kimplify.deci/DeciConstants { // org.kimplify.deci/DeciConstants|null[0] + final val E // org.kimplify.deci/DeciConstants.E|{}E[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.E.|(){}[0] + final val HALF // org.kimplify.deci/DeciConstants.HALF|{}HALF[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.HALF.|(){}[0] + final val HUNDRED // org.kimplify.deci/DeciConstants.HUNDRED|{}HUNDRED[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.HUNDRED.|(){}[0] + final val MILLION // org.kimplify.deci/DeciConstants.MILLION|{}MILLION[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.MILLION.|(){}[0] + final val NEGATIVE_ONE // org.kimplify.deci/DeciConstants.NEGATIVE_ONE|{}NEGATIVE_ONE[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.NEGATIVE_ONE.|(){}[0] + final val ONE_HUNDREDTH // org.kimplify.deci/DeciConstants.ONE_HUNDREDTH|{}ONE_HUNDREDTH[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.ONE_HUNDREDTH.|(){}[0] + final val ONE_TENTH // org.kimplify.deci/DeciConstants.ONE_TENTH|{}ONE_TENTH[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.ONE_TENTH.|(){}[0] + final val ONE_THOUSANDTH // org.kimplify.deci/DeciConstants.ONE_THOUSANDTH|{}ONE_THOUSANDTH[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.ONE_THOUSANDTH.|(){}[0] + final val PI // org.kimplify.deci/DeciConstants.PI|{}PI[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.PI.|(){}[0] + final val THOUSAND // org.kimplify.deci/DeciConstants.THOUSAND|{}THOUSAND[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.THOUSAND.|(){}[0] + final val TWO // org.kimplify.deci/DeciConstants.TWO|{}TWO[0] + final fun (): org.kimplify.deci/Deci // org.kimplify.deci/DeciConstants.TWO.|(){}[0] +} + +final object org.kimplify.deci/DeciSerializer : kotlinx.serialization/KSerializer { // org.kimplify.deci/DeciSerializer|null[0] + final val descriptor // org.kimplify.deci/DeciSerializer.descriptor|{}descriptor[0] + final fun (): kotlinx.serialization.descriptors/SerialDescriptor // org.kimplify.deci/DeciSerializer.descriptor.|(){}[0] + + final fun deserialize(kotlinx.serialization.encoding/Decoder): org.kimplify.deci/Deci // org.kimplify.deci/DeciSerializer.deserialize|deserialize(kotlinx.serialization.encoding.Decoder){}[0] + final fun serialize(kotlinx.serialization.encoding/Encoder, org.kimplify.deci/Deci) // org.kimplify.deci/DeciSerializer.serialize|serialize(kotlinx.serialization.encoding.Encoder;org.kimplify.deci.Deci){}[0] +} + +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/addToAll(org.kimplify.deci/Deci): kotlin.collections/List // org.kimplify.deci.bulk/addToAll|addToAll@kotlin.collections.Iterable(org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/applyPercentageChange(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.bulk/applyPercentageChange|applyPercentageChange@kotlin.collections.Iterable(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/applyToAll(kotlin/Function1): kotlin.collections/List // org.kimplify.deci.bulk/applyToAll|applyToAll@kotlin.collections.Iterable(kotlin.Function1){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/bottomN(kotlin/Int): kotlin.collections/List // org.kimplify.deci.bulk/bottomN|bottomN@kotlin.collections.Iterable(kotlin.Int){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/cumulativeSum(): kotlin.collections/List // org.kimplify.deci.bulk/cumulativeSum|cumulativeSum@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/differences(): kotlin.collections/List // org.kimplify.deci.bulk/differences|differences@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/divideAllBy(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.bulk/divideAllBy|divideAllBy@kotlin.collections.Iterable(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/filterInRange(org.kimplify.deci/Deci, org.kimplify.deci/Deci): kotlin.collections/List // org.kimplify.deci.bulk/filterInRange|filterInRange@kotlin.collections.Iterable(org.kimplify.deci.Deci;org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/filterOutliers(org.kimplify.deci/Deci = ...): kotlin.collections/List // org.kimplify.deci.bulk/filterOutliers|filterOutliers@kotlin.collections.Iterable(org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/groupConsecutiveSimilar(org.kimplify.deci/Deci): kotlin.collections/List> // org.kimplify.deci.bulk/groupConsecutiveSimilar|groupConsecutiveSimilar@kotlin.collections.Iterable(org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/movingAverage(kotlin/Int, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.bulk/movingAverage|movingAverage@kotlin.collections.Iterable(kotlin.Int;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/multiplyAll(): org.kimplify.deci/Deci // org.kimplify.deci.bulk/multiplyAll|multiplyAll@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/multiplyAllBy(org.kimplify.deci/Deci): kotlin.collections/List // org.kimplify.deci.bulk/multiplyAllBy|multiplyAllBy@kotlin.collections.Iterable(org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/normalize(org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.bulk/normalize|normalize@kotlin.collections.Iterable(org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/partitionDeci(kotlin/Function1): kotlin/Pair, kotlin.collections/List> // org.kimplify.deci.bulk/partitionDeci|partitionDeci@kotlin.collections.Iterable(kotlin.Function1){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/roundAll(kotlin/Int, org.kimplify.deci/RoundingMode): kotlin.collections/List // org.kimplify.deci.bulk/roundAll|roundAll@kotlin.collections.Iterable(kotlin.Int;org.kimplify.deci.RoundingMode){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/scaleToSum(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.bulk/scaleToSum|scaleToSum@kotlin.collections.Iterable(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/subtractFromAll(org.kimplify.deci/Deci): kotlin.collections/List // org.kimplify.deci.bulk/subtractFromAll|subtractFromAll@kotlin.collections.Iterable(org.kimplify.deci.Deci){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.bulk/topN(kotlin/Int): kotlin.collections/List // org.kimplify.deci.bulk/topN|topN@kotlin.collections.Iterable(kotlin.Int){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.extension/sumDeci(): org.kimplify.deci/Deci // org.kimplify.deci.extension/sumDeci|sumDeci@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/countWhere(kotlin/Function1): kotlin/Int // org.kimplify.deci.statistics/countWhere|countWhere@kotlin.collections.Iterable(kotlin.Function1){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/harmonicMean(org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/harmonicMean|harmonicMean@kotlin.collections.Iterable(org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/maxDeci(): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/maxDeci|maxDeci@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/mean(org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/mean|mean@kotlin.collections.Iterable(org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/median(org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/median|median@kotlin.collections.Iterable(org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/minDeci(): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/minDeci|minDeci@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/range(): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/range|range@kotlin.collections.Iterable(){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/standardDeviation(kotlin/Boolean = ..., org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/standardDeviation|standardDeviation@kotlin.collections.Iterable(kotlin.Boolean;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/sumOfSquares(org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/sumOfSquares|sumOfSquares@kotlin.collections.Iterable(org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/variance(kotlin/Boolean = ..., org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/variance|variance@kotlin.collections.Iterable(kotlin.Boolean;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin.collections/Iterable).org.kimplify.deci.statistics/weightedAverage(kotlin.collections/List, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci? // org.kimplify.deci.statistics/weightedAverage|weightedAverage@kotlin.collections.Iterable(kotlin.collections.List;org.kimplify.deci.DeciContext){}[0] +final fun (kotlin/Double).org.kimplify.deci.extension/toDeci(): org.kimplify.deci/Deci // org.kimplify.deci.extension/toDeci|toDeci@kotlin.Double(){}[0] +final fun (kotlin/Int).org.kimplify.deci.extension/times(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.extension/times|times@kotlin.Int(org.kimplify.deci.Deci){}[0] +final fun (kotlin/Int).org.kimplify.deci.extension/toDeci(): org.kimplify.deci/Deci // org.kimplify.deci.extension/toDeci|toDeci@kotlin.Int(){}[0] +final fun (kotlin/Long).org.kimplify.deci.extension/times(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.extension/times|times@kotlin.Long(org.kimplify.deci.Deci){}[0] +final fun (kotlin/Long).org.kimplify.deci.extension/toDeci(): org.kimplify.deci/Deci // org.kimplify.deci.extension/toDeci|toDeci@kotlin.Long(){}[0] +final fun (kotlin/String).org.kimplify.deci.extension/toDeci(): org.kimplify.deci/Deci // org.kimplify.deci.extension/toDeci|toDeci@kotlin.String(){}[0] +final fun (kotlin/String).org.kimplify.deci.extension/toDeciOrNull(): org.kimplify.deci/Deci? // org.kimplify.deci.extension/toDeciOrNull|toDeciOrNull@kotlin.String(){}[0] +final fun (kotlin/String).org.kimplify.deci.validation/isValidDeci(): kotlin/Boolean // org.kimplify.deci.validation/isValidDeci|isValidDeci@kotlin.String(){}[0] +final fun (kotlin/String).org.kimplify.deci.validation/toDeciOrError(): kotlin/Result // org.kimplify.deci.validation/toDeciOrError|toDeciOrError@kotlin.String(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/minus(kotlin/Int): org.kimplify.deci/Deci // org.kimplify.deci.extension/minus|minus@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/minus(kotlin/Long): org.kimplify.deci/Deci // org.kimplify.deci.extension/minus|minus@org.kimplify.deci.Deci(kotlin.Long){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/plus(kotlin/Int): org.kimplify.deci/Deci // org.kimplify.deci.extension/plus|plus@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/plus(kotlin/Long): org.kimplify.deci/Deci // org.kimplify.deci.extension/plus|plus@org.kimplify.deci.Deci(kotlin.Long){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/precision(): kotlin/Int // org.kimplify.deci.extension/precision|precision@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/scale(): kotlin/Int // org.kimplify.deci.extension/scale|scale@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/times(kotlin/Int): org.kimplify.deci/Deci // org.kimplify.deci.extension/times|times@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/times(kotlin/Long): org.kimplify.deci/Deci // org.kimplify.deci.extension/times|times@org.kimplify.deci.Deci(kotlin.Long){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toFloat(): kotlin/Float // org.kimplify.deci.extension/toFloat|toFloat@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toInt(): kotlin/Int // org.kimplify.deci.extension/toInt|toInt@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toIntOrNull(): kotlin/Int? // org.kimplify.deci.extension/toIntOrNull|toIntOrNull@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toLong(): kotlin/Long // org.kimplify.deci.extension/toLong|toLong@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toLongExact(): kotlin/Long // org.kimplify.deci.extension/toLongExact|toLongExact@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.extension/toLongOrNull(): kotlin/Long? // org.kimplify.deci.extension/toLongOrNull|toLongOrNull@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/allocate(kotlin/Int, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.financial/allocate|allocate@org.kimplify.deci.Deci(kotlin.Int;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/allocateByRatios(kotlin.collections/List, org.kimplify.deci/DeciContext = ...): kotlin.collections/List // org.kimplify.deci.financial/allocateByRatios|allocateByRatios@org.kimplify.deci.Deci(kotlin.collections.List;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/percentageChangeTo(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/percentageChangeTo|percentageChangeTo@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/preTax(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/preTax|preTax@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/taxAmount(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/taxAmount|taxAmount@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/withDiscount(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/withDiscount|withDiscount@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.financial/withTax(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/withTax|withTax@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/format(kotlin/String): kotlin/String // org.kimplify.deci.formatting/format|format@org.kimplify.deci.Deci(kotlin.String){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/formatAsPercentage(kotlin/Int = ..., kotlin/String = ...): kotlin/String // org.kimplify.deci.formatting/formatAsPercentage|formatAsPercentage@org.kimplify.deci.Deci(kotlin.Int;kotlin.String){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/formatCurrency(kotlin/String = ..., kotlin/Int = ..., kotlin/String = ...): kotlin/String // org.kimplify.deci.formatting/formatCurrency|formatCurrency@org.kimplify.deci.Deci(kotlin.String;kotlin.Int;kotlin.String){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/formatWithThousandsSeparator(kotlin/String = ...): kotlin/String // org.kimplify.deci.formatting/formatWithThousandsSeparator|formatWithThousandsSeparator@org.kimplify.deci.Deci(kotlin.String){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/pad(kotlin/Int, kotlin/Char = ..., kotlin/Boolean = ...): kotlin/String // org.kimplify.deci.formatting/pad|pad@org.kimplify.deci.Deci(kotlin.Int;kotlin.Char;kotlin.Boolean){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/toScientificNotation(kotlin/Int = ...): kotlin/String // org.kimplify.deci.formatting/toScientificNotation|toScientificNotation@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.formatting/toWords(): kotlin/String // org.kimplify.deci.formatting/toWords|toWords@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/mod(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.math/mod|mod@org.kimplify.deci.Deci(org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/pow(org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.math/pow|pow@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/remainder(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.math/remainder|remainder@org.kimplify.deci.Deci(org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/roundToNearest(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.math/roundToNearest|roundToNearest@org.kimplify.deci.Deci(org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/roundToSignificantDigits(kotlin/Int): org.kimplify.deci/Deci // org.kimplify.deci.math/roundToSignificantDigits|roundToSignificantDigits@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.math/sqrt(kotlin/Int = ...): org.kimplify.deci/Deci // org.kimplify.deci.math/sqrt|sqrt@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/clamp(org.kimplify.deci/Deci, org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.validation/clamp|clamp@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/hasValidDecimalPlaces(kotlin/Int): kotlin/Boolean // org.kimplify.deci.validation/hasValidDecimalPlaces|hasValidDecimalPlaces@org.kimplify.deci.Deci(kotlin.Int){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isApproximatelyEqual(org.kimplify.deci/Deci, org.kimplify.deci/Deci = ...): kotlin/Boolean // org.kimplify.deci.validation/isApproximatelyEqual|isApproximatelyEqual@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isEven(): kotlin/Boolean // org.kimplify.deci.validation/isEven|isEven@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isInRange(org.kimplify.deci/Deci, org.kimplify.deci/Deci): kotlin/Boolean // org.kimplify.deci.validation/isInRange|isInRange@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isNonNegative(): kotlin/Boolean // org.kimplify.deci.validation/isNonNegative|isNonNegative@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isOdd(): kotlin/Boolean // org.kimplify.deci.validation/isOdd|isOdd@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isPositiveStrict(): kotlin/Boolean // org.kimplify.deci.validation/isPositiveStrict|isPositiveStrict@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isValidCurrencyAmount(kotlin/String = ...): kotlin/Boolean // org.kimplify.deci.validation/isValidCurrencyAmount|isValidCurrencyAmount@org.kimplify.deci.Deci(kotlin.String){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isValidInterestRate(org.kimplify.deci/Deci = ...): kotlin/Boolean // org.kimplify.deci.validation/isValidInterestRate|isValidInterestRate@org.kimplify.deci.Deci(org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isValidPercentage(kotlin/Boolean = ..., kotlin/Boolean = ...): kotlin/Boolean // org.kimplify.deci.validation/isValidPercentage|isValidPercentage@org.kimplify.deci.Deci(kotlin.Boolean;kotlin.Boolean){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isValidTaxRate(): kotlin/Boolean // org.kimplify.deci.validation/isValidTaxRate|isValidTaxRate@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/isWhole(): kotlin/Boolean // org.kimplify.deci.validation/isWhole|isWhole@org.kimplify.deci.Deci(){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/safeDivide(org.kimplify.deci/Deci, org.kimplify.deci/Deci = ..., org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.validation/safeDivide|safeDivide@org.kimplify.deci.Deci(org.kimplify.deci.Deci;org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun (org.kimplify.deci/Deci).org.kimplify.deci.validation/validateForForm(org.kimplify.deci/Deci? = ..., org.kimplify.deci/Deci? = ..., kotlin/Int? = ..., kotlin/Boolean = ...): org.kimplify.deci.validation/ValidationResult // org.kimplify.deci.validation/validateForForm|validateForForm@org.kimplify.deci.Deci(org.kimplify.deci.Deci?;org.kimplify.deci.Deci?;kotlin.Int?;kotlin.Boolean){}[0] +final fun (org.kimplify.deci/Deci?).org.kimplify.deci.extension/orDefault(org.kimplify.deci/Deci): org.kimplify.deci/Deci // org.kimplify.deci.extension/orDefault|orDefault@org.kimplify.deci.Deci?(org.kimplify.deci.Deci){}[0] +final fun (org.kimplify.deci/Deci?).org.kimplify.deci.extension/orOne(): org.kimplify.deci/Deci // org.kimplify.deci.extension/orOne|orOne@org.kimplify.deci.Deci?(){}[0] +final fun (org.kimplify.deci/Deci?).org.kimplify.deci.extension/orZero(): org.kimplify.deci/Deci // org.kimplify.deci.extension/orZero|orZero@org.kimplify.deci.Deci?(){}[0] +final fun org.kimplify.deci.extension/d(kotlin/Int): org.kimplify.deci/Deci // org.kimplify.deci.extension/d|d(kotlin.Int){}[0] +final fun org.kimplify.deci.extension/d(kotlin/Long): org.kimplify.deci/Deci // org.kimplify.deci.extension/d|d(kotlin.Long){}[0] +final fun org.kimplify.deci.extension/d(kotlin/String): org.kimplify.deci/Deci // org.kimplify.deci.extension/d|d(kotlin.String){}[0] +final fun org.kimplify.deci.financial/grossMargin(org.kimplify.deci/Deci, org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/grossMargin|grossMargin(org.kimplify.deci.Deci;org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] +final fun org.kimplify.deci.financial/markup(org.kimplify.deci/Deci, org.kimplify.deci/Deci, org.kimplify.deci/DeciContext = ...): org.kimplify.deci/Deci // org.kimplify.deci.financial/markup|markup(org.kimplify.deci.Deci;org.kimplify.deci.Deci;org.kimplify.deci.DeciContext){}[0] + +// Targets: [js, wasmJs] +final class org.kimplify.deci/DecimalJs { // org.kimplify.deci/DecimalJs|null[0] + constructor (kotlin/String) // org.kimplify.deci/DecimalJs.|(kotlin.String){}[0] + + final fun abs(): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.abs|abs(){}[0] + final fun add(org.kimplify.deci/DecimalJs): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.add|add(org.kimplify.deci.DecimalJs){}[0] + final fun comparedTo(org.kimplify.deci/DecimalJs): kotlin/Int // org.kimplify.deci/DecimalJs.comparedTo|comparedTo(org.kimplify.deci.DecimalJs){}[0] + final fun div(org.kimplify.deci/DecimalJs): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.div|div(org.kimplify.deci.DecimalJs){}[0] + final fun isNegative(): kotlin/Boolean // org.kimplify.deci/DecimalJs.isNegative|isNegative(){}[0] + final fun isPositive(): kotlin/Boolean // org.kimplify.deci/DecimalJs.isPositive|isPositive(){}[0] + final fun isZero(): kotlin/Boolean // org.kimplify.deci/DecimalJs.isZero|isZero(){}[0] + final fun mul(org.kimplify.deci/DecimalJs): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.mul|mul(org.kimplify.deci.DecimalJs){}[0] + final fun neg(): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.neg|neg(){}[0] + final fun sub(org.kimplify.deci/DecimalJs): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.sub|sub(org.kimplify.deci.DecimalJs){}[0] + final fun toDecimalPlaces(kotlin/Int, kotlin/Int): org.kimplify.deci/DecimalJs // org.kimplify.deci/DecimalJs.toDecimalPlaces|toDecimalPlaces(kotlin.Int;kotlin.Int){}[0] + final fun toFixed(): kotlin/String // org.kimplify.deci/DecimalJs.toFixed|toFixed(){}[0] + final fun toFixed(kotlin/Int): kotlin/String // org.kimplify.deci/DecimalJs.toFixed|toFixed(kotlin.Int){}[0] + final fun toNumber(): kotlin/Double // org.kimplify.deci/DecimalJs.toNumber|toNumber(){}[0] + final fun toString(): kotlin/String // org.kimplify.deci/DecimalJs.toString|toString(){}[0] +} diff --git a/deci/api/jvm/deci.api b/deci/api/jvm/deci.api index d1bd540..d7008be 100644 --- a/deci/api/jvm/deci.api +++ b/deci/api/jvm/deci.api @@ -104,8 +104,6 @@ public final class org/kimplify/deci/bulk/DeciBulkOperationsKt { public static final fun applyPercentageChange (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;)Ljava/util/List; public static synthetic fun applyPercentageChange$default (Ljava/lang/Iterable;Lorg/kimplify/deci/Deci;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Ljava/util/List; public static final fun applyToAll (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun averageDeci (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;)Lorg/kimplify/deci/Deci; - public static synthetic fun averageDeci$default (Ljava/lang/Iterable;Lorg/kimplify/deci/DeciContext;ILjava/lang/Object;)Lorg/kimplify/deci/Deci; public static final fun bottomN (Ljava/lang/Iterable;I)Ljava/util/List; public static final fun cumulativeSum (Ljava/lang/Iterable;)Ljava/util/List; public static final fun differences (Ljava/lang/Iterable;)Ljava/util/List; @@ -132,26 +130,10 @@ public final class org/kimplify/deci/bulk/DeciBulkOperationsKt { public final class org/kimplify/deci/config/DeciConfiguration { public static final field INSTANCE Lorg/kimplify/deci/config/DeciConfiguration; public final fun disableLogging ()V - public final fun getDivisionPolicy ()Lorg/kimplify/deci/config/DeciDivisionPolicy; public final fun getLogSink ()Lorg/kimplify/deci/logging/DeciLogSink; - public final fun resetDivisionPolicy ()V - public final fun setDivisionPolicy (Lorg/kimplify/deci/config/DeciDivisionPolicy;)V public final fun setLogSink (Lorg/kimplify/deci/logging/DeciLogSink;)V } -public final class org/kimplify/deci/config/DeciDivisionPolicy { - public fun (ILorg/kimplify/deci/RoundingMode;)V - public final fun component1 ()I - public final fun component2 ()Lorg/kimplify/deci/RoundingMode; - public final fun copy (ILorg/kimplify/deci/RoundingMode;)Lorg/kimplify/deci/config/DeciDivisionPolicy; - public static synthetic fun copy$default (Lorg/kimplify/deci/config/DeciDivisionPolicy;ILorg/kimplify/deci/RoundingMode;ILjava/lang/Object;)Lorg/kimplify/deci/config/DeciDivisionPolicy; - public fun equals (Ljava/lang/Object;)Z - public final fun getFractionalDigits ()I - public final fun getRoundingMode ()Lorg/kimplify/deci/RoundingMode; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - public class org/kimplify/deci/exception/DeciArithmeticException : org/kimplify/deci/exception/DeciException { public fun (Ljava/lang/String;Ljava/lang/Throwable;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -164,7 +146,6 @@ public final class org/kimplify/deci/exception/DeciDivisionByZeroException : org } public abstract class org/kimplify/deci/exception/DeciException : java/lang/RuntimeException { - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;Lkotlin/jvm/internal/DefaultConstructorMarker;)V } diff --git a/deci/src/androidMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/androidMain/kotlin/org/kimplify/deci/Deci.kt index e22f0bd..bfbf551 100644 --- a/deci/src/androidMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/androidMain/kotlin/org/kimplify/deci/Deci.kt @@ -1,7 +1,6 @@ package org.kimplify.deci import kotlinx.serialization.Serializable -import org.kimplify.deci.config.DeciConfiguration import org.kimplify.deci.exception.DeciArithmeticException import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciScaleException @@ -50,17 +49,7 @@ actual class Deci( actual operator fun times(other: Deci): Deci = operate(other) { a, b, _ -> a.multiply(b) } @Throws(DeciDivisionByZeroException::class, DeciArithmeticException::class) - actual operator fun div(other: Deci): Deci { - if (other.isZero()) throw DeciDivisionByZeroException() - return try { - operate(other) { a, b, _ -> - val policy = DeciConfiguration.divisionPolicy - a.divide(b, policy.fractionalDigits, convert(policy.roundingMode)) - } - } catch (_: ArithmeticException) { - throw DeciArithmeticException("Division produced a non-terminating decimal expansion") - } - } + actual operator fun div(other: Deci): Deci = divide(other, DeciContext.DEFAULT) actual operator fun rem(other: Deci): Deci { if (other.isZero()) throw DeciDivisionByZeroException() diff --git a/deci/src/appleMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/appleMain/kotlin/org/kimplify/deci/Deci.kt index 647d117..0dde1a0 100644 --- a/deci/src/appleMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/appleMain/kotlin/org/kimplify/deci/Deci.kt @@ -3,7 +3,6 @@ package org.kimplify.deci import kotlinx.cinterop.BetaInteropApi import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.serialization.Serializable -import org.kimplify.deci.config.DeciConfiguration import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciScaleException import org.kimplify.deci.parser.extractScale @@ -108,21 +107,7 @@ actual class Deci private constructor( actual operator fun times(other: Deci): Deci = operate(other) { a, b, _ -> a.decimalNumberByMultiplyingBy(b) } - actual operator fun div(other: Deci): Deci { - if (other.isZero()) throw DeciDivisionByZeroException() - val raw = internal.decimalNumberByDividingBy(other.internal) - val policy = DeciConfiguration.divisionPolicy - val handler = - NSDecimalNumberHandler( - toNativeMode(policy.roundingMode), - scale = policy.fractionalDigits.toShort(), - raiseOnExactness = false, - raiseOnOverflow = false, - raiseOnUnderflow = false, - raiseOnDivideByZero = false, - ) - return Deci(raw.decimalNumberByRoundingAccordingToBehavior(handler), policy.fractionalDigits) - } + actual operator fun div(other: Deci): Deci = divide(other, DeciContext.DEFAULT) actual fun divide( other: Deci, diff --git a/deci/src/commonMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/commonMain/kotlin/org/kimplify/deci/Deci.kt index d7ee8d4..f76ef53 100644 --- a/deci/src/commonMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/commonMain/kotlin/org/kimplify/deci/Deci.kt @@ -67,9 +67,9 @@ expect class Deci : Comparable { operator fun times(other: Deci): Deci /** - * Divides this value by [other] using the global [DeciConfiguration.divisionPolicy][org.kimplify.deci.config.DeciConfiguration.divisionPolicy]. + * Divides this value by [other] using [DeciContext.DEFAULT]. * - * By default the result is rounded to 20 fractional digits with [RoundingMode.HALF_UP]. + * The result is rounded to 20 fractional digits with [RoundingMode.HALF_UP]. * For explicit control over scale and rounding, use [divide] with a [DeciContext] or * explicit `scale`/`roundingMode` parameters instead. * diff --git a/deci/src/commonMain/kotlin/org/kimplify/deci/DeciContext.kt b/deci/src/commonMain/kotlin/org/kimplify/deci/DeciContext.kt index 23f4afe..de34204 100644 --- a/deci/src/commonMain/kotlin/org/kimplify/deci/DeciContext.kt +++ b/deci/src/commonMain/kotlin/org/kimplify/deci/DeciContext.kt @@ -24,7 +24,7 @@ data class DeciContext( companion object { /** * Default context: 20 fractional digits with [RoundingMode.HALF_UP]. - * Matches the default [org.kimplify.deci.config.DeciDivisionPolicy]. + * Used by the [Deci] division operator (`/`) when no explicit context is supplied. */ val DEFAULT = DeciContext( diff --git a/deci/src/commonMain/kotlin/org/kimplify/deci/bulk/DeciBulkOperations.kt b/deci/src/commonMain/kotlin/org/kimplify/deci/bulk/DeciBulkOperations.kt index adb97a1..351b4c1 100644 --- a/deci/src/commonMain/kotlin/org/kimplify/deci/bulk/DeciBulkOperations.kt +++ b/deci/src/commonMain/kotlin/org/kimplify/deci/bulk/DeciBulkOperations.kt @@ -13,26 +13,6 @@ import org.kimplify.deci.extension.sumDeci */ fun Iterable.multiplyAll(): Deci = this.fold(Deci.ONE) { acc, value -> acc * value } -/** - * Calculates the average of the collection. - * - * Division is performed using the supplied [context] for scale and rounding. - * By default, [DeciContext.DEFAULT] (20 fractional digits, [RoundingMode.HALF_UP]) is used. - * - * @param context The [DeciContext] controlling precision and rounding of the division. - * @return The average value, or null if collection is empty. - */ -@Deprecated( - message = "Use mean() from org.kimplify.deci.statistics instead", - replaceWith = ReplaceWith("mean(context)", "org.kimplify.deci.statistics.mean"), - level = DeprecationLevel.WARNING, -) -fun Iterable.averageDeci(context: DeciContext = DeciContext.DEFAULT): Deci? { - val values = this.toList() - if (values.isEmpty()) return null - return values.sumDeci().divide(Deci(values.size), context) -} - /** * Applies the same operation to all values in the collection. * diff --git a/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciConfiguration.kt b/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciConfiguration.kt new file mode 100644 index 0000000..606e725 --- /dev/null +++ b/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciConfiguration.kt @@ -0,0 +1,30 @@ +package org.kimplify.deci.config + +import org.kimplify.deci.logging.DeciLogSink +import kotlin.concurrent.Volatile + +/** + * Global configuration entry point for Deci. + * + * **Note:** This object contains mutable state. Changes to [logSink] are + * thread-safe via @Volatile but not reactive. + */ +object DeciConfiguration { + /** + * Consumer-provided log sink for literal normalization and validation events. + * Leave `null` (default) to skip log emission entirely. + * + * ```kotlin + * DeciConfiguration.logSink = DeciLogSink { tag, message -> + * println("[$tag] $message") + * } + * ``` + */ + @Volatile + var logSink: DeciLogSink? = null + + /** Removes the installed log sink, disabling all Deci logging. */ + fun disableLogging() { + logSink = null + } +} diff --git a/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciDivisionPolicy.kt b/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciDivisionPolicy.kt deleted file mode 100644 index 99a5c01..0000000 --- a/deci/src/commonMain/kotlin/org/kimplify/deci/config/DeciDivisionPolicy.kt +++ /dev/null @@ -1,67 +0,0 @@ -package org.kimplify.deci.config - -import org.kimplify.deci.RoundingMode -import org.kimplify.deci.logging.DeciLogSink -import kotlin.concurrent.Volatile - -/** - * Describes the default scale and rounding strategy applied by the `Deci` division operator. - * - * @property fractionalDigits Number of digits to keep to the right of the decimal separator. - * @property roundingMode Rounding mode used when trimming to [fractionalDigits]. - */ -data class DeciDivisionPolicy( - val fractionalDigits: Int, - val roundingMode: RoundingMode, -) { - init { - require(fractionalDigits >= 0) { - "fractionalDigits must be zero or positive (was $fractionalDigits)" - } - } -} - -/** - * Global configuration entry point for Deci. Consumers can override the default - * division scale to align with domain-specific requirements. - * - * **Note:** This object contains mutable state. Changes to [divisionPolicy] or - * [logSink] are thread-safe via @Volatile but not reactive. - */ -object DeciConfiguration { - private val defaultDivisionPolicy = - DeciDivisionPolicy( - fractionalDigits = 20, - roundingMode = RoundingMode.HALF_UP, - ) - - @Deprecated( - message = "Use DeciContext and the divide(other, context) overload instead.", - replaceWith = ReplaceWith("DeciContext", "org.kimplify.deci.DeciContext"), - ) - @Volatile - var divisionPolicy: DeciDivisionPolicy = defaultDivisionPolicy - - /** - * Consumer-provided log sink for literal normalization and validation events. - * Leave `null` (default) to skip log emission entirely. - * - * ```kotlin - * DeciConfiguration.logSink = DeciLogSink { tag, message -> - * println("[$tag] $message") - * } - * ``` - */ - @Volatile - var logSink: DeciLogSink? = null - - /** Restores [divisionPolicy] to its library default values. */ - fun resetDivisionPolicy() { - divisionPolicy = defaultDivisionPolicy - } - - /** Removes the installed log sink, disabling all Deci logging. */ - fun disableLogging() { - logSink = null - } -} diff --git a/deci/src/commonTest/kotlin/org/kimplify/deci/DeciTest.kt b/deci/src/commonTest/kotlin/org/kimplify/deci/DeciTest.kt index fed1834..8dfa52e 100644 --- a/deci/src/commonTest/kotlin/org/kimplify/deci/DeciTest.kt +++ b/deci/src/commonTest/kotlin/org/kimplify/deci/DeciTest.kt @@ -1,8 +1,6 @@ package org.kimplify.deci import kotlinx.serialization.json.Json -import org.kimplify.deci.config.DeciConfiguration -import org.kimplify.deci.config.DeciDivisionPolicy import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciParseException import org.kimplify.deci.exception.DeciScaleException @@ -31,19 +29,9 @@ class DeciTest { } @Test - fun `division policy can be customized and reset`() { - DeciConfiguration.divisionPolicy = - DeciDivisionPolicy( - fractionalDigits = 2, - roundingMode = RoundingMode.DOWN, - ) - + fun `division operator uses the default context`() { val result = Deci("1") / Deci("3") - assertEquals("0.33", result.toString()) - - DeciConfiguration.resetDivisionPolicy() - val defaultResult = Deci("1") / Deci("3") - assertEquals("0.33333333333333333333", defaultResult.toString()) + assertEquals("0.33333333333333333333", result.toString()) } @Test diff --git a/deci/src/commonTest/kotlin/org/kimplify/deci/bulk/DeciBulkOperationsTest.kt b/deci/src/commonTest/kotlin/org/kimplify/deci/bulk/DeciBulkOperationsTest.kt index 23ea7b3..8137ed6 100644 --- a/deci/src/commonTest/kotlin/org/kimplify/deci/bulk/DeciBulkOperationsTest.kt +++ b/deci/src/commonTest/kotlin/org/kimplify/deci/bulk/DeciBulkOperationsTest.kt @@ -7,7 +7,6 @@ import org.kimplify.deci.exception.DeciDivisionByZeroException import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith -import kotlin.test.assertNull import kotlin.test.assertTrue class DeciBulkOperationsTest { @@ -55,52 +54,6 @@ class DeciBulkOperationsTest { assertEquals(Deci("6"), result) } - // --- averageDeci --- - - @Test - fun `averageDeci returns null for empty collection`() { - val result = emptyList().averageDeci() - assertNull(result) - } - - @Test - fun `averageDeci returns value for single element`() { - val result = listOf(Deci("10")).averageDeci() - assertEquals(Deci("10"), result) - } - - @Test - fun `averageDeci calculates average correctly`() { - val result = listOf(Deci("1"), Deci("2"), Deci("3")).averageDeci() - assertEquals(Deci("2"), result) - } - - @Test - fun `averageDeci handles decimal values`() { - val result = listOf(Deci("1.5"), Deci("2.5")).averageDeci() - assertEquals(Deci("2"), result) - } - - @Test - fun `averageDeci handles negative values`() { - val result = listOf(Deci("-10"), Deci("10")).averageDeci() - assertEquals(Deci("0"), result) - } - - @Test - fun `averageDeci uses provided context for division`() { - val context = DeciContext(precision = 2, roundingMode = RoundingMode.DOWN) - val result = listOf(Deci("1"), Deci("2"), Deci("3")).averageDeci(context) - assertEquals(Deci("2"), result) - } - - @Test - fun `averageDeci with non-terminating result uses context rounding`() { - val context = DeciContext(precision = 2, roundingMode = RoundingMode.HALF_UP) - val result = listOf(Deci("1"), Deci("1"), Deci("2")).averageDeci(context) - assertEquals(Deci("1.33"), result) - } - // --- applyToAll --- @Test diff --git a/deci/src/jsMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/jsMain/kotlin/org/kimplify/deci/Deci.kt index 6af7e05..cb8edcb 100644 --- a/deci/src/jsMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/jsMain/kotlin/org/kimplify/deci/Deci.kt @@ -1,7 +1,6 @@ package org.kimplify.deci import kotlinx.serialization.Serializable -import org.kimplify.deci.config.DeciConfiguration import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciScaleException import org.kimplify.deci.parser.extractScale @@ -39,13 +38,7 @@ actual class Deci private constructor( actual operator fun times(other: Deci): Deci = Deci(internal.mul(other.internal)) - actual operator fun div(other: Deci): Deci { - if (other.isZero()) throw DeciDivisionByZeroException() - val policy = DeciConfiguration.divisionPolicy - val raw = internal.div(other.internal) - val rounded = raw.toDecimalPlaces(policy.fractionalDigits, convert(policy.roundingMode)) - return Deci(rounded, policy.fractionalDigits) - } + actual operator fun div(other: Deci): Deci = divide(other, DeciContext.DEFAULT) actual operator fun rem(other: Deci): Deci { if (other.isZero()) throw DeciDivisionByZeroException() diff --git a/deci/src/jvmMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/jvmMain/kotlin/org/kimplify/deci/Deci.kt index e22f0bd..bfbf551 100644 --- a/deci/src/jvmMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/jvmMain/kotlin/org/kimplify/deci/Deci.kt @@ -1,7 +1,6 @@ package org.kimplify.deci import kotlinx.serialization.Serializable -import org.kimplify.deci.config.DeciConfiguration import org.kimplify.deci.exception.DeciArithmeticException import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciScaleException @@ -50,17 +49,7 @@ actual class Deci( actual operator fun times(other: Deci): Deci = operate(other) { a, b, _ -> a.multiply(b) } @Throws(DeciDivisionByZeroException::class, DeciArithmeticException::class) - actual operator fun div(other: Deci): Deci { - if (other.isZero()) throw DeciDivisionByZeroException() - return try { - operate(other) { a, b, _ -> - val policy = DeciConfiguration.divisionPolicy - a.divide(b, policy.fractionalDigits, convert(policy.roundingMode)) - } - } catch (_: ArithmeticException) { - throw DeciArithmeticException("Division produced a non-terminating decimal expansion") - } - } + actual operator fun div(other: Deci): Deci = divide(other, DeciContext.DEFAULT) actual operator fun rem(other: Deci): Deci { if (other.isZero()) throw DeciDivisionByZeroException() diff --git a/deci/src/wasmJsMain/kotlin/org/kimplify/deci/Deci.kt b/deci/src/wasmJsMain/kotlin/org/kimplify/deci/Deci.kt index 6af7e05..cb8edcb 100644 --- a/deci/src/wasmJsMain/kotlin/org/kimplify/deci/Deci.kt +++ b/deci/src/wasmJsMain/kotlin/org/kimplify/deci/Deci.kt @@ -1,7 +1,6 @@ package org.kimplify.deci import kotlinx.serialization.Serializable -import org.kimplify.deci.config.DeciConfiguration import org.kimplify.deci.exception.DeciDivisionByZeroException import org.kimplify.deci.exception.DeciScaleException import org.kimplify.deci.parser.extractScale @@ -39,13 +38,7 @@ actual class Deci private constructor( actual operator fun times(other: Deci): Deci = Deci(internal.mul(other.internal)) - actual operator fun div(other: Deci): Deci { - if (other.isZero()) throw DeciDivisionByZeroException() - val policy = DeciConfiguration.divisionPolicy - val raw = internal.div(other.internal) - val rounded = raw.toDecimalPlaces(policy.fractionalDigits, convert(policy.roundingMode)) - return Deci(rounded, policy.fractionalDigits) - } + actual operator fun div(other: Deci): Deci = divide(other, DeciContext.DEFAULT) actual operator fun rem(other: Deci): Deci { if (other.isZero()) throw DeciDivisionByZeroException() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0218c4a..72a222f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -version = "0.2.2" +version = "0.3.0" kotlin = "2.4.0" agp = "9.2.1" @@ -11,7 +11,6 @@ kotlinx-coroutines = "1.11.0" kotlinx-serialization = "1.11.0" androidx-activityCompose = "1.13.0" ktlint-plugin = "14.2.0" -binary-compatibility-validator = "0.18.1" kotest = "6.1.11" [libraries] @@ -29,7 +28,6 @@ kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } ktlint-gradle-plugin = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlint-plugin" } -bcv-gradle-plugin = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "binary-compatibility-validator" } [plugins]