Main.hx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. class Main {
  2. static function main() {
  3. getAnswer().next(v -> switch v {
  4. case 42: 'Perfect!';
  5. case 40, 41, 43, 44: 'Close enough!';
  6. default: new NotError();
  7. }).handle(o -> trace(Std.string(o)));
  8. }
  9. static function getAnswer():Promise<Int>
  10. return 3 + 39;
  11. }
  12. class NotError {
  13. public function new() {}
  14. }
  15. abstract Promise<T>((handler:(result:Outcome<T, NotError>) -> Void) -> Void) {
  16. inline function new(f)
  17. this = f;
  18. public function next<X>(transform:Next<T, X>):Promise<X>
  19. return new Promise(handler -> this(o -> switch o {
  20. case Success(v): transform(v).handle(handler);
  21. case Failure(e): handler(Failure(e));
  22. }));
  23. @:from static function ofOutcome<T>(o:Outcome<T, NotError>):Promise<T>
  24. return new Promise<T>(h -> h(o));
  25. @:from static function ofValue<T>(v:T):Promise<T>
  26. return ofOutcome(Success(v));
  27. @:from static function ofError<T>(e:NotError):Promise<T>
  28. return ofOutcome(Failure(e));
  29. public function handle(cb)
  30. this(cb);
  31. }
  32. @:callable
  33. abstract Next<In, Out>(In->Promise<Out>) from In->Promise<Out> {
  34. @:from(ignoredByInference) static function ofSync<In, Out>(f:In->Out):Next<In, Out>
  35. return v -> (f(v) : Promise<Out>);
  36. }
  37. enum Outcome<T, E> {
  38. Success(data:T);
  39. Failure(error:E);
  40. }