Replace LayoutModifer.foldIn with foldRight

Also updates the docs to clarify the methods intention.
Bug: 390430024
RelNote: LayoutModfier.foldIn is now called foldRight to better reflect its expected behaviour

Change-Id: Idf242cd95d2488992ceefd1527bea8a24a3c58ab
diff --git a/wear/protolayout/protolayout/api/current.txt b/wear/protolayout/protolayout/api/current.txt
index da4e766..d41f32c 100644
--- a/wear/protolayout/protolayout/api/current.txt
+++ b/wear/protolayout/protolayout/api/current.txt
@@ -1564,17 +1564,17 @@
   }
 
   public interface LayoutModifier {
-    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
     method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
     field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
   }
 
   public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
   }
 
   public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public default <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
   }
 
   public final class ModifierAppliersKt {
diff --git a/wear/protolayout/protolayout/api/restricted_current.txt b/wear/protolayout/protolayout/api/restricted_current.txt
index da4e766..d41f32c 100644
--- a/wear/protolayout/protolayout/api/restricted_current.txt
+++ b/wear/protolayout/protolayout/api/restricted_current.txt
@@ -1564,17 +1564,17 @@
   }
 
   public interface LayoutModifier {
-    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
     method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
     field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
   }
 
   public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
   }
 
   public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
-    method public default <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+    method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
   }
 
   public final class ModifierAppliersKt {
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
index 322861d..89df3a3 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
@@ -115,7 +115,7 @@
 ): LayoutModifier = this then BaseCornerElement(bottomRightRadius = cornerRadius(x, y))
 
 internal class BaseBackgroundElement(val color: LayoutColor) : LayoutModifier.Element {
-    fun foldIn(initial: Background.Builder?): Background.Builder =
+    fun mergeTo(initial: Background.Builder?): Background.Builder =
         (initial ?: Background.Builder()).setColor(color.prop)
 }
 
@@ -127,7 +127,7 @@
     @RequiresSchemaVersion(major = 1, minor = 400) val bottomRightRadius: CornerRadius? = null
 ) : LayoutModifier.Element {
     @SuppressLint("ProtoLayoutMinSchema")
-    fun foldIn(initial: Corner.Builder?): Corner.Builder =
+    fun mergeTo(initial: Corner.Builder?): Corner.Builder =
         (initial ?: Corner.Builder()).apply {
             cornerRadiusDp?.let { setRadius(cornerRadiusDp.dp) }
             topLeftRadius?.let { setTopLeftRadius(cornerRadius(it.x.value, it.y.value)) }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
index d3fca75..47e1ec1 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
@@ -33,6 +33,6 @@
 
 internal class BaseBorderElement(@Dimension(DP) val width: Float, val color: LayoutColor) :
     LayoutModifier.Element {
-    fun foldIn(initial: Border.Builder?): Border.Builder =
+    fun mergeTo(initial: Border.Builder?): Border.Builder =
         (initial ?: Border.Builder()).setWidth(width.dp).setColor(color.prop)
 }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
index da4d74f..a807b15 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
@@ -122,7 +122,7 @@
     @Dimension(DP) val minClickableHeight: Float = Float.NaN,
 ) : LayoutModifier.Element {
     @SuppressLint("ProtoLayoutMinSchema")
-    fun foldIn(initial: Clickable.Builder?): Clickable.Builder =
+    fun mergeTo(initial: Clickable.Builder?): Clickable.Builder =
         (initial ?: Clickable.Builder()).apply {
             if (!id.isNullOrEmpty()) setId(id)
             action?.let { setOnClick(it) }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
index 74657a0..468ef56 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.wear.protolayout.modifiers
 
+import androidx.wear.protolayout.modifiers.LayoutModifier.Element
 import java.util.Objects
 
 /**
@@ -28,14 +29,12 @@
 interface LayoutModifier {
     /**
      * Accumulates a value starting with [initial] and applying [operation] to the current value and
-     * each element from outside in.
+     * each element from left to right.
      *
-     * Elements wrap one another in a chain from left to right; an [Element] that appears to the
-     * left of another in a `+` expression or in [operation]'s parameter order affects all of the
-     * elements that appear after it. [foldIn] may be used to accumulate a value starting from the
-     * parent or head of the modifier chain to the final wrapped child.
+     * [foldRight] may be used to accumulate a value starting from the head of the modifier chain to
+     * the final modifier element.
      */
-    fun <R> foldIn(initial: R, operation: (R, Element) -> R): R
+    fun <R> foldRight(initial: R, operation: (R, Element) -> R): R
 
     /**
      * Concatenates this modifier with another.
@@ -47,7 +46,7 @@
 
     /** A single element contained within a [LayoutModifier] chain. */
     interface Element : LayoutModifier {
-        override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R =
+        override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R =
             operation(initial, this)
     }
 
@@ -58,7 +57,7 @@
      */
     companion object : LayoutModifier {
         @Suppress("MissingJvmstatic")
-        override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initial
+        override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R = initial
 
         @Suppress("MissingJvmstatic")
         override infix fun then(other: LayoutModifier): LayoutModifier = other
@@ -68,24 +67,24 @@
 }
 
 /**
- * A node in a [LayoutModifier] chain. A CombinedModifier always contains at least two elements; a
- * * Modifier [outer] that wraps around the Modifier [inner].
+ * A node in a [LayoutModifier] chain. A [CombinedLayoutModifier] always contains at least two
+ * elements.
  */
 internal class CombinedLayoutModifier(
-    private val outer: LayoutModifier,
-    private val inner: LayoutModifier
+    private val left: LayoutModifier,
+    private val right: LayoutModifier
 ) : LayoutModifier {
-    override fun <R> foldIn(initial: R, operation: (R, LayoutModifier.Element) -> R): R =
-        inner.foldIn(outer.foldIn(initial, operation), operation)
+    override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R =
+        right.foldRight(left.foldRight(initial, operation), operation)
 
     override fun equals(other: Any?): Boolean =
-        other is CombinedLayoutModifier && outer == other.outer && inner == other.inner
+        other is CombinedLayoutModifier && left == other.left && right == other.right
 
-    override fun hashCode(): Int = Objects.hash(outer, inner)
+    override fun hashCode(): Int = Objects.hash(left, right)
 
     override fun toString(): String =
         "[" +
-            foldIn("") { acc, element ->
+            foldRight("") { acc, element ->
                 if (acc.isEmpty()) element.toString() else "$acc, $element"
             } +
             "]"
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
index 9c0f8ca..7fb3fb2 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
@@ -35,6 +35,6 @@
 fun LayoutModifier.tag(tag: String): LayoutModifier = tag(tag.toByteArray())
 
 internal class BaseMetadataElement(val tagData: ByteArray) : LayoutModifier.Element {
-    fun foldIn(initial: ElementMetadata.Builder?): ElementMetadata.Builder =
+    fun mergeTo(initial: ElementMetadata.Builder?): ElementMetadata.Builder =
         (initial ?: ElementMetadata.Builder()).setTagData(tagData)
 }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
index aee3599..af956d0 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
@@ -44,17 +44,17 @@
     var visible: BoolProp.Builder? = null
     var opacity: FloatProp.Builder? = null
 
-    this.foldIn(Unit) { _, e ->
+    this.foldRight(Unit) { _, e ->
         when (e) {
-            is BaseSemanticElement -> semantics = e.foldIn(semantics)
-            is BaseBackgroundElement -> background = e.foldIn(background)
-            is BaseCornerElement -> corners = e.foldIn(corners)
-            is BaseClickableElement -> clickable = e.foldIn(clickable)
-            is BasePaddingElement -> padding = e.foldIn(padding)
-            is BaseMetadataElement -> metadata = e.foldIn(metadata)
-            is BaseBorderElement -> border = e.foldIn(border)
-            is BaseVisibilityElement -> visible = e.foldIn(visible)
-            is BaseOpacityElement -> opacity = e.foldIn(opacity)
+            is BaseSemanticElement -> semantics = e.mergeTo(semantics)
+            is BaseBackgroundElement -> background = e.mergeTo(background)
+            is BaseCornerElement -> corners = e.mergeTo(corners)
+            is BaseClickableElement -> clickable = e.mergeTo(clickable)
+            is BasePaddingElement -> padding = e.mergeTo(padding)
+            is BaseMetadataElement -> metadata = e.mergeTo(metadata)
+            is BaseBorderElement -> border = e.mergeTo(border)
+            is BaseVisibilityElement -> visible = e.mergeTo(visible)
+            is BaseOpacityElement -> opacity = e.mergeTo(opacity)
         }
     }
 
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
index eeafb8f9..e8d6f3d 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
@@ -42,7 +42,7 @@
 internal class BaseOpacityElement(val staticValue: Float, val dynamicValue: DynamicFloat? = null) :
     LayoutModifier.Element {
     @SuppressLint("ProtoLayoutMinSchema")
-    fun foldIn(initial: FloatProp.Builder?): FloatProp.Builder =
+    fun mergeTo(initial: FloatProp.Builder?): FloatProp.Builder =
         (initial ?: FloatProp.Builder(staticValue)).apply {
             dynamicValue?.let { setDynamicValue(it) }
         }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
index 050b8ce..af7df74 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
@@ -139,7 +139,7 @@
     val rtlAware: Boolean = true
 ) : LayoutModifier.Element {
 
-    fun foldIn(initial: Padding.Builder?): Padding.Builder =
+    fun mergeTo(initial: Padding.Builder?): Padding.Builder =
         (initial ?: Padding.Builder()).apply {
             if (!start.isNaN()) {
                 setStart(start.dp)
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
index d77f5e3..7d1b332 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
@@ -58,7 +58,7 @@
     @SemanticsRole val semanticsRole: Int = SEMANTICS_ROLE_NONE
 ) : LayoutModifier.Element {
     @SuppressLint("ProtoLayoutMinSchema")
-    fun foldIn(initial: Semantics.Builder?): Semantics.Builder =
+    fun mergeTo(initial: Semantics.Builder?): Semantics.Builder =
         (initial ?: Semantics.Builder()).apply {
             contentDescription?.let { setContentDescription(it) }
             if (semanticsRole != SEMANTICS_ROLE_NONE) {
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
index b7eabd7..cb1596ab3 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
@@ -46,7 +46,7 @@
     val dynamicVisibility: DynamicBool? = null
 ) : LayoutModifier.Element {
     @SuppressLint("ProtoLayoutMinSchema")
-    fun foldIn(initial: BoolProp.Builder?): BoolProp.Builder =
+    fun mergeTo(initial: BoolProp.Builder?): BoolProp.Builder =
         (initial ?: BoolProp.Builder(visibility)).apply {
             dynamicVisibility?.let { setDynamicValue(it) }
         }