hunk.code_window:         show_spinner: bool | str,
           persist: CachePersistType | bool,
           experimental_allow_widgets: bool,
       ):
           """Decorator to cache functions that return data (e.g. dataframe transforms,
           database queries, ML inference).
           Cached objects are stored in "pickled" form, which means that the return
           value of a cached function must be pickleable. Each caller of the cached
  
hunk.labels: keep keep keep keep replace replace keep keep keep
hunk.after_edit:         """Decorator to cache functions that return data (e.g. dataframe transforms, database queries, ML inference).
  
hunk.file_path: lib/streamlit/runtime/caching/cache_data_api.py
hunk.type: replace
file: /**
   * Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022)
   *
   * 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.
   */
  
  /**
   * A promise wrapper that makes resolve/reject functions public.
   */
  export default class Resolver<T> {
    public resolve: (value: T | PromiseLike<T>) => void
  
    public reject: (reason?: any) => void | Promise<any>
  
    public promise: Promise<T>
  
    constructor() {
      // Initialize to something so TS is happy.
      this.resolve = () => {}
      this.reject = () => {}
  
      this.promise = new Promise<T>((resFn, rejFn) => {
        this.resolve = resFn
        this.reject = rejFn
      })
    }
  }
  