import 'constants_lib.dart' as lib;

const functionTypeLiteral = F1;

const functionTypeLiteralIdentical = identical(
  functionTypeLiteral,
  lib.functionTypeLiteral,
);

const genericFunctionTypeLiteral = F2;

const genericFunctionTypeLiteralIdentical = identical(
  genericFunctionTypeLiteral,
  lib.genericFunctionTypeLiteral,
);

const instance = const lib.Class<int>(0);

const instanceIdentical = identical(instance, lib.instance);

const int Function(int) partialInstantiation = lib.id;

const listConcatenation = <int>[...listLiteral];

const listConcatenationIdentical = identical(
  listConcatenation,
  lib.listConcatenation,
);

const listLiteral = <int>[0];

const listLiteralIdentical = identical(listLiteral, lib.listLiteral);

const mapConcatenation = <int, String>{...mapLiteral};

const mapConcatenationIdentical = identical(
  mapConcatenation,
  lib.mapConcatenation,
);

const mapLiteral = <int, String>{0: 'foo'};

const mapLiteralIdentical = identical(mapLiteral, lib.mapLiteral);

const objectTypeLiteral = Object;

const objectTypeLiteralIdentical = identical(
  objectTypeLiteral,
  lib.objectTypeLiteral,
);

const partialInstantiationIdentical = identical(
  partialInstantiation,
  lib.partialInstantiation,
);

const setConcatenation = <int>{...setLiteral};

const setConcatenationIdentical = identical(
  setConcatenation,
  lib.setConcatenation,
);

const setLiteral = <int>{0};

const setLiteralIdentical = identical(setLiteral, lib.setLiteral);

main() {}

test(expected, actual) {}

typedef F1<T> = T Function(T);

typedef F2 = T Function<T>(T);
