library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:async" as asy;
import "dart:_internal" as _in;

import "dart:ffi";

class MyFinalizable extends core::Object implements ffi::Finalizable {
  synthetic constructor •() → self::MyFinalizable
    : super core::Object::•()
    ;
}
static method doSomething() → core::int
  return 3;
static method useFinalizableAsyncStar(ffi::Finalizable finalizable) → asy::Stream<core::int> /* originally async* */ {
  asy::_AsyncStarStreamController<core::int>? :controller;
  dynamic :controller_stream;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
    try
      try {
        #L1:
        {
          final self::MyFinalizable finalizable2 = new self::MyFinalizable::•();
          if([@vm.call-site-attributes.metadata=receiverType:dart.async::_AsyncStarStreamController<dart.core::int>?] :controller.{asy::_AsyncStarStreamController::add}( block {
            final core::int :expressionValueWrappedFinalizable = self::doSomething();
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
          } =>:expressionValueWrappedFinalizable){(core::int) → core::bool})
            return null;
          else
            [yield] null;
          final self::MyFinalizable finalizable3 = new self::MyFinalizable::•();
          [yield] let dynamic #t1 = asy::_awaitHelper( block {
            final asy::Future<core::int> :expressionValueWrappedFinalizable = asy::Future::sync<core::int>(() → core::int => 3);
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
            _in::reachabilityFence(finalizable3);
          } =>:expressionValueWrappedFinalizable, :async_op_then, :async_op_error) in null;
          _in::unsafeCast<core::int>(:result_or_exception);
          final self::MyFinalizable finalizable4 = new self::MyFinalizable::•();
          if(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int} =={core::num::==}{(core::Object) → core::bool} 4) {
            {
              _in::reachabilityFence(finalizable);
              _in::reachabilityFence(finalizable2);
              _in::reachabilityFence(finalizable3);
              _in::reachabilityFence(finalizable4);
              break #L1;
            }
          }
          if([@vm.call-site-attributes.metadata=receiverType:dart.async::_AsyncStarStreamController<dart.core::int>?] :controller.{asy::_AsyncStarStreamController::add}( block {
            final core::int :expressionValueWrappedFinalizable = 5;
            _in::reachabilityFence(finalizable);
            _in::reachabilityFence(finalizable2);
            _in::reachabilityFence(finalizable3);
            _in::reachabilityFence(finalizable4);
          } =>:expressionValueWrappedFinalizable){(core::int) → core::bool})
            return null;
          else
            [yield] null;
          _in::reachabilityFence(finalizable2);
          _in::reachabilityFence(finalizable3);
          _in::reachabilityFence(finalizable4);
          _in::reachabilityFence(finalizable);
        }
        return;
      }
      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
        :controller.{asy::_AsyncStarStreamController::addError}(exception, stack_trace){(core::Object, core::StackTrace) → void};
      }
    finally {
      :controller.{asy::_AsyncStarStreamController::close}(){() → dynamic};
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :controller = new asy::_AsyncStarStreamController::•<core::int>(:async_op);
  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream}{asy::Stream<core::int>};
  return :controller_stream;
}
static method main() → void /* originally async */ {
  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  dynamic :return_value;
  (dynamic) → dynamic :async_op_then;
  (core::Object, core::StackTrace) → dynamic :async_op_error;
  core::int :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op(dynamic :result_or_exception, dynamic :stack_trace) → dynamic yielding 
    try {
      #L2:
      {
        final self::MyFinalizable finalizable = new self::MyFinalizable::•();
        final asy::Stream<core::int> asyncStarResult = self::useFinalizableAsyncStar(finalizable);
        {
          asy::Stream<core::int> :stream = asyncStarResult;
          asy::_StreamIterator<core::int>? :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
          try
            #L3:
            while (true) {
              dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error) in null;
              if(_in::unsafeCast<core::bool>(:result_or_exception)) {
                final core::int element = :for-iterator.{asy::_StreamIterator::current}{core::int};
                {
                  core::print(element);
                }
              }
              else
                break #L3;
            }
          finally
            if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<core::int>?} == null)) {
              [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>}, :async_op_then, :async_op_error) in null;
              :result_or_exception;
            }
        }
        _in::reachabilityFence(finalizable);
      }
      asy::_completeWithNoFutureOnAsyncReturn(:async_future, :return_value, :is_sync);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_op(null, null){() → dynamic};
  :is_sync = true;
  return :async_future;
}
