// Signature format: 4.0
package androidx.paging {

  public final class CachedPagingDataKt {
    method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
  }

  public final class CancelableChannelFlowKt {
  }

  public final class CombinedLoadStates {
    ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
    method public androidx.paging.LoadState getAppend();
    method public androidx.paging.LoadStates? getMediator();
    method public androidx.paging.LoadState getPrepend();
    method public androidx.paging.LoadState getRefresh();
    method public androidx.paging.LoadStates getSource();
    property public final androidx.paging.LoadState append;
    property public final androidx.paging.LoadStates? mediator;
    property public final androidx.paging.LoadState prepend;
    property public final androidx.paging.LoadState refresh;
    property public final androidx.paging.LoadStates source;
  }

  public abstract class DataSource<Key, Value> {
    method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
    method @AnyThread public void invalidate();
    method @WorkerThread public boolean isInvalid();
    method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
    method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
    property @WorkerThread public boolean isInvalid;
  }

  public abstract static class DataSource.Factory<Key, Value> {
    ctor public DataSource.Factory();
    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
    method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
    method public abstract androidx.paging.DataSource<Key,Value> create();
    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
  }

  public static fun interface DataSource.InvalidatedCallback {
    method @AnyThread public void onInvalidated();
  }

  @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
  }

  public final class FlowExtKt {
  }

  public final class HintHandlerKt {
  }

  public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
    ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    method public void invalidate();
    method public androidx.paging.PagingSource<Key,Value> invoke();
  }

  @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
    ctor @Deprecated public ItemKeyedDataSource();
    method @Deprecated public abstract Key getKey(Value item);
    method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
    method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
    method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
  }

  @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
    ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
  }

  @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
    ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
  }

  @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
    ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final Key? requestedInitialKey;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
    ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
    field @Deprecated public final Key key;
    field @Deprecated public final int requestedLoadSize;
  }

  public final class ItemSnapshotList<T> extends kotlin.collections.AbstractList<T> {
    ctor public ItemSnapshotList(@IntRange(from=0) int placeholdersBefore, @IntRange(from=0) int placeholdersAfter, java.util.List<? extends T> items);
    method public T? get(int index);
    method public java.util.List<T> getItems();
    method public int getPlaceholdersAfter();
    method public int getPlaceholdersBefore();
    method public int getSize();
    property public final java.util.List<T> items;
    property public final int placeholdersAfter;
    property public final int placeholdersBefore;
    property public int size;
  }

  public abstract sealed class LoadState {
    method public final boolean getEndOfPaginationReached();
    property public final boolean endOfPaginationReached;
  }

  public static final class LoadState.Error extends androidx.paging.LoadState {
    ctor public LoadState.Error(Throwable error);
    method public Throwable getError();
    property public final Throwable error;
  }

  public static final class LoadState.Loading extends androidx.paging.LoadState {
    field public static final androidx.paging.LoadState.Loading INSTANCE;
  }

  public static final class LoadState.NotLoading extends androidx.paging.LoadState {
    ctor public LoadState.NotLoading(boolean endOfPaginationReached);
  }

  public final class LoadStates {
    ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
    method public androidx.paging.LoadState component1();
    method public androidx.paging.LoadState component2();
    method public androidx.paging.LoadState component3();
    method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
    method public androidx.paging.LoadState getAppend();
    method public androidx.paging.LoadState getPrepend();
    method public androidx.paging.LoadState getRefresh();
    property public final androidx.paging.LoadState append;
    property public final androidx.paging.LoadState prepend;
    property public final androidx.paging.LoadState refresh;
  }

  public enum LoadType {
    enum_constant public static final androidx.paging.LoadType APPEND;
    enum_constant public static final androidx.paging.LoadType PREPEND;
    enum_constant public static final androidx.paging.LoadType REFRESH;
  }

  public final class PageFetcherSnapshotKt {
  }

  @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
    ctor @Deprecated public PageKeyedDataSource();
    method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
    method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
    method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
    method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
  }

  @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
    ctor @Deprecated public PageKeyedDataSource.LoadCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
  }

  @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
    ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
    method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
  }

  @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
    ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
    ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
    field @Deprecated public final Key key;
    field @Deprecated public final int requestedLoadSize;
  }

  @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
    method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
    method @Deprecated public abstract void detach();
    method @Deprecated public T? get(int index);
    method @Deprecated public final androidx.paging.PagedList.Config getConfig();
    method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
    method @Deprecated public abstract Object? getLastKey();
    method @Deprecated public final int getLoadedCount();
    method @Deprecated public final int getPositionOffset();
    method @Deprecated public int getSize();
    method @Deprecated public abstract boolean isDetached();
    method @Deprecated public boolean isImmutable();
    method @Deprecated public final void loadAround(int index);
    method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
    method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
    method @Deprecated public void retry();
    method @Deprecated public final java.util.List<T> snapshot();
    property public final androidx.paging.PagedList.Config config;
    property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
    property public abstract boolean isDetached;
    property public boolean isImmutable;
    property public abstract Object? lastKey;
    property public final int loadedCount;
    property public final int positionOffset;
    property public int size;
  }

  @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
    ctor @Deprecated public PagedList.BoundaryCallback();
    method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
    method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
    method @Deprecated public void onZeroItemsLoaded();
  }

  @Deprecated public static final class PagedList.Builder<Key, Value> {
    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
    ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
    ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
    method @Deprecated public androidx.paging.PagedList<Value> build();
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
    method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
  }

  @Deprecated public abstract static class PagedList.Callback {
    ctor @Deprecated public PagedList.Callback();
    method @Deprecated public abstract void onChanged(int position, int count);
    method @Deprecated public abstract void onInserted(int position, int count);
    method @Deprecated public abstract void onRemoved(int position, int count);
  }

  @Deprecated public static final class PagedList.Config {
    field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
    field @Deprecated public final boolean enablePlaceholders;
    field @Deprecated public final int initialLoadSizeHint;
    field @Deprecated public final int maxSize;
    field @Deprecated public final int pageSize;
    field @Deprecated public final int prefetchDistance;
  }

  @Deprecated public static final class PagedList.Config.Builder {
    ctor @Deprecated public PagedList.Config.Builder();
    method @Deprecated public androidx.paging.PagedList.Config build();
    method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
    method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
  }

  public final class PagedListConfigKt {
    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
  }

  public final class PagedListKt {
    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
  }

  public final class Pager<Key, Value> {
    ctor @androidx.paging.ExperimentalPagingApi public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    ctor public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
    method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
    property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
  }

  public final class PagingConfig {
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize, optional int jumpThreshold);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders);
    ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance);
    ctor public PagingConfig(int pageSize);
    field public static final androidx.paging.PagingConfig.Companion Companion;
    field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
    field public final boolean enablePlaceholders;
    field public final int initialLoadSize;
    field public final int jumpThreshold;
    field public final int maxSize;
    field public final int pageSize;
    field public final int prefetchDistance;
  }

  public static final class PagingConfig.Companion {
  }

  public final class PagingData<T> {
    method public static <T> androidx.paging.PagingData<T> empty();
    method public static <T> androidx.paging.PagingData<T> empty(androidx.paging.LoadStates sourceLoadStates, optional androidx.paging.LoadStates? mediatorLoadStates);
    method public static <T> androidx.paging.PagingData<T> empty(androidx.paging.LoadStates sourceLoadStates);
    method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
    method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data, androidx.paging.LoadStates sourceLoadStates, optional androidx.paging.LoadStates? mediatorLoadStates);
    method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data, androidx.paging.LoadStates sourceLoadStates);
    field public static final androidx.paging.PagingData.Companion Companion;
  }

  public static final class PagingData.Companion {
    method public <T> androidx.paging.PagingData<T> empty();
    method public <T> androidx.paging.PagingData<T> empty(androidx.paging.LoadStates sourceLoadStates, optional androidx.paging.LoadStates? mediatorLoadStates);
    method public <T> androidx.paging.PagingData<T> empty(androidx.paging.LoadStates sourceLoadStates);
    method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
    method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data, androidx.paging.LoadStates sourceLoadStates, optional androidx.paging.LoadStates? mediatorLoadStates);
    method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data, androidx.paging.LoadStates sourceLoadStates);
  }

  public final class PagingDataTransforms {
    method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
    method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
    method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
    method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
    method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
    method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
  }

  public abstract class PagingSource<Key, Value> {
    ctor public PagingSource();
    method public final boolean getInvalid();
    method public boolean getJumpingSupported();
    method public boolean getKeyReuseSupported();
    method public abstract Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
    method public final void invalidate();
    method public abstract suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
    method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
    method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
    property public final boolean invalid;
    property public boolean jumpingSupported;
    property public boolean keyReuseSupported;
  }

  public abstract static sealed class PagingSource.LoadParams<Key> {
    method public abstract Key? getKey();
    method public final int getLoadSize();
    method public final boolean getPlaceholdersEnabled();
    property public abstract Key? key;
    property public final int loadSize;
    property public final boolean placeholdersEnabled;
  }

  public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
    method public Key getKey();
    property public Key key;
  }

  public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
    method public Key getKey();
    property public Key key;
  }

  public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
    ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
    method public Key? getKey();
    property public Key? key;
  }

  public abstract static sealed class PagingSource.LoadResult<Key, Value> {
  }

  public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
    ctor public PagingSource.LoadResult.Error(Throwable throwable);
    method public Throwable component1();
    method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
    method public Throwable getThrowable();
    property public final Throwable throwable;
  }

  public static final class PagingSource.LoadResult.Invalid<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
    ctor public PagingSource.LoadResult.Invalid();
  }

  public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, optional @IntRange(from=androidx.paging.PagingSource.LoadResult.Page.COUNT_UNDEFINED.toLong()) int itemsBefore, optional @IntRange(from=androidx.paging.PagingSource.LoadResult.Page.COUNT_UNDEFINED.toLong()) int itemsAfter);
    ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
    method public java.util.List<Value> component1();
    method public Key? component2();
    method public Key? component3();
    method public int component4();
    method public int component5();
    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=-2147483648L) int itemsBefore, @IntRange(from=-2147483648L) int itemsAfter);
    method public java.util.List<Value> getData();
    method public int getItemsAfter();
    method public int getItemsBefore();
    method public Key? getNextKey();
    method public Key? getPrevKey();
    property public final java.util.List<Value> data;
    property public final int itemsAfter;
    property public final int itemsBefore;
    property public final Key? nextKey;
    property public final Key? prevKey;
    field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
    field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
  }

  public static final class PagingSource.LoadResult.Page.Companion {
  }

  public final class PagingSourceKt {
  }

  public final class PagingState<Key, Value> {
    ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0) int leadingPlaceholderCount);
    method public Value? closestItemToPosition(int anchorPosition);
    method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
    method public Value? firstItemOrNull();
    method public Integer? getAnchorPosition();
    method public androidx.paging.PagingConfig getConfig();
    method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
    method public boolean isEmpty();
    method public Value? lastItemOrNull();
    property public final Integer? anchorPosition;
    property public final androidx.paging.PagingConfig config;
    property public final java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages;
  }

  @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
    ctor @Deprecated public PositionalDataSource();
    method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
    method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
    method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
    method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
    method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
  }

  @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
    ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
  }

  @Deprecated public static class PositionalDataSource.LoadInitialParams {
    ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
    field @Deprecated public final int pageSize;
    field @Deprecated public final boolean placeholdersEnabled;
    field @Deprecated public final int requestedLoadSize;
    field @Deprecated public final int requestedStartPosition;
  }

  @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
    ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
    method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
  }

  @Deprecated public static class PositionalDataSource.LoadRangeParams {
    ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
    field @Deprecated public final int loadSize;
    field @Deprecated public final int startPosition;
  }

  @androidx.paging.ExperimentalPagingApi public abstract class RemoteMediator<Key, Value> {
    ctor public RemoteMediator();
    method public suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
    method public abstract suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
  }

  public enum RemoteMediator.InitializeAction {
    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
    enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
  }

  public abstract static sealed class RemoteMediator.MediatorResult {
  }

  public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
    ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
    method public Throwable getThrowable();
    property public final Throwable throwable;
  }

  public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
    ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
    method public boolean getEndOfPaginationReached();
    property public final boolean endOfPaginationReached;
  }

  public final class RemoteMediatorAccessorKt {
  }

  public final class SeparatorsKt {
  }

  public final class SimpleChannelFlowKt {
  }

  public enum TerminalSeparatorType {
    enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
    enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
  }

}

package androidx.paging.internal {

  public final class ConstantsKt {
  }

}

