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