// Copyright 2026 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.starlark.java.eval;

/** An interface for Starlark values that can be mutated in-place to reduce memory usage. */
public interface Compactable extends StarlarkValue {
  /**
   * Mutates this value in-place to reduce memory usage, and returns an optimized value (which might
   * be the same as this instance).
   *
   * <p>This operation is not protected by the mutability mechanism. It is the caller's
   * responsibility to ensure this value is not concurrently accessed during this method's
   * execution.
   *
   * <p>The mutated value and the returned value are both equivalent to the original value.
   *
   * <p>If this value is {@link Freezable}, its {@link Freezable#mutability} must be frozen prior to
   * calling this method.
   */
  StarlarkValue unsafeOptimizeMemoryLayout();
}
