Created
November 27, 2019 00:25
-
-
Save rrousselGit/c1bfab05eb09cac42281aa879569d8c4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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