library test;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

typedef IntToInt = (core::int) → core::int;
static method a() → (core::int) → core::int {
  return (dynamic x) → dynamic => x;
}
static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
  final asy::Completer<asy::FutureOr<(core::int) → core::int>> :completer = asy::Completer::sync<asy::FutureOr<(core::int) → core::int>>();
  asy::FutureOr<(core::int) → core::int> :return_value;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        :return_value = (dynamic x) → dynamic => x;
        break #L1;
      }
      :completer.complete(:return_value);
      return;
    }
    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
      :completer.completeError(:exception, :stack_trace);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  asy::Future::microtask<dynamic>(:async_op);
  return :completer.future;
}
static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::Iterator<dynamic> :iterator) → core::bool yielding {
    {
      {
        :iterator._current = (dynamic x) → dynamic => x;
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•(:sync_op);
}
static method d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  function :sync_op(core::Iterator<dynamic> :iterator) → core::bool yielding {
    {
      {
        :iterator.isYieldEach = true;
        :iterator._current = <dynamic>[(dynamic x) → dynamic => x];
        [yield] true;
      }
    }
    return false;
  }
  return new core::_SyncIterable::•(:sync_op);
}
static method e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
  dynamic :controller;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try
      try {
        #L2:
        {
          if(:controller.add((dynamic x) → dynamic => x))
            return null;
          else
            [yield] null;
        }
        return;
      }
      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
        :controller.addError(:exception, :stack_trace);
      }
    finally {
      :controller.close();
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•(:async_op);
  return :controller.stream;
}
static method f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
  dynamic :controller;
  dynamic :async_op_then;
  dynamic :async_op_error;
  dynamic :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try
      try {
        #L3:
        {
          if(:controller.addStream(asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x])))
            return null;
          else
            [yield] null;
        }
        return;
      }
      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
        :controller.addError(:exception, :stack_trace);
      }
    finally {
      :controller.close();
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•(:async_op);
  return :controller.stream;
}
static method main() → dynamic {}
