Skip to content

Instantly share code, notes, and snippets.

@eernstg
Last active December 7, 2023 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eernstg/d528548d5ad0730f1d091ee515fa3397 to your computer and use it in GitHub Desktop.
Save eernstg/d528548d5ad0730f1d091ee515fa3397 to your computer and use it in GitHub Desktop.
import 'dart:async';
typedef Inv<X> = X Function(X);
typedef BetterCompleter<X> = _BetterCompleter<X, Inv<X>>;
extension type _BetterCompleter<X, Invariance extends Inv<X>>
.fromCompleter(Completer<X> _) {
void complete(X value) => _.complete(value);
void completeError(Object error, [StackTrace? stackTrace]) =>
_.completeError(error, stackTrace);
bool get isCompleted => _.isCompleted;
}
void completeCompleter(Completer<Object?> c) {
c.complete(1.5);
}
void completeBetterCompleter(BetterCompleter<Object?> c) {
c.complete(1.5);
}
void completeBetterCompleterWithInt(BetterCompleter<int> c) {
// `c.complete(1.5)` is a compile-time error.
c.complete(1);
}
void main() {
final objectCompleter = Completer<Object?>();
final intCompleter = Completer<int>();
final betterObjectCompleter = BetterCompleter.fromCompleter(objectCompleter);
final betterIntCompleter = BetterCompleter.fromCompleter(intCompleter);
completeBetterCompleter(betterObjectCompleter); // OK.
// completeBetterCompleter(betterIntCompleter); // Compile-time error.
completeBetterCompleterWithInt(betterIntCompleter); // OK.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment