Skip to content

Instantly share code, notes, and snippets.

@rrousselGit
Created November 27, 2019 00:25
Show Gist options
  • Save rrousselGit/c1bfab05eb09cac42281aa879569d8c4 to your computer and use it in GitHub Desktop.
Save rrousselGit/c1bfab05eb09cac42281aa879569d8c4 to your computer and use it in GitHub Desktop.
abstract class Locator {
Resolver<T, Locator> resolve<T>() => Resolver(this);
}
class Resolver<T, L extends Locator> {
Resolver(this._locator);
final L _locator;
}
// TODO: write Locator3 ... Locator50 + their extension
class Locator1<T1> extends Locator {
Locator1(this._first);
final T1 _first;
Resolver<Res, Locator1<T1>> resolve<Res>() => Resolver(this);
}
class Locator2<T1, T2> extends Locator {
Locator2(this._first, this._second);
final T1 _first;
final T2 _second;
@override
Resolver<Res, Locator2<T1, T2>> resolve<Res>() => Resolver(this);
}
extension LocatorAdd on Locator {
Locator1<T1> add<T1>(T1 value()) {
return Locator1(value());
}
}
extension Locator1Add<T1> on Locator1<T1> {
Locator2<T1, T2> add<T2>(T2 value) {
return Locator2(_first, value);
}
}
extension Value1<Res> on Resolver<Res, Locator1<Res>> {
Res get value => _locator._first;
}
extension Value2A<Res> on Resolver<Res, Locator2<Object, Res>> {
Res get value => _locator._second;
}
extension Value2B<Res> on Resolver<Res, Locator2<Res, Object>> {
Res get value => _locator._first;
}
void main() {
final locator = Locator1<int>(42).add<double>(42.0);
String value = locator.resolve<String>().value; // should not compile
int value2 = locator.resolve<int>().value; // resolves to Value2A
double value3 = locator.resolve().value; // resolves to Value2B
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment