// Signature format: 3.0
package androidx.datastore {

  public interface DataStore<T> {
    method public kotlinx.coroutines.flow.Flow<T> getDataFlow();
    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
    property public abstract kotlinx.coroutines.flow.Flow<T> dataFlow;
  }

  public static interface DataStore.InitializerApi<T> {
    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
  }

  public static interface DataStore.Serializer<T> {
    method public T! getDefaultValue();
    method public T! readFrom(java.io.InputStream input);
    method public void writeTo(T? t, java.io.OutputStream output);
    property public abstract T! defaultValue;
  }

  public final class SingleProcessDataStore<T> implements androidx.datastore.DataStore<T> {
    ctor public SingleProcessDataStore(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile, androidx.datastore.DataStore.Serializer<T> serializer, java.util.List<? extends kotlin.jvm.functions.Function2<? super androidx.datastore.DataStore.InitializerApi<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>> initTasksList, kotlinx.coroutines.CoroutineScope scope);
    method public kotlinx.coroutines.flow.Flow<T> getDataFlow();
    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
    property public kotlinx.coroutines.flow.Flow<T> dataFlow;
  }

}

