// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart=2.9

mixin TestMixin<R, T> {
  Future<T> test(Future<R> fetch) async {
    final response = await fetch;
    T result;
    if (response is Response) {
      result = response.data;
    } else if (response is PagingResponse) {
      result = response.data.data as T;
    } else if (response is T) {
      result = response;
    } else {
      throw Exception('Invalid response type');
    }
    return result;
  }
}

class PagingResponse<T> {
  final PagingResponseData<T> data;

  PagingResponse(this.data);
}

class PagingResponseData<T> {
  final List<T> data;

  PagingResponseData(this.data);
}

class Response<T> {
  final T data;
  Response(this.data);
}

class Class1 with TestMixin<Response<String>, String> {
  _test() {
    final response = Response<String>('test');
    test(Future.value(response));
  }
}

class Class2 with TestMixin<PagingResponse<String>, String> {
  _test() {
    final response = PagingResponse<String>(PagingResponseData(['test']));
    test(Future.value(response));
  }
}

main() {}
