diff --git a/arrow-libs/optics/arrow-optics/api/arrow-optics.api b/arrow-libs/optics/arrow-optics/api/arrow-optics.api index aa6ac451a63..970a6993266 100644 --- a/arrow-libs/optics/arrow-optics/api/arrow-optics.api +++ b/arrow-libs/optics/arrow-optics/api/arrow-optics.api @@ -151,6 +151,9 @@ public final class arrow/optics/ListKt { public static final fun unsnoc (Ljava/util/List;)Lkotlin/Pair; } +public abstract interface annotation class arrow/optics/OpticsCopyMarker : java/lang/annotation/Annotation { +} + public final class arrow/optics/OptionalGetterKt { public static final fun OptionalGetter (Lkotlin/jvm/functions/Function1;)Larrow/optics/POptionalGetter; } diff --git a/arrow-libs/optics/arrow-optics/src/commonMain/kotlin/arrow/optics/Copy.kt b/arrow-libs/optics/arrow-optics/src/commonMain/kotlin/arrow/optics/Copy.kt index 5b231df3623..87a21dfd257 100644 --- a/arrow-libs/optics/arrow-optics/src/commonMain/kotlin/arrow/optics/Copy.kt +++ b/arrow-libs/optics/arrow-optics/src/commonMain/kotlin/arrow/optics/Copy.kt @@ -1,5 +1,11 @@ package arrow.optics +import kotlin.experimental.ExperimentalTypeInference + +@DslMarker +public annotation class OpticsCopyMarker + +@OpticsCopyMarker public interface Copy { /** * Changes the value of the element(s) pointed by the [Setter]. @@ -33,7 +39,8 @@ public interface Copy { * } * ``` */ - public fun inside(field: Traversal, f: Copy.() -> Unit): Unit = + @OptIn(ExperimentalTypeInference::class) + public fun inside(field: Traversal, @BuilderInference f: Copy.() -> Unit): Unit = field.transform { it.copy(f) } } @@ -67,5 +74,6 @@ private class CopyImpl(var current: A): Copy { * } * ``` */ -public fun A.copy(f: Copy.() -> Unit): A = +@OptIn(ExperimentalTypeInference::class) +public fun A.copy(@BuilderInference f: Copy.() -> Unit): A = CopyImpl(this).also(f).current